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 424

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 "trace.h"
37
#include "execute.h"
38 32 lampret
#include "sprs.h"
39 35 lampret
#include "stats.h"
40 32 lampret
#include "except.h"
41 123 markom
#include "debug_unit.h"
42 134 markom
#include "opcode/or32.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 221 markom
static struct mem_entry *simmem;
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 349 simons
/* It returns physical address. */
59
unsigned long translate_vrt_to_phy_add(unsigned long virtaddr)
60 77 lampret
{
61 239 markom
  if (config.ic.tagtype == NONE)
62
    return virtaddr;
63
  else
64
    if (config.ic.tagtype == VIRTUAL) {
65
      return immu_translate(virtaddr);
66
    }
67
    else if (config.dc.tagtype == PHYSICAL) {
68
      unsigned long phyaddr = immu_translate(virtaddr);
69
      return phyaddr;
70
    }
71
    else {
72
      printf("INTERNAL ERROR: Unknown insn cache type.\n");
73
      cont_run = 0;
74
    }
75 221 markom
 
76 239 markom
  return -1;
77 77 lampret
}
78
 
79 349 simons
/* Calls IMMU translation routines before simulating insn
80
cache for virtually indexed insn cache or after simulating insn cache
81
for physically indexed insn cache. It returns physical address. */
82
 
83
unsigned long simulate_ic_mmu_fetch(unsigned long virtaddr)
84
{
85
 
86
  unsigned long phyaddr;
87
 
88
  if ((phyaddr = translate_vrt_to_phy_add(virtaddr)) != -1) {
89
    ic_simulate_fetch(phyaddr);
90
    return phyaddr;
91
  }
92
  else {
93
    printf("INTERNAL ERROR: Unknown insn cache type.\n");
94
    cont_run = 0;
95
  }
96
  return -1;
97
}
98
 
99 77 lampret
/* Calls DMMU translation routines (load cycles) before simulating data
100 239 markom
   cache for virtually indexed data cache or after simulating data cache
101
   for physically indexed data cache. It returns physical address. */
102 6 lampret
 
103
unsigned long simulate_dc_mmu_load(unsigned long virtaddr)
104
{
105 239 markom
  if (config.dc.tagtype == NONE)
106
    return virtaddr;
107
  else
108 327 lampret
  if (config.dc.tagtype == VIRTUAL) {
109
    dc_simulate_read(virtaddr);
110
    return dmmu_translate(virtaddr);
111 239 markom
  }
112
  else if (config.dc.tagtype == PHYSICAL) {
113 327 lampret
    unsigned long phyaddr = dmmu_translate(virtaddr);
114
    dc_simulate_read(phyaddr);
115 239 markom
    return phyaddr;
116
  }
117
  else {
118 327 lampret
    printf("INTERNAL ERROR: Unknown data cache type.\n");
119 239 markom
    cont_run = 0;
120
  }
121 221 markom
 
122 239 markom
  return -1;
123 6 lampret
}
124
 
125 77 lampret
/* Calls DMMU translation routines (store cycles) before simulating data
126 6 lampret
cache for virtually indexed data cache or after simulating data cache
127
for physically indexed data cache. It returns physical address. */
128
 
129
unsigned long simulate_dc_mmu_store(unsigned long virtaddr)
130
{
131 239 markom
  if (config.dc.tagtype == NONE)
132
    return virtaddr;
133
  else
134
  if (config.dc.tagtype == VIRTUAL) {
135
    dc_simulate_write(virtaddr);
136
    return dmmu_translate(virtaddr);
137
  }
138
  else if (config.dc.tagtype == PHYSICAL) {
139
    unsigned long phyaddr = dmmu_translate(virtaddr);
140
    dc_simulate_write(phyaddr);
141
    return phyaddr;
142
  }
143
  else {
144
    printf("INTERNAL ERROR: Unknown data cache type.\n");
145
    cont_run = 0;
146
  }
147 221 markom
 
148 239 markom
  return -1;
149 6 lampret
}
150
 
151 261 markom
/* Calculates bit mask to fit the data */
152
unsigned long bit_mask (unsigned long data) {
153
  int i = 0;
154
  data--;
155 382 markom
  while (data >> i)
156 261 markom
    data |= 1 << i++;
157
  return data;
158
}
159
 
160
/* Register read and write function for a memory area.
161
   addr is inside the area, if addr & addr_mask == addr_compare
162
   (used also by peripheral devices like 16450 UART etc.) */
163
void register_memoryarea_mask(unsigned long addr_mask, unsigned long addr_compare,
164
                         unsigned long size, unsigned granularity,
165 239 markom
                         unsigned long (readfunc)(unsigned long),
166 261 markom
                         void (writefunc)(unsigned long, unsigned long))
167 30 lampret
{
168 239 markom
  struct dev_memarea **pptmp;
169 261 markom
  unsigned long size_mask = bit_mask (size);
170
  int found_error = 0;
171
  addr_compare &= addr_mask;
172 221 markom
 
173 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);
174 239 markom
  /* Go to the end of the list. */
175 261 markom
  for(pptmp = &dev_list; *pptmp; pptmp = &(*pptmp)->next)
176
    if ((addr_compare >= (*pptmp)->addr_compare) && (addr_compare < (*pptmp)->addr_compare + (*pptmp)->size)
177
     || (addr_compare + size > (*pptmp)->addr_compare) && (addr_compare < (*pptmp)->addr_compare + (*pptmp)->size)) {
178 262 markom
      if (!found_error) {
179 261 markom
        fprintf (stderr, "ERROR: Overlapping memory area(s):\n");
180 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);
181
      }
182 261 markom
      found_error = 1;
183 424 markom
      fprintf (stderr, "and\taddr & %08x == %08x to %08x, size %08x, gran %iB\n", (*pptmp)->addr_mask, (*pptmp)->addr_compare,
184 261 markom
        (*pptmp)->addr_compare | (*pptmp)->size_mask, (*pptmp)->size, (*pptmp)->granularity);
185
    }
186
 
187
  if (found_error)
188
    exit (-1);
189
 
190 239 markom
  cur_area = *pptmp = (struct dev_memarea *)malloc(sizeof(struct dev_memarea));
191 261 markom
  (*pptmp)->addr_mask = addr_mask;
192
  (*pptmp)->addr_compare = addr_compare;
193 239 markom
  (*pptmp)->size = size;
194 261 markom
  (*pptmp)->size_mask = size_mask;
195 239 markom
  (*pptmp)->granularity = granularity;
196
  (*pptmp)->readfunc = readfunc;
197
  (*pptmp)->writefunc = writefunc;
198
  (*pptmp)->next = NULL;
199 261 markom
}
200 221 markom
 
201 261 markom
/* Register read and write function for a memory area.
202
   Memory areas should be aligned. Memory area is rounded up to
203
   fit the nearest 2^n aligment.
204
   (used also by peripheral devices like 16450 UART etc.) */
205
void register_memoryarea(unsigned long addr,
206
                         unsigned long size, unsigned granularity,
207
                         unsigned long (readfunc)(unsigned long),
208
                         void (writefunc)(unsigned long, unsigned long))
209
{
210
  unsigned long size_mask = bit_mask (size);
211
  unsigned long addr_mask = ~size_mask;
212
  register_memoryarea_mask (addr_mask, addr & addr_mask,
213
                      size_mask + 1, granularity,
214
                      readfunc, writefunc);
215 30 lampret
}
216
 
217 261 markom
 
218 30 lampret
/* Check if access is to registered area of memory. */
219
struct dev_memarea *verify_memoryarea(unsigned long addr)
220
{
221 239 markom
  struct dev_memarea *ptmp;
222 221 markom
 
223 239 markom
  /* Check list of registered devices. */
224
  for(ptmp = dev_list; ptmp; ptmp = ptmp->next)
225 261 markom
    if ((addr & ptmp->addr_mask) == ptmp->addr_compare)
226 239 markom
      return cur_area = ptmp;
227
  return cur_area = NULL;
228 30 lampret
}
229
 
230 2 cvs
/* Returns 32-bit values from mem array. Big endian version. */
231 349 simons
unsigned long read_mem(unsigned long memaddr,int* breakpoint)
232
{
233
  unsigned long temp;
234
  struct dev_memarea *dev;
235
 
236
  slp_checkaccess(memaddr, SLP_MEMREAD);
237
  if (DEBUG_ENABLED)
238
    *breakpoint += CheckDebugUnit(DebugLoadAddress,memaddr); /* 28/05/01 CZ */
239
  temp = evalsim_mem32(memaddr);
240
  if (DEBUG_ENABLED)
241
    *breakpoint += CheckDebugUnit(DebugLoadData,temp);  /* MM170901 */
242
  return temp;
243
}
244
 
245
/* Returns 32-bit values from mem array. Big endian version. */
246 123 markom
unsigned long eval_mem32(unsigned long memaddr,int* breakpoint)
247 2 cvs
{
248 6 lampret
 
249 239 markom
  unsigned long temp;
250
  struct dev_memarea *dev;
251 123 markom
 
252 239 markom
  slp_checkaccess(memaddr, SLP_MEMREAD);
253
  memaddr = simulate_dc_mmu_load(memaddr);
254 270 markom
  if (DEBUG_ENABLED)
255
    *breakpoint += CheckDebugUnit(DebugLoadAddress,memaddr); /* 28/05/01 CZ */
256 239 markom
  temp = evalsim_mem32(memaddr);
257 270 markom
  if (DEBUG_ENABLED)
258
    *breakpoint += CheckDebugUnit(DebugLoadData,temp);  /* MM170901 */
259 239 markom
  return temp;
260 66 lampret
}
261
 
262 349 simons
/* Returns 32-bit values from mem array. Big endian version. */
263
unsigned long eval_insn(unsigned long memaddr,int* breakpoint)
264
{
265
 
266
  unsigned long temp;
267
  struct dev_memarea *dev;
268
 
269
  slp_checkaccess(memaddr, SLP_MEMREAD);
270 416 simons
//  memaddr = simulate_ic_mmu_fetch(memaddr);
271
  ic_simulate_fetch(memaddr);
272 349 simons
  if (DEBUG_ENABLED)
273
    *breakpoint += CheckDebugUnit(DebugLoadAddress,memaddr); /* 28/05/01 CZ */
274
  temp = evalsim_mem32(memaddr);
275
  if (DEBUG_ENABLED)
276
    *breakpoint += CheckDebugUnit(DebugLoadData,temp);  /* MM170901 */
277
  return temp;
278
}
279
 
280 221 markom
unsigned long evalsim_mem32(unsigned long memaddr)
281 66 lampret
{
282 239 markom
  unsigned long temp;
283 221 markom
 
284 239 markom
  if (verify_memoryarea(memaddr)) {
285
    switch(cur_area->granularity) {
286
    case 1:
287
      temp = cur_area->readfunc(memaddr) << 24;
288
      temp |= cur_area->readfunc(memaddr + 1) << 16;
289
      temp |= cur_area->readfunc(memaddr + 2) << 8;
290
      temp |= cur_area->readfunc(memaddr + 3);
291
      break;
292
    case 2:
293
      temp = cur_area->readfunc(memaddr) << 16;
294
      temp |= cur_area->readfunc(memaddr + 2);
295
      break;
296
    case 4:
297
      temp = cur_area->readfunc(memaddr);
298
      break;
299
    }
300
  } else {
301
    printf("EXCEPTION: read out of memory (32-bit access to %.8lx)\n", memaddr);
302
    cont_run = 0;
303
    temp = 0;
304
  }
305
  return temp;
306 2 cvs
}
307
 
308
/* Returns 16-bit values from mem array. Big endian version. */
309
 
310 123 markom
unsigned short eval_mem16(unsigned long memaddr,int* breakpoint)
311 2 cvs
{
312 239 markom
  unsigned short temp;
313
  memaddr = simulate_dc_mmu_load(memaddr);
314 270 markom
  if (DEBUG_ENABLED)
315
    *breakpoint += CheckDebugUnit(DebugLoadAddress,memaddr); /* 28/05/01 CZ */
316 66 lampret
 
317 239 markom
  temp = evalsim_mem16(memaddr);
318 270 markom
  if (DEBUG_ENABLED)
319
    *breakpoint += CheckDebugUnit(DebugLoadData,temp);  /* MM170901 */
320 239 markom
  return temp;
321 66 lampret
}
322
 
323 221 markom
unsigned short evalsim_mem16(unsigned long memaddr)
324 66 lampret
{
325 239 markom
  unsigned short temp;
326 221 markom
 
327 239 markom
  if (verify_memoryarea(memaddr)) {
328
    switch(cur_area->granularity) {
329
    case 1:
330
      temp = cur_area->readfunc(memaddr) << 8;
331
      temp |= cur_area->readfunc(memaddr + 1);
332
      break;
333
    case 2:
334
      temp = cur_area->readfunc(memaddr);
335
      break;
336
    case 4:
337
      printf("EXCEPTION: read 16-bit value from 32-bit region (address 0x%08lX)\n", cur_area->granularity * 8, memaddr);
338
      cont_run = 0;
339
      break;
340
    }
341
  } else {
342
    printf("EXCEPTION: read out of memory (16-bit access to %.8lx)\n", memaddr);
343
    cont_run = 0;
344
    temp = 0;
345
  }
346
  return temp;
347 2 cvs
}
348
 
349
 
350 6 lampret
/* Returns 8-bit values from mem array. */
351 2 cvs
 
352 123 markom
unsigned char eval_mem8(unsigned long memaddr,int* breakpoint)
353 221 markom
{
354 239 markom
  unsigned char temp;
355
  memaddr = simulate_dc_mmu_load(memaddr);
356 270 markom
  if (DEBUG_ENABLED)
357
    *breakpoint += CheckDebugUnit(DebugLoadAddress,memaddr);  /* 28/05/01 CZ */
358 6 lampret
 
359 239 markom
  temp = evalsim_mem8(memaddr);
360 270 markom
  if (DEBUG_ENABLED)
361
    *breakpoint += CheckDebugUnit(DebugLoadData,temp);  /* MM170901 */
362 239 markom
  return temp;
363 66 lampret
}
364
 
365 221 markom
unsigned char evalsim_mem8(unsigned long memaddr)
366
{
367 239 markom
  unsigned char temp;
368 123 markom
 
369 239 markom
  if (verify_memoryarea(memaddr)) {
370
    switch(cur_area->granularity) {
371
    case 1:
372
      temp = cur_area->readfunc(memaddr);
373
      break;
374
    case 2:
375
    case 4:
376
      printf("EXCEPTION: read 8-bit value from %u-bit region (address 0x%08lX)\n", cur_area->granularity * 8, memaddr);
377
      cont_run = 0;
378
      break;
379
    }
380
  } else {
381
    printf("EXCEPTION: read out of memory (8-bit access to %.8lx)\n", memaddr);
382
    cont_run = 0;
383
    temp = 0;
384
  }
385
  return temp;
386 2 cvs
}
387
 
388
/* Set mem, 32-bit. Big endian version. */
389
 
390 123 markom
void set_mem32(unsigned long memaddr, unsigned long value,int* breakpoint)
391 2 cvs
{
392 239 markom
  slp_checkaccess(memaddr, SLP_MEMWRITE);
393
  memaddr = simulate_dc_mmu_store(memaddr);
394 221 markom
 
395 270 markom
  if (DEBUG_ENABLED) {
396
    *breakpoint += CheckDebugUnit(DebugStoreAddress,memaddr);  /* 28/05/01 CZ */
397
    *breakpoint += CheckDebugUnit(DebugStoreData,value);
398
  }
399 123 markom
 
400 239 markom
  setsim_mem32(memaddr, value);
401 66 lampret
}
402
 
403
void setsim_mem32(unsigned long memaddr, unsigned long value)
404
{
405 239 markom
  struct dev_memarea *dev;
406 66 lampret
 
407 239 markom
  if (verify_memoryarea(memaddr)) {
408
    switch(cur_area->granularity) {
409
    case 1:
410 251 erez
      cur_area->writefunc(memaddr    , (value >> 24) & 0xFF);
411 239 markom
      cur_area->writefunc(memaddr + 1, (value >> 16) & 0xFF);
412 251 erez
      cur_area->writefunc(memaddr + 2, (value >>  8) & 0xFF);
413
      cur_area->writefunc(memaddr + 3, (value      ) & 0xFF);
414 239 markom
      break;
415
    case 2:
416
      cur_area->writefunc(memaddr, (value >> 16) & 0xFFFF);
417
      cur_area->writefunc(memaddr + 2, value & 0xFFFF);
418
      break;
419
    case 4:
420
      cur_area->writefunc(memaddr, value);
421
      break;
422 242 markom
    }
423 239 markom
  } else {
424
    printf("EXCEPTION: write out of memory (32-bit access to %.8lx)\n", memaddr);
425
    cont_run = 0;
426
  }
427 2 cvs
}
428
 
429
/* Set mem, 16-bit. Big endian version. */
430
 
431 123 markom
void set_mem16(unsigned long memaddr, unsigned short value,int* breakpoint)
432 2 cvs
{
433 239 markom
  memaddr = simulate_dc_mmu_store(memaddr);
434 221 markom
 
435 270 markom
  if (DEBUG_ENABLED) {
436
    *breakpoint += CheckDebugUnit(DebugStoreAddress,memaddr);  /* 28/05/01 CZ */
437
    *breakpoint += CheckDebugUnit(DebugStoreData,value);
438
  }
439 123 markom
 
440 239 markom
  setsim_mem16(memaddr, value);
441 66 lampret
}
442
 
443
void setsim_mem16(unsigned long memaddr, unsigned short value)
444
{
445 239 markom
  if (verify_memoryarea(memaddr)) {
446
    switch(cur_area->granularity) {
447
    case 1:
448
      cur_area->writefunc(memaddr, (value >> 8) & 0xFF);
449
      cur_area->writefunc(memaddr + 1, value & 0xFF);
450
      break;
451
    case 2:
452 251 erez
      cur_area->writefunc(memaddr, value & 0xFFFF);
453 239 markom
      break;
454
    case 4:
455
      printf("EXCEPTION: write 16-bit value to 32-bit region (address 0x%08lX)\n", memaddr);
456
      cont_run = 0;
457
      break;
458
    }
459
  } else {
460
    printf("EXCEPTION: write out of memory (16-bit access to %.8lx)\n", memaddr);
461
    cont_run = 0;
462
  }
463 2 cvs
}
464
 
465 6 lampret
/* Set mem, 8-bit. */
466 2 cvs
 
467 123 markom
void set_mem8(unsigned long memaddr, unsigned char value,int* breakpoint)
468 2 cvs
{
469 239 markom
  memaddr = simulate_dc_mmu_store(memaddr);
470 221 markom
 
471 270 markom
  if (DEBUG_ENABLED) {
472
    *breakpoint += CheckDebugUnit(DebugStoreAddress,memaddr);  /* 28/05/01 CZ */
473
    *breakpoint += CheckDebugUnit(DebugStoreData,value);
474
  }
475 123 markom
 
476 239 markom
  setsim_mem8(memaddr, value);
477 66 lampret
}
478
 
479
void setsim_mem8(unsigned long memaddr, unsigned char value)
480
{
481 239 markom
  if (verify_memoryarea(memaddr)) {
482
    if (cur_area->granularity == 1)
483
      cur_area->writefunc(memaddr, value);
484
    else {
485
      printf("EXCEPTION: write 8-bit value to %u-bit region (address 0x%08lX)\n", cur_area->granularity * 8, memaddr);
486
      cont_run = 0;
487
    }
488
  } else {
489
    printf("EXCEPTION: write out of memory (8-bit access to %.8lx)\n", memaddr);
490
    cont_run = 0;
491
  }
492 2 cvs
}
493 30 lampret
 
494 361 markom
void dumpmemory(unsigned int from, unsigned int to, int disasm, int nl)
495
{
496
  unsigned int i, j;
497
  struct label_entry *tmp;
498
  int breakpoint = 0;
499
  int ilen = disasm ? 4 : 16;
500
 
501
  for(i = from; i < to; i += ilen) {
502
    printf("%.8x: ", i);
503
    for (j = 0; j < ilen;) {
504
      int data = -1;
505
      if (!disasm) {
506
        tmp = NULL;
507
        if (verify_memoryarea(i+j)) {
508
          struct label_entry *entry;
509
          entry = get_label(i + j);
510
          if (entry)
511
            printf("(%s)", entry->name);
512
          printf("%02x ", data = evalsim_mem8(i+j));
513
        } else printf("XX ");
514
        j++;
515
      } else {
516
        int breakpoint;
517
        unsigned int _insn = read_mem(i, &breakpoint);
518
        int index = insn_decode (_insn);
519
        int len = insn_len (index);
520
 
521
        tmp = NULL;
522
        if (verify_memoryarea(i+j)) {
523
          struct label_entry *entry;
524
          entry = get_label(i + j);
525
          if (entry)
526
            printf("(%s)", entry->name);
527
 
528
          printf(": %08x ", (unsigned long)_insn);
529
          if (index >= 0) {
530
            disassemble_insn (_insn);
531
            printf(" %s", disassembled);
532
          } else
533
            printf("<invalid>");
534
        } else printf("XXXXXXXX");
535
        j += len;
536
      }
537
    }
538
    if (nl)
539
      printf ("\n");
540
  }
541
}
542
 
543
 
544 235 erez
unsigned long simmem_read_byte(unsigned long addr) {
545 297 markom
  return simmem[cur_area->misc + (addr & cur_area->size_mask)].data;
546 221 markom
}
547
 
548 235 erez
void simmem_write_byte(unsigned long addr, unsigned long value) {
549 297 markom
  simmem[cur_area->misc + (addr & cur_area->size_mask)].data = (unsigned char)value;
550 221 markom
}
551
 
552 424 markom
unsigned long simmem_read_zero(unsigned long addr) {
553
  if (config.sim.verbose)
554
    fprintf (stderr, "WARNING: memory read from non-read memory area 0x%08x.\n", addr);
555
  return 0;
556
}
557
 
558
void simmem_write_null(unsigned long addr, unsigned long value) {
559
  if (config.sim.verbose)
560
    fprintf (stderr, "WARNING: memory write to 0x%08x, non-write memory area (value 0x%08x).\n", addr, value);
561
}
562
 
563
/* Initialize memory table from a config struct */
564
 
565
void init_memory_table ()
566 221 markom
{
567 239 markom
  unsigned long memory_needed = 0;
568 424 markom
  /* If nothing was defined, use default memory block */
569
  if (config.memory.nmemories) {
570
    int i;
571
    for (i = 0; i < config.memory.nmemories; i++) {
572
      unsigned long start = config.memory.table[i].baseaddr;
573
      unsigned long length = config.memory.table[i].size;
574
      char *type = config.memory.table[i].name;
575
      int rd = config.memory.table[i].delayr;
576
      int wd = config.memory.table[i].delayw;
577
      int ce = config.memory.table[i].ce;
578
      if (config.sim.verbose)
579
        debug (1, "%08X %08X (%i KB): %s (activated by CE%i; read delay = %icyc, write delay = %icyc)\n",
580
          start, length, length >> 10, type, ce, rd, wd);
581 261 markom
      register_memoryarea(start, length, 1, &simmem_read_byte, &simmem_write_byte);
582 239 markom
      cur_area->misc = memory_needed;
583 424 markom
      cur_area->delayw = wd;
584
      cur_area->delayr = rd;
585 261 markom
      memory_needed += cur_area->size;
586 239 markom
    }
587
    printf ("\n");
588
  } else {
589 308 markom
    if (config.sim.verbose)
590 424 markom
      fprintf (stderr, "WARNING: Memory not defined, assuming standard configuration.\n");
591 261 markom
    register_memoryarea(DEFAULT_MEMORY_START, DEFAULT_MEMORY_LEN, 1, &simmem_read_byte, &simmem_write_byte);
592
    memory_needed += cur_area->size;
593 239 markom
  }
594 424 markom
 
595 239 markom
  simmem = (struct mem_entry *) malloc (sizeof (struct mem_entry) * memory_needed);
596
  if (!simmem) {
597
    fprintf (stderr, "Failed to allocate sim memory. Aborting\n");
598
    exit (-1);
599
  }
600 221 markom
}
601 424 markom
 
602
/* Changes read/write memory in read/write only */
603
 
604
void lock_memory_table ()
605
{
606
  struct dev_memarea *ptmp;
607
 
608
  /* Check list of registered devices. */
609
  for(ptmp = dev_list; ptmp; ptmp = ptmp->next) {
610
    if (ptmp->delayr < 0 && ptmp->readfunc == &simmem_read_byte)
611
      ptmp->readfunc = &simmem_read_zero;
612
    if (ptmp->delayw < 0 && ptmp->writefunc == &simmem_write_byte)
613
      ptmp->writefunc = &simmem_write_null;
614
  }
615
}

powered by: WebSVN 2.1.0

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