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 860

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

powered by: WebSVN 2.1.0

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