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

Subversion Repositories or1k

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

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 547 markom
#include "support/profile.h"
43 2 cvs
 
44
extern unsigned long reg[];
45 138 markom
extern char *disassembled;
46 2 cvs
 
47 28 lampret
/* This is an abstract+physical memory array rather than only physical
48
   memory array */
49 538 markom
static unsigned long *simmem32;
50 2 cvs
 
51 30 lampret
/* Pointer to memory area descriptions that are assigned to individual
52
   peripheral devices. */
53
struct dev_memarea *dev_list;
54
 
55 221 markom
/* Temporary variable to increase speed.  */
56
struct dev_memarea *cur_area;
57
 
58 638 simons
/* These are set by mmu if cache inhibit bit is set for current acces.  */
59
int data_ci, insn_ci;
60
 
61 525 simons
/* Virtual address of current access. */
62
unsigned long cur_vadd;
63
 
64 261 markom
/* Calculates bit mask to fit the data */
65
unsigned long bit_mask (unsigned long data) {
66
  int i = 0;
67
  data--;
68 382 markom
  while (data >> i)
69 261 markom
    data |= 1 << i++;
70
  return data;
71
}
72
 
73
/* Register read and write function for a memory area.
74
   addr is inside the area, if addr & addr_mask == addr_compare
75
   (used also by peripheral devices like 16450 UART etc.) */
76
void register_memoryarea_mask(unsigned long addr_mask, unsigned long addr_compare,
77
                         unsigned long size, unsigned granularity,
78 239 markom
                         unsigned long (readfunc)(unsigned long),
79 261 markom
                         void (writefunc)(unsigned long, unsigned long))
80 30 lampret
{
81 239 markom
  struct dev_memarea **pptmp;
82 261 markom
  unsigned long size_mask = bit_mask (size);
83
  int found_error = 0;
84
  addr_compare &= addr_mask;
85 221 markom
 
86 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);
87 239 markom
  /* Go to the end of the list. */
88 261 markom
  for(pptmp = &dev_list; *pptmp; pptmp = &(*pptmp)->next)
89
    if ((addr_compare >= (*pptmp)->addr_compare) && (addr_compare < (*pptmp)->addr_compare + (*pptmp)->size)
90
     || (addr_compare + size > (*pptmp)->addr_compare) && (addr_compare < (*pptmp)->addr_compare + (*pptmp)->size)) {
91 262 markom
      if (!found_error) {
92 261 markom
        fprintf (stderr, "ERROR: Overlapping memory area(s):\n");
93 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);
94
      }
95 261 markom
      found_error = 1;
96 424 markom
      fprintf (stderr, "and\taddr & %08x == %08x to %08x, size %08x, gran %iB\n", (*pptmp)->addr_mask, (*pptmp)->addr_compare,
97 261 markom
        (*pptmp)->addr_compare | (*pptmp)->size_mask, (*pptmp)->size, (*pptmp)->granularity);
98
    }
99
 
100
  if (found_error)
101
    exit (-1);
102 537 markom
 
103 239 markom
  cur_area = *pptmp = (struct dev_memarea *)malloc(sizeof(struct dev_memarea));
104 261 markom
  (*pptmp)->addr_mask = addr_mask;
105
  (*pptmp)->addr_compare = addr_compare;
106 239 markom
  (*pptmp)->size = size;
107 261 markom
  (*pptmp)->size_mask = size_mask;
108 239 markom
  (*pptmp)->granularity = granularity;
109
  (*pptmp)->readfunc = readfunc;
110
  (*pptmp)->writefunc = writefunc;
111 479 markom
  (*pptmp)->log = 0;
112 882 simons
  (*pptmp)->delayr = 2;
113
  (*pptmp)->delayw = 2;
114 239 markom
  (*pptmp)->next = NULL;
115 261 markom
}
116 221 markom
 
117 261 markom
/* Register read and write function for a memory area.
118
   Memory areas should be aligned. Memory area is rounded up to
119
   fit the nearest 2^n aligment.
120
   (used also by peripheral devices like 16450 UART etc.) */
121
void register_memoryarea(unsigned long addr,
122
                         unsigned long size, unsigned granularity,
123
                         unsigned long (readfunc)(unsigned long),
124
                         void (writefunc)(unsigned long, unsigned long))
125
{
126
  unsigned long size_mask = bit_mask (size);
127
  unsigned long addr_mask = ~size_mask;
128
  register_memoryarea_mask (addr_mask, addr & addr_mask,
129
                      size_mask + 1, granularity,
130
                      readfunc, writefunc);
131 30 lampret
}
132
 
133 261 markom
 
134 30 lampret
/* Check if access is to registered area of memory. */
135 560 markom
inline struct dev_memarea *verify_memoryarea(unsigned long addr)
136 30 lampret
{
137 239 markom
  struct dev_memarea *ptmp;
138 221 markom
 
139 560 markom
  /* Check cached value first */
140
  if (cur_area && (addr & cur_area->addr_mask) == (cur_area->addr_compare & cur_area->addr_mask))
141
    return cur_area;
142
 
143
  /* When mc is enabled, we must check valid also, otherwise we assume it is nonzero */
144
  IFF (config.mc.enabled) {
145
    /* Check list of registered devices. */
146
    for(ptmp = dev_list; ptmp; ptmp = ptmp->next)
147
      if ((addr & ptmp->addr_mask) == (ptmp->addr_compare & ptmp->addr_mask) && ptmp->valid)
148
        return cur_area = ptmp;
149
  } else {
150
    /* Check list of registered devices. */
151
    for(ptmp = dev_list; ptmp; ptmp = ptmp->next)
152
      if ((addr & ptmp->addr_mask) == (ptmp->addr_compare & ptmp->addr_mask))
153
        return cur_area = ptmp;
154
  }
155 239 markom
  return cur_area = NULL;
156 30 lampret
}
157
 
158 882 simons
/* Finds the memory area for the address and adjust the read and write delays for it. */
159
void adjust_rw_delay(unsigned long memaddr, unsigned long delayr, unsigned long delayw)
160
{
161
  if (verify_memoryarea(memaddr)) {
162
    cur_area->delayr = delayr;
163
    cur_area->delayw = delayw;
164
  }
165
}
166
 
167 560 markom
inline unsigned long evalsim_mem32(unsigned long memaddr)
168
{
169
  unsigned long temp;
170
 
171
  if (verify_memoryarea(memaddr)) {
172
    switch(cur_area->granularity) {
173
    case 4:
174
      temp = cur_area->readfunc(memaddr);
175 884 markom
      runtime.sim.mem_cycles += cur_area->delayr;
176 560 markom
      break;
177
    case 1:
178
      temp = cur_area->readfunc(memaddr) << 24;
179
      temp |= cur_area->readfunc(memaddr + 1) << 16;
180
      temp |= cur_area->readfunc(memaddr + 2) << 8;
181
      temp |= cur_area->readfunc(memaddr + 3);
182 884 markom
      runtime.sim.mem_cycles += cur_area->delayr * 4;
183 560 markom
      break;
184
    case 2:
185
      temp = cur_area->readfunc(memaddr) << 16;
186
      temp |= cur_area->readfunc(memaddr + 2);
187 884 markom
      runtime.sim.mem_cycles += cur_area->delayr * 2;
188 560 markom
      break;
189
    }
190
  }
191
  return temp;
192
}
193
 
194
unsigned short evalsim_mem16(unsigned long memaddr)
195
{
196
  unsigned long temp;
197
 
198
  if (verify_memoryarea(memaddr)) {
199
    switch(cur_area->granularity) {
200
    case 1:
201
      temp = cur_area->readfunc(memaddr) << 8;
202
      temp |= cur_area->readfunc(memaddr + 1);
203 884 markom
      runtime.sim.mem_cycles += cur_area->delayr * 2;
204 560 markom
      break;
205
    case 2:
206
      temp = cur_area->readfunc(memaddr);
207 884 markom
      runtime.sim.mem_cycles += cur_area->delayr;
208 560 markom
      break;
209
    case 4:
210
      temp = evalsim_mem32 (memaddr & ~3ul);
211
      if (memaddr & 2)
212
        temp &= 0xffff;
213
      else
214
        temp >>= 16;
215
      break;
216
    }
217
  }
218
  return temp;
219
}
220
 
221
unsigned char evalsim_mem8(unsigned long memaddr)
222
{
223
  unsigned long temp;
224
 
225
  if (verify_memoryarea(memaddr)) {
226
    switch(cur_area->granularity) {
227
    case 1:
228
      temp = cur_area->readfunc(memaddr);
229 884 markom
      runtime.sim.mem_cycles += cur_area->delayr;
230 560 markom
      break;
231
    case 2:
232
      temp = evalsim_mem16 (memaddr & ~1ul);
233
      if (memaddr & 1)
234
        temp &= 0xff;
235
      else
236
        temp >>= 8;
237
      break;
238
    case 4:
239
      temp = evalsim_mem32 (memaddr & ~3ul);
240
      temp >>= 8 * (3 - (memaddr & 3));
241
      temp &= 0xff;
242
      break;
243
    }
244
  }
245
  return temp;
246
}
247
 
248 2 cvs
/* Returns 32-bit values from mem array. Big endian version. */
249 349 simons
unsigned long read_mem(unsigned long memaddr,int* breakpoint)
250
{
251
  unsigned long temp;
252
  struct dev_memarea *dev;
253
 
254 525 simons
  cur_vadd = memaddr;
255 550 markom
  if (config.debug.enabled)
256 349 simons
    *breakpoint += CheckDebugUnit(DebugLoadAddress,memaddr); /* 28/05/01 CZ */
257
  temp = evalsim_mem32(memaddr);
258 611 simons
  if (!cur_area) {
259
    printf("EXCEPTION: read out of memory (16-bit access to %.8lx)\n", memaddr);
260
    except_handle(EXCEPT_BUSERR, cur_vadd);
261
    temp = 0;
262
  }
263
 
264 599 simons
  if (!pending.valid && cur_area->log)
265 587 markom
    fprintf (cur_area->log, "[%08x] -> read %08x\n", memaddr, temp);
266 550 markom
  if (config.debug.enabled)
267 349 simons
    *breakpoint += CheckDebugUnit(DebugLoadData,temp);  /* MM170901 */
268
  return temp;
269 537 markom
}
270 349 simons
 
271
/* Returns 32-bit values from mem array. Big endian version. */
272 123 markom
unsigned long eval_mem32(unsigned long memaddr,int* breakpoint)
273 2 cvs
{
274 6 lampret
 
275 239 markom
  unsigned long temp;
276
  struct dev_memarea *dev;
277 123 markom
 
278 547 markom
  if (config.sim.mprofile)
279
    mprofile (memaddr, MPROF_32 | MPROF_READ);
280
 
281 538 markom
  if (memaddr & 3) {
282
    except_handle (EXCEPT_ALIGN, memaddr);
283
    return 0;
284
  }
285 557 markom
 
286 631 simons
  if (config.debug.enabled)
287
    *breakpoint += CheckDebugUnit(DebugLoadAddress,memaddr); /* 28/05/01 CZ */
288
 
289 574 markom
  cur_vadd = memaddr;
290 631 simons
 
291
  memaddr = dmmu_translate(memaddr, 0);
292 574 markom
  if (pending.valid)
293
    return 0;
294
 
295 631 simons
  temp = dc_simulate_read(memaddr, 4);
296 611 simons
  if (!cur_area) {
297
    printf("EXCEPTION: read out of memory (32-bit access to %.8lx)\n", memaddr);
298
    except_handle(EXCEPT_BUSERR, cur_vadd);
299
    temp = 0;
300
  }
301
 
302 599 simons
  if (!pending.valid && cur_area->log)
303 587 markom
    fprintf (cur_area->log, "[%08x] -> read %08x\n", memaddr, temp);
304 550 markom
  if (config.debug.enabled)
305 270 markom
    *breakpoint += CheckDebugUnit(DebugLoadData,temp);  /* MM170901 */
306 239 markom
  return temp;
307 66 lampret
}
308
 
309 349 simons
/* Returns 32-bit values from mem array. Big endian version. */
310
unsigned long eval_insn(unsigned long memaddr,int* breakpoint)
311
{
312
  unsigned long temp;
313
  struct dev_memarea *dev;
314
 
315 547 markom
  if (config.sim.mprofile)
316
    mprofile (memaddr, MPROF_32 | MPROF_FETCH);
317 532 markom
//  memaddr = simulate_ic_mmu_fetch(memaddr);
318 525 simons
  cur_vadd = pc;
319 550 markom
  if (config.debug.enabled)
320 349 simons
    *breakpoint += CheckDebugUnit(DebugLoadAddress,memaddr); /* 28/05/01 CZ */
321 631 simons
  if (config.ic.enabled)
322
    temp = ic_simulate_fetch(memaddr);
323
  else
324
    temp = evalsim_mem32(memaddr);
325 611 simons
  if (!cur_area) {
326
    printf("EXCEPTION: read out of memory (32-bit access to %.8lx)\n", memaddr);
327
    except_handle(EXCEPT_BUSERR, cur_vadd);
328
    temp = 0;
329
  }
330
 
331 599 simons
  if (!pending.valid && cur_area->log)
332 587 markom
    fprintf (cur_area->log, "[%08x] -> read %08x\n", memaddr, temp);
333 550 markom
  if (config.debug.enabled)
334 349 simons
    *breakpoint += CheckDebugUnit(DebugLoadData,temp);  /* MM170901 */
335
  return temp;
336
}
337
 
338 2 cvs
/* Returns 16-bit values from mem array. Big endian version. */
339
 
340 123 markom
unsigned short eval_mem16(unsigned long memaddr,int* breakpoint)
341 2 cvs
{
342 239 markom
  unsigned short temp;
343 547 markom
 
344
  if (config.sim.mprofile)
345
    mprofile (memaddr, MPROF_16 | MPROF_READ);
346
 
347 538 markom
  if (memaddr & 1) {
348
    except_handle (EXCEPT_ALIGN, memaddr);
349
    return 0;
350
  }
351 574 markom
 
352 631 simons
  if (config.debug.enabled)
353
    *breakpoint += CheckDebugUnit(DebugLoadAddress,memaddr); /* 28/05/01 CZ */
354
 
355 574 markom
  cur_vadd = memaddr;
356 631 simons
 
357
  memaddr = dmmu_translate(memaddr, 0);
358 574 markom
  if (pending.valid)
359
    return 0;
360 66 lampret
 
361 631 simons
  temp = (unsigned short)dc_simulate_read(memaddr, 2);
362 611 simons
  if (!cur_area) {
363
    printf("EXCEPTION: read out of memory (16-bit access to %.8lx)\n", memaddr);
364
    except_handle(EXCEPT_BUSERR, cur_vadd);
365
    temp = 0;
366
  }
367
 
368 599 simons
  if (!pending.valid && cur_area->log)
369 587 markom
    fprintf (cur_area->log, "[%08x] -> read %08x\n", memaddr, temp);
370 550 markom
  if (config.debug.enabled)
371 270 markom
    *breakpoint += CheckDebugUnit(DebugLoadData,temp);  /* MM170901 */
372 239 markom
  return temp;
373 66 lampret
}
374
 
375 6 lampret
/* Returns 8-bit values from mem array. */
376 2 cvs
 
377 123 markom
unsigned char eval_mem8(unsigned long memaddr,int* breakpoint)
378 221 markom
{
379 631 simons
  unsigned char temp;
380 547 markom
 
381
  if (config.sim.mprofile)
382
    mprofile (memaddr, MPROF_8 | MPROF_READ);
383
 
384 631 simons
  if (config.debug.enabled)
385
    *breakpoint += CheckDebugUnit(DebugLoadAddress,memaddr);  /* 28/05/01 CZ */
386
 
387 525 simons
  cur_vadd = memaddr;
388 631 simons
 
389
  memaddr = dmmu_translate(memaddr, 0);
390 458 simons
  if (pending.valid)
391
    return 0;
392 6 lampret
 
393 631 simons
  temp = (unsigned char)dc_simulate_read(memaddr, 1);
394 611 simons
  if (!cur_area) {
395
    printf("EXCEPTION: read out of memory (8-bit access to %.8lx)\n", memaddr);
396
    except_handle(EXCEPT_BUSERR, cur_vadd);
397
    temp = 0;
398
  }
399
 
400 599 simons
  if (!pending.valid && cur_area->log)
401 587 markom
    fprintf (cur_area->log, "[%08x] -> read %08x\n", memaddr, temp);
402 550 markom
  if (config.debug.enabled)
403 270 markom
    *breakpoint += CheckDebugUnit(DebugLoadData,temp);  /* MM170901 */
404 239 markom
  return temp;
405 66 lampret
}
406
 
407
void setsim_mem32(unsigned long memaddr, unsigned long value)
408
{
409 239 markom
  struct dev_memarea *dev;
410 66 lampret
 
411 239 markom
  if (verify_memoryarea(memaddr)) {
412
    switch(cur_area->granularity) {
413 538 markom
    case 4:
414
      cur_area->writefunc(memaddr, value);
415 884 markom
      runtime.sim.mem_cycles += cur_area->delayw;
416 538 markom
      break;
417 239 markom
    case 1:
418 251 erez
      cur_area->writefunc(memaddr    , (value >> 24) & 0xFF);
419 239 markom
      cur_area->writefunc(memaddr + 1, (value >> 16) & 0xFF);
420 251 erez
      cur_area->writefunc(memaddr + 2, (value >>  8) & 0xFF);
421
      cur_area->writefunc(memaddr + 3, (value      ) & 0xFF);
422 884 markom
      runtime.sim.mem_cycles += cur_area->delayw * 4;
423 239 markom
      break;
424
    case 2:
425
      cur_area->writefunc(memaddr, (value >> 16) & 0xFFFF);
426
      cur_area->writefunc(memaddr + 2, value & 0xFFFF);
427 884 markom
      runtime.sim.mem_cycles += cur_area->delayw * 2;
428 239 markom
      break;
429 242 markom
    }
430 239 markom
  } else {
431
    printf("EXCEPTION: write out of memory (32-bit access to %.8lx)\n", memaddr);
432 525 simons
    except_handle(EXCEPT_BUSERR, cur_vadd);
433 239 markom
  }
434 2 cvs
}
435
 
436 66 lampret
void setsim_mem16(unsigned long memaddr, unsigned short value)
437
{
438 538 markom
  unsigned long temp;
439 239 markom
  if (verify_memoryarea(memaddr)) {
440
    switch(cur_area->granularity) {
441
    case 1:
442
      cur_area->writefunc(memaddr, (value >> 8) & 0xFF);
443
      cur_area->writefunc(memaddr + 1, value & 0xFF);
444 884 markom
      runtime.sim.mem_cycles += cur_area->delayw * 2;
445 239 markom
      break;
446
    case 2:
447 251 erez
      cur_area->writefunc(memaddr, value & 0xFFFF);
448 884 markom
      runtime.sim.mem_cycles += cur_area->delayw;
449 239 markom
      break;
450
    case 4:
451 538 markom
      temp = evalsim_mem32 (memaddr & ~3ul);
452 546 simons
      temp &= 0xffff << ((memaddr & 2) ? 16 : 0);
453
      temp |= (unsigned long)(value & 0xffff) << ((memaddr & 2) ? 0 : 16);
454 538 markom
      setsim_mem32 (memaddr & ~3ul, temp);
455 239 markom
      break;
456
    }
457
  } else {
458
    printf("EXCEPTION: write out of memory (16-bit access to %.8lx)\n", memaddr);
459 525 simons
    except_handle(EXCEPT_BUSERR, cur_vadd);
460 239 markom
  }
461 2 cvs
}
462
 
463 66 lampret
void setsim_mem8(unsigned long memaddr, unsigned char value)
464
{
465 538 markom
  unsigned long temp;
466 239 markom
  if (verify_memoryarea(memaddr)) {
467 538 markom
    switch (cur_area->granularity) {
468
    case 1:
469 239 markom
      cur_area->writefunc(memaddr, value);
470 884 markom
      runtime.sim.mem_cycles += cur_area->delayw;
471 538 markom
      break;
472
    case 2:
473
      temp = evalsim_mem16 (memaddr & ~1ul);
474 546 simons
      temp &= 0xff << ((memaddr & 1) ? 8 : 0);
475
      temp |= (unsigned short)(value & 0xff) << ((memaddr & 1) ? 0 : 8);
476 538 markom
      setsim_mem16 (memaddr & ~1ul, temp);
477
      break;
478
    case 4:
479
      temp = evalsim_mem32 (memaddr & ~3ul);
480
      temp &= ~(0xff << (8 * (3 - (memaddr & 3))));
481
      temp |= (unsigned long)(value & 0xff) << (8 * (3 - (memaddr & 3)));
482
      setsim_mem32 (memaddr & ~3ul, temp);
483
      break;
484 239 markom
    }
485
  } else {
486
    printf("EXCEPTION: write out of memory (8-bit access to %.8lx)\n", memaddr);
487 525 simons
    except_handle(EXCEPT_BUSERR, cur_vadd);
488 239 markom
  }
489 2 cvs
}
490 30 lampret
 
491 587 markom
/* Set mem, 32-bit. Big endian version. */
492
 
493
void set_mem32(unsigned long memaddr, unsigned long value,int* breakpoint)
494
{
495
  if (config.sim.mprofile)
496
    mprofile (memaddr, MPROF_32 | MPROF_WRITE);
497
 
498
  if (memaddr & 3) {
499
    except_handle (EXCEPT_ALIGN, memaddr);
500
    return;
501
  }
502
 
503
  cur_vadd = memaddr;
504 631 simons
  memaddr = dmmu_translate(memaddr, 1);;
505 587 markom
  /* If we produced exception don't set anything */
506
  if (pending.valid)
507
    return;
508
 
509
  if (config.debug.enabled) {
510
    *breakpoint += CheckDebugUnit(DebugStoreAddress,memaddr);  /* 28/05/01 CZ */
511
    *breakpoint += CheckDebugUnit(DebugStoreData,value);
512
  }
513
 
514
  if (cur_area->log)
515
    fprintf (cur_area->log, "[%08x] -> write %08x\n", memaddr, value);
516
 
517 631 simons
  dc_simulate_write(memaddr, value, 4);
518 587 markom
}
519
 
520
/* Set mem, 16-bit. Big endian version. */
521
 
522
void set_mem16(unsigned long memaddr, unsigned short value,int* breakpoint)
523
{
524
  if (config.sim.mprofile)
525
    mprofile (memaddr, MPROF_16 | MPROF_WRITE);
526
 
527
  if (memaddr & 1) {
528
    except_handle (EXCEPT_ALIGN, memaddr);
529
    return;
530
  }
531
 
532
  cur_vadd = memaddr;
533 631 simons
  memaddr = dmmu_translate(memaddr, 1);;
534 587 markom
  /* If we produced exception don't set anything */
535
  if (pending.valid)
536
    return;
537
 
538
  if (config.debug.enabled) {
539
    *breakpoint += CheckDebugUnit(DebugStoreAddress,memaddr);  /* 28/05/01 CZ */
540
    *breakpoint += CheckDebugUnit(DebugStoreData,value);
541
  }
542
 
543
  if (cur_area->log)
544
    fprintf (cur_area->log, "[%08x] -> write %08x\n", memaddr, value);
545
 
546 631 simons
  dc_simulate_write(memaddr, (unsigned long)value, 2);
547 587 markom
}
548
 
549
/* Set mem, 8-bit. */
550
 
551
void set_mem8(unsigned long memaddr, unsigned char value,int* breakpoint)
552
{
553
  if (config.sim.mprofile)
554
    mprofile (memaddr, MPROF_8 | MPROF_WRITE);
555
 
556
  cur_vadd = memaddr;
557 631 simons
  memaddr = dmmu_translate(memaddr, 1);;
558 587 markom
  /* If we produced exception don't set anything */
559
  if (pending.valid) return;
560
 
561
  if (config.debug.enabled) {
562
    *breakpoint += CheckDebugUnit(DebugStoreAddress,memaddr);  /* 28/05/01 CZ */
563
    *breakpoint += CheckDebugUnit(DebugStoreData,value);
564
  }
565
 
566
  if (cur_area->log)
567
    fprintf (cur_area->log, "[%08x] -> write %08x\n", memaddr, value);
568
 
569 631 simons
  dc_simulate_write(memaddr, (unsigned long)value, 1);
570 587 markom
}
571
 
572 361 markom
void dumpmemory(unsigned int from, unsigned int to, int disasm, int nl)
573
{
574
  unsigned int i, j;
575
  struct label_entry *tmp;
576
  int breakpoint = 0;
577
  int ilen = disasm ? 4 : 16;
578
 
579
  for(i = from; i < to; i += ilen) {
580
    printf("%.8x: ", i);
581
    for (j = 0; j < ilen;) {
582
      int data = -1;
583
      if (!disasm) {
584
        tmp = NULL;
585
        if (verify_memoryarea(i+j)) {
586
          struct label_entry *entry;
587
          entry = get_label(i + j);
588
          if (entry)
589
            printf("(%s)", entry->name);
590
          printf("%02x ", data = evalsim_mem8(i+j));
591
        } else printf("XX ");
592
        j++;
593
      } else {
594
        int breakpoint;
595
        unsigned int _insn = read_mem(i, &breakpoint);
596
        int index = insn_decode (_insn);
597
        int len = insn_len (index);
598
 
599
        tmp = NULL;
600
        if (verify_memoryarea(i+j)) {
601
          struct label_entry *entry;
602
          entry = get_label(i + j);
603
          if (entry)
604
            printf("(%s)", entry->name);
605
 
606
          printf(": %08x ", (unsigned long)_insn);
607
          if (index >= 0) {
608
            disassemble_insn (_insn);
609
            printf(" %s", disassembled);
610
          } else
611
            printf("<invalid>");
612
        } else printf("XXXXXXXX");
613
        j += len;
614
      }
615
    }
616
    if (nl)
617
      printf ("\n");
618
  }
619
}
620
 
621 538 markom
unsigned long simmem_read_word(unsigned long addr) {
622
  return simmem32[(cur_area->misc + (addr & cur_area->size_mask)) >> 2];
623 221 markom
}
624
 
625 538 markom
void simmem_write_word(unsigned long addr, unsigned long value) {
626
  simmem32[(cur_area->misc + (addr & cur_area->size_mask)) >> 2] = value;
627 221 markom
}
628
 
629 424 markom
unsigned long simmem_read_zero(unsigned long addr) {
630
  if (config.sim.verbose)
631
    fprintf (stderr, "WARNING: memory read from non-read memory area 0x%08x.\n", addr);
632
  return 0;
633
}
634
 
635
void simmem_write_null(unsigned long addr, unsigned long value) {
636
  if (config.sim.verbose)
637
    fprintf (stderr, "WARNING: memory write to 0x%08x, non-write memory area (value 0x%08x).\n", addr, value);
638
}
639
 
640
/* Initialize memory table from a config struct */
641
 
642
void init_memory_table ()
643 221 markom
{
644 239 markom
  unsigned long memory_needed = 0;
645 426 markom
 
646 424 markom
  /* If nothing was defined, use default memory block */
647
  if (config.memory.nmemories) {
648
    int i;
649
    for (i = 0; i < config.memory.nmemories; i++) {
650
      unsigned long start = config.memory.table[i].baseaddr;
651
      unsigned long length = config.memory.table[i].size;
652
      char *type = config.memory.table[i].name;
653
      int rd = config.memory.table[i].delayr;
654
      int wd = config.memory.table[i].delayw;
655
      int ce = config.memory.table[i].ce;
656
      if (config.sim.verbose)
657
        debug (1, "%08X %08X (%i KB): %s (activated by CE%i; read delay = %icyc, write delay = %icyc)\n",
658
          start, length, length >> 10, type, ce, rd, wd);
659 538 markom
      register_memoryarea(start, length, 4, &simmem_read_word, &simmem_write_word);
660 239 markom
      cur_area->misc = memory_needed;
661 540 simons
      cur_area->chip_select = ce;
662 543 simons
      cur_area->valid = 1;
663 424 markom
      cur_area->delayw = wd;
664
      cur_area->delayr = rd;
665 426 markom
      if (config.memory.table[i].log[0] != '\0') {
666
        if ((cur_area->log = fopen (config.memory.table[i].log, "wt+")) == NULL)
667
          fprintf (stderr, "WARNING: Cannot open '%s'.\n", config.memory.table[i].log);
668
      } else
669 554 markom
        cur_area->log = NULL;
670 261 markom
      memory_needed += cur_area->size;
671 239 markom
    }
672
    printf ("\n");
673
  } else {
674 308 markom
    if (config.sim.verbose)
675 424 markom
      fprintf (stderr, "WARNING: Memory not defined, assuming standard configuration.\n");
676 538 markom
    register_memoryarea(DEFAULT_MEMORY_START, DEFAULT_MEMORY_LEN, 4, &simmem_read_word, &simmem_write_word);
677 554 markom
    cur_area->misc = memory_needed;
678
    cur_area->chip_select = 0;
679
    cur_area->valid = 1;
680
    cur_area->delayw = 1;
681
    cur_area->delayr = 1;
682
    cur_area->log = NULL;
683 261 markom
    memory_needed += cur_area->size;
684 239 markom
  }
685 424 markom
 
686 538 markom
  simmem32 = (unsigned long *) malloc (sizeof (unsigned long) * ((memory_needed + 3) / 4));
687
  if (!simmem32) {
688 239 markom
    fprintf (stderr, "Failed to allocate sim memory. Aborting\n");
689
    exit (-1);
690
  }
691 221 markom
}
692 424 markom
 
693
/* Changes read/write memory in read/write only */
694
 
695
void lock_memory_table ()
696
{
697
  struct dev_memarea *ptmp;
698
 
699
  /* Check list of registered devices. */
700
  for(ptmp = dev_list; ptmp; ptmp = ptmp->next) {
701 538 markom
    if (ptmp->delayr < 0 && ptmp->readfunc == &simmem_read_word)
702 424 markom
      ptmp->readfunc = &simmem_read_zero;
703 538 markom
    if (ptmp->delayw < 0 && ptmp->writefunc == &simmem_write_word)
704 424 markom
      ptmp->writefunc = &simmem_write_null;
705 543 simons
 
706
    /* If this mem area is not for memory chip under MC control
707
       then this area is valid all the time */
708
    if (ptmp->readfunc != &simmem_read_word) {
709
      ptmp->valid = 1;
710
      ptmp->chip_select = -1;
711
    }
712 424 markom
  }
713
}
714 426 markom
 
715
/* Closes files, etc. */
716
 
717
void done_memory_table ()
718
{
719
  struct dev_memarea *ptmp;
720
 
721
  /* Check list of registered devices. */
722
  for(ptmp = dev_list; ptmp; ptmp = ptmp->next) {
723
    if (ptmp->log)
724
      fclose (ptmp->log);
725
  }
726
}
727 427 markom
 
728
/* Displays current memory configuration */
729
 
730
void memory_table_status ()
731
{
732
  struct dev_memarea *ptmp;
733
 
734
  /* Check list of registered devices. */
735
  for(ptmp = dev_list; ptmp; ptmp = ptmp->next) {
736
    printf ("addr & %08x == %08x to %08x, size %08x, gran %iB\n",
737
      ptmp->addr_mask, ptmp->addr_compare, ptmp->addr_compare | bit_mask (ptmp->size),
738
      ptmp->size, ptmp->granularity);
739
    printf ("\t");
740
    if (ptmp->delayr >= 0)
741
      printf ("read delay = %i cycles, ", ptmp->delayr);
742
    else
743
      printf ("reads not possible, ");
744
 
745
    if (ptmp->delayw >= 0)
746
      printf ("write delay = %i cycles", ptmp->delayw);
747
    else
748
      printf ("writes not possible");
749
 
750
    if (ptmp->log)
751
      printf (", (logged)\n");
752
    else
753
      printf ("\n");
754
  }
755
}
756 433 markom
 
757
/* Outputs time in pretty form to dest string */
758
 
759 897 markom
char *generate_time_pretty (char *dest, long time_ps)
760 433 markom
{
761
  int exp3 = 0;
762
  if (time_ps) {
763
    while ((time_ps % 1000) == 0) {
764
      time_ps /= 1000;
765
      exp3++;
766
    }
767
  }
768
  sprintf (dest, "%i%cs", time_ps, "pnum"[exp3]);
769 897 markom
  return dest;
770 433 markom
}

powered by: WebSVN 2.1.0

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