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

Subversion Repositories or1k

[/] [or1k/] [tags/] [nog_patch_42/] [or1ksim/] [cpu/] [common/] [abstract.c] - Blame information for rev 532

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 cvs
/* abstract.c -- Abstract entities
2
   Copyright (C) 1999 Damjan Lampret, lampret@opencores.org
3
 
4
This file is part of OpenRISC 1000 Architectural Simulator.
5
 
6
This program is free software; you can redistribute it and/or modify
7
it under the terms of the GNU General Public License as published by
8
the Free Software Foundation; either version 2 of the License, or
9
(at your option) any later version.
10
 
11
This program is distributed in the hope that it will be useful,
12
but WITHOUT ANY WARRANTY; without even the implied warranty of
13
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14
GNU General Public License for more details.
15
 
16
You should have received a copy of the GNU General Public License
17
along with this program; if not, write to the Free Software
18
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
19
 
20 66 lampret
/* Abstract memory and routines that go with this. I need to
21 2 cvs
add all sorts of other abstract entities. Currently we have
22
only memory. */
23
 
24 221 markom
#include <stdlib.h>
25 2 cvs
#include <stdio.h>
26
#include <ctype.h>
27
#include <string.h>
28
 
29 6 lampret
#include "config.h"
30 7 jrydberg
#include "sim-config.h"
31 6 lampret
 
32 2 cvs
#include "parse.h"
33
#include "abstract.h"
34 261 markom
#include "labels.h"
35 2 cvs
#include "arch.h"
36
#include "execute.h"
37 32 lampret
#include "sprs.h"
38 35 lampret
#include "stats.h"
39 32 lampret
#include "except.h"
40 123 markom
#include "debug_unit.h"
41 134 markom
#include "opcode/or32.h"
42 2 cvs
 
43
extern unsigned long reg[];
44 138 markom
extern char *disassembled;
45 2 cvs
 
46 28 lampret
/* This is an abstract+physical memory array rather than only physical
47
   memory array */
48 221 markom
static struct mem_entry *simmem;
49 2 cvs
 
50 30 lampret
/* Pointer to memory area descriptions that are assigned to individual
51
   peripheral devices. */
52
struct dev_memarea *dev_list;
53
 
54 221 markom
/* Temporary variable to increase speed.  */
55
struct dev_memarea *cur_area;
56
 
57 525 simons
/* Virtual address of current access. */
58
unsigned long cur_vadd;
59
 
60 349 simons
/* It returns physical address. */
61 430 markom
inline unsigned long translate_vrt_to_phy_add(unsigned long virtaddr, int write_access)
62 77 lampret
{
63 429 markom
  if (config.ic.tagtype == CT_NONE)
64 239 markom
    return virtaddr;
65
  else
66 429 markom
    if (config.ic.tagtype == CT_VIRTUAL) {
67 430 markom
      return immu_translate(virtaddr, write_access);
68 239 markom
    }
69 429 markom
    else if (config.dc.tagtype == CT_PHYSICAL) {
70 430 markom
      unsigned long phyaddr = immu_translate(virtaddr, write_access);
71 239 markom
      return phyaddr;
72
    }
73
    else {
74
      printf("INTERNAL ERROR: Unknown insn cache type.\n");
75
      cont_run = 0;
76
    }
77 221 markom
 
78 239 markom
  return -1;
79 77 lampret
}
80
 
81 349 simons
/* Calls IMMU translation routines before simulating insn
82
cache for virtually indexed insn cache or after simulating insn cache
83
for physically indexed insn cache. It returns physical address. */
84
 
85
unsigned long simulate_ic_mmu_fetch(unsigned long virtaddr)
86
{
87
 
88
  unsigned long phyaddr;
89
 
90 430 markom
  if ((phyaddr = translate_vrt_to_phy_add(virtaddr, 0)) != -1) {
91 349 simons
    ic_simulate_fetch(phyaddr);
92
    return phyaddr;
93
  }
94
  else {
95
    printf("INTERNAL ERROR: Unknown insn cache type.\n");
96
    cont_run = 0;
97
  }
98
  return -1;
99
}
100
 
101 77 lampret
/* Calls DMMU translation routines (load cycles) before simulating data
102 239 markom
   cache for virtually indexed data cache or after simulating data cache
103
   for physically indexed data cache. It returns physical address. */
104 6 lampret
 
105
unsigned long simulate_dc_mmu_load(unsigned long virtaddr)
106
{
107 429 markom
  if (config.dc.tagtype == CT_NONE)
108 239 markom
    return virtaddr;
109
  else
110 429 markom
  if (config.dc.tagtype == CT_VIRTUAL) {
111 327 lampret
    dc_simulate_read(virtaddr);
112 430 markom
    return dmmu_translate(virtaddr, 0);
113 239 markom
  }
114 429 markom
  else if (config.dc.tagtype == CT_PHYSICAL) {
115 430 markom
    unsigned long phyaddr = dmmu_translate(virtaddr, 0);
116 327 lampret
    dc_simulate_read(phyaddr);
117 239 markom
    return phyaddr;
118
  }
119
  else {
120 327 lampret
    printf("INTERNAL ERROR: Unknown data cache type.\n");
121 239 markom
    cont_run = 0;
122
  }
123 221 markom
 
124 239 markom
  return -1;
125 6 lampret
}
126
 
127 77 lampret
/* Calls DMMU translation routines (store cycles) before simulating data
128 6 lampret
cache for virtually indexed data cache or after simulating data cache
129
for physically indexed data cache. It returns physical address. */
130
 
131
unsigned long simulate_dc_mmu_store(unsigned long virtaddr)
132
{
133 429 markom
  if (config.dc.tagtype == CT_NONE)
134 239 markom
    return virtaddr;
135
  else
136 429 markom
  if (config.dc.tagtype == CT_VIRTUAL) {
137 239 markom
    dc_simulate_write(virtaddr);
138 430 markom
    return dmmu_translate(virtaddr, 1);
139 239 markom
  }
140 429 markom
  else if (config.dc.tagtype == CT_PHYSICAL) {
141 430 markom
    unsigned long phyaddr = dmmu_translate(virtaddr, 1);
142 239 markom
    dc_simulate_write(phyaddr);
143
    return phyaddr;
144
  }
145
  else {
146
    printf("INTERNAL ERROR: Unknown data cache type.\n");
147
    cont_run = 0;
148
  }
149 221 markom
 
150 239 markom
  return -1;
151 6 lampret
}
152
 
153 261 markom
/* Calculates bit mask to fit the data */
154
unsigned long bit_mask (unsigned long data) {
155
  int i = 0;
156
  data--;
157 382 markom
  while (data >> i)
158 261 markom
    data |= 1 << i++;
159
  return data;
160
}
161
 
162
/* Register read and write function for a memory area.
163
   addr is inside the area, if addr & addr_mask == addr_compare
164
   (used also by peripheral devices like 16450 UART etc.) */
165
void register_memoryarea_mask(unsigned long addr_mask, unsigned long addr_compare,
166
                         unsigned long size, unsigned granularity,
167 239 markom
                         unsigned long (readfunc)(unsigned long),
168 261 markom
                         void (writefunc)(unsigned long, unsigned long))
169 30 lampret
{
170 239 markom
  struct dev_memarea **pptmp;
171 261 markom
  unsigned long size_mask = bit_mask (size);
172
  int found_error = 0;
173
  addr_compare &= addr_mask;
174 221 markom
 
175 382 markom
  debug(5, "addr & %08x == %08x to %08x, size %08x, gran %iB\n", addr_mask, addr_compare, addr_compare | bit_mask (size), size, granularity);
176 239 markom
  /* Go to the end of the list. */
177 261 markom
  for(pptmp = &dev_list; *pptmp; pptmp = &(*pptmp)->next)
178
    if ((addr_compare >= (*pptmp)->addr_compare) && (addr_compare < (*pptmp)->addr_compare + (*pptmp)->size)
179
     || (addr_compare + size > (*pptmp)->addr_compare) && (addr_compare < (*pptmp)->addr_compare + (*pptmp)->size)) {
180 262 markom
      if (!found_error) {
181 261 markom
        fprintf (stderr, "ERROR: Overlapping memory area(s):\n");
182 262 markom
        fprintf (stderr, "\taddr & %08x == %08x to %08x, size %08x, gran %iB\n", addr_mask, addr_compare, addr_compare | bit_mask (size), size, granularity);
183
      }
184 261 markom
      found_error = 1;
185 424 markom
      fprintf (stderr, "and\taddr & %08x == %08x to %08x, size %08x, gran %iB\n", (*pptmp)->addr_mask, (*pptmp)->addr_compare,
186 261 markom
        (*pptmp)->addr_compare | (*pptmp)->size_mask, (*pptmp)->size, (*pptmp)->granularity);
187
    }
188
 
189
  if (found_error)
190
    exit (-1);
191
 
192 239 markom
  cur_area = *pptmp = (struct dev_memarea *)malloc(sizeof(struct dev_memarea));
193 261 markom
  (*pptmp)->addr_mask = addr_mask;
194
  (*pptmp)->addr_compare = addr_compare;
195 239 markom
  (*pptmp)->size = size;
196 261 markom
  (*pptmp)->size_mask = size_mask;
197 239 markom
  (*pptmp)->granularity = granularity;
198
  (*pptmp)->readfunc = readfunc;
199
  (*pptmp)->writefunc = writefunc;
200 479 markom
  (*pptmp)->log = 0;
201 239 markom
  (*pptmp)->next = NULL;
202 261 markom
}
203 221 markom
 
204 261 markom
/* Register read and write function for a memory area.
205
   Memory areas should be aligned. Memory area is rounded up to
206
   fit the nearest 2^n aligment.
207
   (used also by peripheral devices like 16450 UART etc.) */
208
void register_memoryarea(unsigned long addr,
209
                         unsigned long size, unsigned granularity,
210
                         unsigned long (readfunc)(unsigned long),
211
                         void (writefunc)(unsigned long, unsigned long))
212
{
213
  unsigned long size_mask = bit_mask (size);
214
  unsigned long addr_mask = ~size_mask;
215
  register_memoryarea_mask (addr_mask, addr & addr_mask,
216
                      size_mask + 1, granularity,
217
                      readfunc, writefunc);
218 30 lampret
}
219
 
220 261 markom
 
221 30 lampret
/* Check if access is to registered area of memory. */
222
struct dev_memarea *verify_memoryarea(unsigned long addr)
223
{
224 239 markom
  struct dev_memarea *ptmp;
225 221 markom
 
226 239 markom
  /* Check list of registered devices. */
227
  for(ptmp = dev_list; ptmp; ptmp = ptmp->next)
228 261 markom
    if ((addr & ptmp->addr_mask) == ptmp->addr_compare)
229 239 markom
      return cur_area = ptmp;
230
  return cur_area = NULL;
231 30 lampret
}
232
 
233 2 cvs
/* Returns 32-bit values from mem array. Big endian version. */
234 349 simons
unsigned long read_mem(unsigned long memaddr,int* breakpoint)
235
{
236
  unsigned long temp;
237
  struct dev_memarea *dev;
238
 
239 525 simons
  cur_vadd = memaddr;
240 349 simons
  if (DEBUG_ENABLED)
241
    *breakpoint += CheckDebugUnit(DebugLoadAddress,memaddr); /* 28/05/01 CZ */
242
  temp = evalsim_mem32(memaddr);
243
  if (DEBUG_ENABLED)
244
    *breakpoint += CheckDebugUnit(DebugLoadData,temp);  /* MM170901 */
245
  return temp;
246
}
247
 
248
/* Returns 32-bit values from mem array. Big endian version. */
249 123 markom
unsigned long eval_mem32(unsigned long memaddr,int* breakpoint)
250 2 cvs
{
251 6 lampret
 
252 239 markom
  unsigned long temp;
253
  struct dev_memarea *dev;
254 123 markom
 
255 525 simons
  cur_vadd = memaddr;
256 239 markom
  memaddr = simulate_dc_mmu_load(memaddr);
257 458 simons
  if (pending.valid)
258
    return 0;
259 270 markom
  if (DEBUG_ENABLED)
260
    *breakpoint += CheckDebugUnit(DebugLoadAddress,memaddr); /* 28/05/01 CZ */
261 239 markom
  temp = evalsim_mem32(memaddr);
262 270 markom
  if (DEBUG_ENABLED)
263
    *breakpoint += CheckDebugUnit(DebugLoadData,temp);  /* MM170901 */
264 239 markom
  return temp;
265 66 lampret
}
266
 
267 349 simons
/* Returns 32-bit values from mem array. Big endian version. */
268
unsigned long eval_insn(unsigned long memaddr,int* breakpoint)
269
{
270
 
271
  unsigned long temp;
272
  struct dev_memarea *dev;
273
 
274 532 markom
//  memaddr = simulate_ic_mmu_fetch(memaddr);
275 525 simons
  cur_vadd = pc;
276 416 simons
  ic_simulate_fetch(memaddr);
277 349 simons
  if (DEBUG_ENABLED)
278
    *breakpoint += CheckDebugUnit(DebugLoadAddress,memaddr); /* 28/05/01 CZ */
279
  temp = evalsim_mem32(memaddr);
280
  if (DEBUG_ENABLED)
281
    *breakpoint += CheckDebugUnit(DebugLoadData,temp);  /* MM170901 */
282
  return temp;
283
}
284
 
285 221 markom
unsigned long evalsim_mem32(unsigned long memaddr)
286 66 lampret
{
287 239 markom
  unsigned long temp;
288 221 markom
 
289 239 markom
  if (verify_memoryarea(memaddr)) {
290
    switch(cur_area->granularity) {
291
    case 1:
292
      temp = cur_area->readfunc(memaddr) << 24;
293
      temp |= cur_area->readfunc(memaddr + 1) << 16;
294
      temp |= cur_area->readfunc(memaddr + 2) << 8;
295
      temp |= cur_area->readfunc(memaddr + 3);
296
      break;
297
    case 2:
298
      temp = cur_area->readfunc(memaddr) << 16;
299
      temp |= cur_area->readfunc(memaddr + 2);
300
      break;
301
    case 4:
302
      temp = cur_area->readfunc(memaddr);
303
      break;
304 426 markom
    }
305
    if (cur_area->log)
306
      fprintf (cur_area->log, "[%08x] -> read %08x\n", memaddr, temp);
307 239 markom
  } else {
308
    printf("EXCEPTION: read out of memory (32-bit access to %.8lx)\n", memaddr);
309 525 simons
    except_handle(EXCEPT_BUSERR, cur_vadd);
310 239 markom
    temp = 0;
311
  }
312
  return temp;
313 2 cvs
}
314
 
315
/* Returns 16-bit values from mem array. Big endian version. */
316
 
317 123 markom
unsigned short eval_mem16(unsigned long memaddr,int* breakpoint)
318 2 cvs
{
319 239 markom
  unsigned short temp;
320 525 simons
  cur_vadd = memaddr;
321 239 markom
  memaddr = simulate_dc_mmu_load(memaddr);
322 458 simons
  if (pending.valid)
323
    return 0;
324 270 markom
  if (DEBUG_ENABLED)
325
    *breakpoint += CheckDebugUnit(DebugLoadAddress,memaddr); /* 28/05/01 CZ */
326 66 lampret
 
327 239 markom
  temp = evalsim_mem16(memaddr);
328 270 markom
  if (DEBUG_ENABLED)
329
    *breakpoint += CheckDebugUnit(DebugLoadData,temp);  /* MM170901 */
330 239 markom
  return temp;
331 66 lampret
}
332
 
333 221 markom
unsigned short evalsim_mem16(unsigned long memaddr)
334 66 lampret
{
335 239 markom
  unsigned short temp;
336 221 markom
 
337 239 markom
  if (verify_memoryarea(memaddr)) {
338
    switch(cur_area->granularity) {
339
    case 1:
340
      temp = cur_area->readfunc(memaddr) << 8;
341
      temp |= cur_area->readfunc(memaddr + 1);
342
      break;
343
    case 2:
344
      temp = cur_area->readfunc(memaddr);
345
      break;
346
    case 4:
347
      printf("EXCEPTION: read 16-bit value from 32-bit region (address 0x%08lX)\n", cur_area->granularity * 8, memaddr);
348
      cont_run = 0;
349
      break;
350
    }
351 426 markom
    if (cur_area->log)
352
      fprintf (cur_area->log, "[%08x] -> read %08x\n", memaddr, temp);
353 239 markom
  } else {
354
    printf("EXCEPTION: read out of memory (16-bit access to %.8lx)\n", memaddr);
355 525 simons
    except_handle(EXCEPT_BUSERR, cur_vadd);
356 239 markom
    temp = 0;
357
  }
358
  return temp;
359 2 cvs
}
360
 
361
 
362 6 lampret
/* Returns 8-bit values from mem array. */
363 2 cvs
 
364 123 markom
unsigned char eval_mem8(unsigned long memaddr,int* breakpoint)
365 221 markom
{
366 239 markom
  unsigned char temp;
367 525 simons
  cur_vadd = memaddr;
368 239 markom
  memaddr = simulate_dc_mmu_load(memaddr);
369 458 simons
  if (pending.valid)
370
    return 0;
371 270 markom
  if (DEBUG_ENABLED)
372
    *breakpoint += CheckDebugUnit(DebugLoadAddress,memaddr);  /* 28/05/01 CZ */
373 6 lampret
 
374 239 markom
  temp = evalsim_mem8(memaddr);
375 270 markom
  if (DEBUG_ENABLED)
376
    *breakpoint += CheckDebugUnit(DebugLoadData,temp);  /* MM170901 */
377 239 markom
  return temp;
378 66 lampret
}
379
 
380 221 markom
unsigned char evalsim_mem8(unsigned long memaddr)
381
{
382 239 markom
  unsigned char temp;
383 123 markom
 
384 239 markom
  if (verify_memoryarea(memaddr)) {
385
    switch(cur_area->granularity) {
386
    case 1:
387
      temp = cur_area->readfunc(memaddr);
388
      break;
389
    case 2:
390
    case 4:
391
      printf("EXCEPTION: read 8-bit value from %u-bit region (address 0x%08lX)\n", cur_area->granularity * 8, memaddr);
392
      cont_run = 0;
393
      break;
394
    }
395 426 markom
    if (cur_area->log)
396
      fprintf (cur_area->log, "[%08x] -> read %08x\n", memaddr, temp);
397 239 markom
  } else {
398
    printf("EXCEPTION: read out of memory (8-bit access to %.8lx)\n", memaddr);
399 525 simons
    except_handle(EXCEPT_BUSERR, cur_vadd);
400 239 markom
    temp = 0;
401
  }
402
  return temp;
403 2 cvs
}
404
 
405
/* Set mem, 32-bit. Big endian version. */
406
 
407 123 markom
void set_mem32(unsigned long memaddr, unsigned long value,int* breakpoint)
408 2 cvs
{
409 525 simons
  cur_vadd = memaddr;
410 239 markom
  memaddr = simulate_dc_mmu_store(memaddr);
411 221 markom
 
412 437 simons
  /* If we produced exception don't set anything */
413
  if (pending.valid == 1)
414
    return;
415
 
416 270 markom
  if (DEBUG_ENABLED) {
417
    *breakpoint += CheckDebugUnit(DebugStoreAddress,memaddr);  /* 28/05/01 CZ */
418
    *breakpoint += CheckDebugUnit(DebugStoreData,value);
419
  }
420 123 markom
 
421 239 markom
  setsim_mem32(memaddr, value);
422 66 lampret
}
423
 
424
void setsim_mem32(unsigned long memaddr, unsigned long value)
425
{
426 239 markom
  struct dev_memarea *dev;
427 66 lampret
 
428 239 markom
  if (verify_memoryarea(memaddr)) {
429 426 markom
    if (cur_area->log)
430
      fprintf (cur_area->log, "[%08x] -> write %08x\n", memaddr, value);
431 239 markom
    switch(cur_area->granularity) {
432
    case 1:
433 251 erez
      cur_area->writefunc(memaddr    , (value >> 24) & 0xFF);
434 239 markom
      cur_area->writefunc(memaddr + 1, (value >> 16) & 0xFF);
435 251 erez
      cur_area->writefunc(memaddr + 2, (value >>  8) & 0xFF);
436
      cur_area->writefunc(memaddr + 3, (value      ) & 0xFF);
437 239 markom
      break;
438
    case 2:
439
      cur_area->writefunc(memaddr, (value >> 16) & 0xFFFF);
440
      cur_area->writefunc(memaddr + 2, value & 0xFFFF);
441
      break;
442
    case 4:
443
      cur_area->writefunc(memaddr, value);
444
      break;
445 242 markom
    }
446 239 markom
  } else {
447
    printf("EXCEPTION: write out of memory (32-bit access to %.8lx)\n", memaddr);
448 525 simons
    except_handle(EXCEPT_BUSERR, cur_vadd);
449 239 markom
  }
450 2 cvs
}
451
 
452
/* Set mem, 16-bit. Big endian version. */
453
 
454 123 markom
void set_mem16(unsigned long memaddr, unsigned short value,int* breakpoint)
455 2 cvs
{
456 525 simons
  cur_vadd = memaddr;
457 239 markom
  memaddr = simulate_dc_mmu_store(memaddr);
458 221 markom
 
459 437 simons
  /* If we produced exception don't set anything */
460
  if (pending.valid == 1)
461
    return;
462
 
463 270 markom
  if (DEBUG_ENABLED) {
464
    *breakpoint += CheckDebugUnit(DebugStoreAddress,memaddr);  /* 28/05/01 CZ */
465
    *breakpoint += CheckDebugUnit(DebugStoreData,value);
466
  }
467 123 markom
 
468 239 markom
  setsim_mem16(memaddr, value);
469 66 lampret
}
470
 
471
void setsim_mem16(unsigned long memaddr, unsigned short value)
472
{
473 239 markom
  if (verify_memoryarea(memaddr)) {
474 426 markom
    if (cur_area->log)
475
      fprintf (cur_area->log, "[%08x] -> write %08x\n", memaddr, value);
476 239 markom
    switch(cur_area->granularity) {
477
    case 1:
478
      cur_area->writefunc(memaddr, (value >> 8) & 0xFF);
479
      cur_area->writefunc(memaddr + 1, value & 0xFF);
480
      break;
481
    case 2:
482 251 erez
      cur_area->writefunc(memaddr, value & 0xFFFF);
483 239 markom
      break;
484
    case 4:
485
      printf("EXCEPTION: write 16-bit value to 32-bit region (address 0x%08lX)\n", memaddr);
486
      cont_run = 0;
487
      break;
488
    }
489
  } else {
490
    printf("EXCEPTION: write out of memory (16-bit access to %.8lx)\n", memaddr);
491 525 simons
    except_handle(EXCEPT_BUSERR, cur_vadd);
492 239 markom
  }
493 2 cvs
}
494
 
495 6 lampret
/* Set mem, 8-bit. */
496 2 cvs
 
497 123 markom
void set_mem8(unsigned long memaddr, unsigned char value,int* breakpoint)
498 2 cvs
{
499 525 simons
  cur_vadd = memaddr;
500 239 markom
  memaddr = simulate_dc_mmu_store(memaddr);
501 221 markom
 
502 437 simons
  /* If we produced exception don't set anything */
503
  if (pending.valid == 1)
504
    return;
505
 
506 270 markom
  if (DEBUG_ENABLED) {
507
    *breakpoint += CheckDebugUnit(DebugStoreAddress,memaddr);  /* 28/05/01 CZ */
508
    *breakpoint += CheckDebugUnit(DebugStoreData,value);
509
  }
510 123 markom
 
511 239 markom
  setsim_mem8(memaddr, value);
512 66 lampret
}
513
 
514
void setsim_mem8(unsigned long memaddr, unsigned char value)
515
{
516 239 markom
  if (verify_memoryarea(memaddr)) {
517 426 markom
    if (cur_area->log)
518
      fprintf (cur_area->log, "[%08x] -> write %08x\n", memaddr, value);
519 239 markom
    if (cur_area->granularity == 1)
520
      cur_area->writefunc(memaddr, value);
521
    else {
522
      printf("EXCEPTION: write 8-bit value to %u-bit region (address 0x%08lX)\n", cur_area->granularity * 8, memaddr);
523
      cont_run = 0;
524
    }
525
  } else {
526
    printf("EXCEPTION: write out of memory (8-bit access to %.8lx)\n", memaddr);
527 525 simons
    except_handle(EXCEPT_BUSERR, cur_vadd);
528 239 markom
  }
529 2 cvs
}
530 30 lampret
 
531 361 markom
void dumpmemory(unsigned int from, unsigned int to, int disasm, int nl)
532
{
533
  unsigned int i, j;
534
  struct label_entry *tmp;
535
  int breakpoint = 0;
536
  int ilen = disasm ? 4 : 16;
537
 
538
  for(i = from; i < to; i += ilen) {
539
    printf("%.8x: ", i);
540
    for (j = 0; j < ilen;) {
541
      int data = -1;
542
      if (!disasm) {
543
        tmp = NULL;
544
        if (verify_memoryarea(i+j)) {
545
          struct label_entry *entry;
546
          entry = get_label(i + j);
547
          if (entry)
548
            printf("(%s)", entry->name);
549
          printf("%02x ", data = evalsim_mem8(i+j));
550
        } else printf("XX ");
551
        j++;
552
      } else {
553
        int breakpoint;
554
        unsigned int _insn = read_mem(i, &breakpoint);
555
        int index = insn_decode (_insn);
556
        int len = insn_len (index);
557
 
558
        tmp = NULL;
559
        if (verify_memoryarea(i+j)) {
560
          struct label_entry *entry;
561
          entry = get_label(i + j);
562
          if (entry)
563
            printf("(%s)", entry->name);
564
 
565
          printf(": %08x ", (unsigned long)_insn);
566
          if (index >= 0) {
567
            disassemble_insn (_insn);
568
            printf(" %s", disassembled);
569
          } else
570
            printf("<invalid>");
571
        } else printf("XXXXXXXX");
572
        j += len;
573
      }
574
    }
575
    if (nl)
576
      printf ("\n");
577
  }
578
}
579
 
580
 
581 235 erez
unsigned long simmem_read_byte(unsigned long addr) {
582 297 markom
  return simmem[cur_area->misc + (addr & cur_area->size_mask)].data;
583 221 markom
}
584
 
585 235 erez
void simmem_write_byte(unsigned long addr, unsigned long value) {
586 297 markom
  simmem[cur_area->misc + (addr & cur_area->size_mask)].data = (unsigned char)value;
587 221 markom
}
588
 
589 424 markom
unsigned long simmem_read_zero(unsigned long addr) {
590
  if (config.sim.verbose)
591
    fprintf (stderr, "WARNING: memory read from non-read memory area 0x%08x.\n", addr);
592
  return 0;
593
}
594
 
595
void simmem_write_null(unsigned long addr, unsigned long value) {
596
  if (config.sim.verbose)
597
    fprintf (stderr, "WARNING: memory write to 0x%08x, non-write memory area (value 0x%08x).\n", addr, value);
598
}
599
 
600
/* Initialize memory table from a config struct */
601
 
602
void init_memory_table ()
603 221 markom
{
604 239 markom
  unsigned long memory_needed = 0;
605 426 markom
 
606 424 markom
  /* If nothing was defined, use default memory block */
607
  if (config.memory.nmemories) {
608
    int i;
609
    for (i = 0; i < config.memory.nmemories; i++) {
610
      unsigned long start = config.memory.table[i].baseaddr;
611
      unsigned long length = config.memory.table[i].size;
612
      char *type = config.memory.table[i].name;
613
      int rd = config.memory.table[i].delayr;
614
      int wd = config.memory.table[i].delayw;
615
      int ce = config.memory.table[i].ce;
616
      if (config.sim.verbose)
617
        debug (1, "%08X %08X (%i KB): %s (activated by CE%i; read delay = %icyc, write delay = %icyc)\n",
618
          start, length, length >> 10, type, ce, rd, wd);
619 261 markom
      register_memoryarea(start, length, 1, &simmem_read_byte, &simmem_write_byte);
620 239 markom
      cur_area->misc = memory_needed;
621 424 markom
      cur_area->delayw = wd;
622
      cur_area->delayr = rd;
623 426 markom
      if (config.memory.table[i].log[0] != '\0') {
624
        if ((cur_area->log = fopen (config.memory.table[i].log, "wt+")) == NULL)
625
          fprintf (stderr, "WARNING: Cannot open '%s'.\n", config.memory.table[i].log);
626
      } else
627
        cur_area->log = 0;
628 261 markom
      memory_needed += cur_area->size;
629 239 markom
    }
630
    printf ("\n");
631
  } else {
632 308 markom
    if (config.sim.verbose)
633 424 markom
      fprintf (stderr, "WARNING: Memory not defined, assuming standard configuration.\n");
634 261 markom
    register_memoryarea(DEFAULT_MEMORY_START, DEFAULT_MEMORY_LEN, 1, &simmem_read_byte, &simmem_write_byte);
635
    memory_needed += cur_area->size;
636 239 markom
  }
637 424 markom
 
638 239 markom
  simmem = (struct mem_entry *) malloc (sizeof (struct mem_entry) * memory_needed);
639
  if (!simmem) {
640
    fprintf (stderr, "Failed to allocate sim memory. Aborting\n");
641
    exit (-1);
642
  }
643 221 markom
}
644 424 markom
 
645
/* Changes read/write memory in read/write only */
646
 
647
void lock_memory_table ()
648
{
649
  struct dev_memarea *ptmp;
650
 
651
  /* Check list of registered devices. */
652
  for(ptmp = dev_list; ptmp; ptmp = ptmp->next) {
653
    if (ptmp->delayr < 0 && ptmp->readfunc == &simmem_read_byte)
654
      ptmp->readfunc = &simmem_read_zero;
655
    if (ptmp->delayw < 0 && ptmp->writefunc == &simmem_write_byte)
656
      ptmp->writefunc = &simmem_write_null;
657
  }
658
}
659 426 markom
 
660
/* Closes files, etc. */
661
 
662
void done_memory_table ()
663
{
664
  struct dev_memarea *ptmp;
665
 
666
  /* Check list of registered devices. */
667
  for(ptmp = dev_list; ptmp; ptmp = ptmp->next) {
668
    if (ptmp->log)
669
      fclose (ptmp->log);
670
  }
671
}
672 427 markom
 
673
/* Displays current memory configuration */
674
 
675
void memory_table_status ()
676
{
677
  struct dev_memarea *ptmp;
678
 
679
  /* Check list of registered devices. */
680
  for(ptmp = dev_list; ptmp; ptmp = ptmp->next) {
681
    printf ("addr & %08x == %08x to %08x, size %08x, gran %iB\n",
682
      ptmp->addr_mask, ptmp->addr_compare, ptmp->addr_compare | bit_mask (ptmp->size),
683
      ptmp->size, ptmp->granularity);
684
    printf ("\t");
685
    if (ptmp->delayr >= 0)
686
      printf ("read delay = %i cycles, ", ptmp->delayr);
687
    else
688
      printf ("reads not possible, ");
689
 
690
    if (ptmp->delayw >= 0)
691
      printf ("write delay = %i cycles", ptmp->delayw);
692
    else
693
      printf ("writes not possible");
694
 
695
    if (ptmp->log)
696
      printf (", (logged)\n");
697
    else
698
      printf ("\n");
699
  }
700
}
701 433 markom
 
702
/* Outputs time in pretty form to dest string */
703
 
704
void generate_time_pretty (char *dest, long time_ps)
705
{
706
  int exp3 = 0;
707
  if (time_ps) {
708
    while ((time_ps % 1000) == 0) {
709
      time_ps /= 1000;
710
      exp3++;
711
    }
712
  }
713
  sprintf (dest, "%i%cs", time_ps, "pnum"[exp3]);
714
}

powered by: WebSVN 2.1.0

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