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 631

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

powered by: WebSVN 2.1.0

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