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 383

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 262 markom
      printf ("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
  memaddr = simulate_ic_mmu_fetch(memaddr);
271
  if (DEBUG_ENABLED)
272
    *breakpoint += CheckDebugUnit(DebugLoadAddress,memaddr); /* 28/05/01 CZ */
273
  temp = evalsim_mem32(memaddr);
274
  if (DEBUG_ENABLED)
275
    *breakpoint += CheckDebugUnit(DebugLoadData,temp);  /* MM170901 */
276
  return temp;
277
}
278
 
279 221 markom
unsigned long evalsim_mem32(unsigned long memaddr)
280 66 lampret
{
281 239 markom
  unsigned long temp;
282 221 markom
 
283 239 markom
  if (verify_memoryarea(memaddr)) {
284
    switch(cur_area->granularity) {
285
    case 1:
286
      temp = cur_area->readfunc(memaddr) << 24;
287
      temp |= cur_area->readfunc(memaddr + 1) << 16;
288
      temp |= cur_area->readfunc(memaddr + 2) << 8;
289
      temp |= cur_area->readfunc(memaddr + 3);
290
      break;
291
    case 2:
292
      temp = cur_area->readfunc(memaddr) << 16;
293
      temp |= cur_area->readfunc(memaddr + 2);
294
      break;
295
    case 4:
296
      temp = cur_area->readfunc(memaddr);
297
      break;
298
    }
299
  } else {
300
    printf("EXCEPTION: read out of memory (32-bit access to %.8lx)\n", memaddr);
301
    cont_run = 0;
302
    temp = 0;
303
  }
304
  return temp;
305 2 cvs
}
306
 
307
/* Returns 16-bit values from mem array. Big endian version. */
308
 
309 123 markom
unsigned short eval_mem16(unsigned long memaddr,int* breakpoint)
310 2 cvs
{
311 239 markom
  unsigned short temp;
312
  memaddr = simulate_dc_mmu_load(memaddr);
313 270 markom
  if (DEBUG_ENABLED)
314
    *breakpoint += CheckDebugUnit(DebugLoadAddress,memaddr); /* 28/05/01 CZ */
315 66 lampret
 
316 239 markom
  temp = evalsim_mem16(memaddr);
317 270 markom
  if (DEBUG_ENABLED)
318
    *breakpoint += CheckDebugUnit(DebugLoadData,temp);  /* MM170901 */
319 239 markom
  return temp;
320 66 lampret
}
321
 
322 221 markom
unsigned short evalsim_mem16(unsigned long memaddr)
323 66 lampret
{
324 239 markom
  unsigned short temp;
325 221 markom
 
326 239 markom
  if (verify_memoryarea(memaddr)) {
327
    switch(cur_area->granularity) {
328
    case 1:
329
      temp = cur_area->readfunc(memaddr) << 8;
330
      temp |= cur_area->readfunc(memaddr + 1);
331
      break;
332
    case 2:
333
      temp = cur_area->readfunc(memaddr);
334
      break;
335
    case 4:
336
      printf("EXCEPTION: read 16-bit value from 32-bit region (address 0x%08lX)\n", cur_area->granularity * 8, memaddr);
337
      cont_run = 0;
338
      break;
339
    }
340
  } else {
341
    printf("EXCEPTION: read out of memory (16-bit access to %.8lx)\n", memaddr);
342
    cont_run = 0;
343
    temp = 0;
344
  }
345
  return temp;
346 2 cvs
}
347
 
348
 
349 6 lampret
/* Returns 8-bit values from mem array. */
350 2 cvs
 
351 123 markom
unsigned char eval_mem8(unsigned long memaddr,int* breakpoint)
352 221 markom
{
353 239 markom
  unsigned char temp;
354
  memaddr = simulate_dc_mmu_load(memaddr);
355 270 markom
  if (DEBUG_ENABLED)
356
    *breakpoint += CheckDebugUnit(DebugLoadAddress,memaddr);  /* 28/05/01 CZ */
357 6 lampret
 
358 239 markom
  temp = evalsim_mem8(memaddr);
359 270 markom
  if (DEBUG_ENABLED)
360
    *breakpoint += CheckDebugUnit(DebugLoadData,temp);  /* MM170901 */
361 239 markom
  return temp;
362 66 lampret
}
363
 
364 221 markom
unsigned char evalsim_mem8(unsigned long memaddr)
365
{
366 239 markom
  unsigned char temp;
367 123 markom
 
368 239 markom
  if (verify_memoryarea(memaddr)) {
369
    switch(cur_area->granularity) {
370
    case 1:
371
      temp = cur_area->readfunc(memaddr);
372
      break;
373
    case 2:
374
    case 4:
375
      printf("EXCEPTION: read 8-bit value from %u-bit region (address 0x%08lX)\n", cur_area->granularity * 8, memaddr);
376
      cont_run = 0;
377
      break;
378
    }
379
  } else {
380
    printf("EXCEPTION: read out of memory (8-bit access to %.8lx)\n", memaddr);
381
    cont_run = 0;
382
    temp = 0;
383
  }
384
  return temp;
385 2 cvs
}
386
 
387
/* Set mem, 32-bit. Big endian version. */
388
 
389 123 markom
void set_mem32(unsigned long memaddr, unsigned long value,int* breakpoint)
390 2 cvs
{
391 239 markom
  slp_checkaccess(memaddr, SLP_MEMWRITE);
392
  memaddr = simulate_dc_mmu_store(memaddr);
393 221 markom
 
394 270 markom
  if (DEBUG_ENABLED) {
395
    *breakpoint += CheckDebugUnit(DebugStoreAddress,memaddr);  /* 28/05/01 CZ */
396
    *breakpoint += CheckDebugUnit(DebugStoreData,value);
397
  }
398 123 markom
 
399 239 markom
  setsim_mem32(memaddr, value);
400 66 lampret
}
401
 
402
void setsim_mem32(unsigned long memaddr, unsigned long value)
403
{
404 239 markom
  struct dev_memarea *dev;
405 66 lampret
 
406 239 markom
  if (verify_memoryarea(memaddr)) {
407
    switch(cur_area->granularity) {
408
    case 1:
409 251 erez
      cur_area->writefunc(memaddr    , (value >> 24) & 0xFF);
410 239 markom
      cur_area->writefunc(memaddr + 1, (value >> 16) & 0xFF);
411 251 erez
      cur_area->writefunc(memaddr + 2, (value >>  8) & 0xFF);
412
      cur_area->writefunc(memaddr + 3, (value      ) & 0xFF);
413 239 markom
      break;
414
    case 2:
415
      cur_area->writefunc(memaddr, (value >> 16) & 0xFFFF);
416
      cur_area->writefunc(memaddr + 2, value & 0xFFFF);
417
      break;
418
    case 4:
419
      cur_area->writefunc(memaddr, value);
420
      break;
421 242 markom
    }
422 239 markom
  } else {
423
    printf("EXCEPTION: write out of memory (32-bit access to %.8lx)\n", memaddr);
424
    cont_run = 0;
425
  }
426 2 cvs
}
427
 
428
/* Set mem, 16-bit. Big endian version. */
429
 
430 123 markom
void set_mem16(unsigned long memaddr, unsigned short value,int* breakpoint)
431 2 cvs
{
432 239 markom
  memaddr = simulate_dc_mmu_store(memaddr);
433 221 markom
 
434 270 markom
  if (DEBUG_ENABLED) {
435
    *breakpoint += CheckDebugUnit(DebugStoreAddress,memaddr);  /* 28/05/01 CZ */
436
    *breakpoint += CheckDebugUnit(DebugStoreData,value);
437
  }
438 123 markom
 
439 239 markom
  setsim_mem16(memaddr, value);
440 66 lampret
}
441
 
442
void setsim_mem16(unsigned long memaddr, unsigned short value)
443
{
444 239 markom
  if (verify_memoryarea(memaddr)) {
445
    switch(cur_area->granularity) {
446
    case 1:
447
      cur_area->writefunc(memaddr, (value >> 8) & 0xFF);
448
      cur_area->writefunc(memaddr + 1, value & 0xFF);
449
      break;
450
    case 2:
451 251 erez
      cur_area->writefunc(memaddr, value & 0xFFFF);
452 239 markom
      break;
453
    case 4:
454
      printf("EXCEPTION: write 16-bit value to 32-bit region (address 0x%08lX)\n", memaddr);
455
      cont_run = 0;
456
      break;
457
    }
458
  } else {
459
    printf("EXCEPTION: write out of memory (16-bit access to %.8lx)\n", memaddr);
460
    cont_run = 0;
461
  }
462 2 cvs
}
463
 
464 6 lampret
/* Set mem, 8-bit. */
465 2 cvs
 
466 123 markom
void set_mem8(unsigned long memaddr, unsigned char value,int* breakpoint)
467 2 cvs
{
468 239 markom
  memaddr = simulate_dc_mmu_store(memaddr);
469 221 markom
 
470 270 markom
  if (DEBUG_ENABLED) {
471
    *breakpoint += CheckDebugUnit(DebugStoreAddress,memaddr);  /* 28/05/01 CZ */
472
    *breakpoint += CheckDebugUnit(DebugStoreData,value);
473
  }
474 123 markom
 
475 239 markom
  setsim_mem8(memaddr, value);
476 66 lampret
}
477
 
478
void setsim_mem8(unsigned long memaddr, unsigned char value)
479
{
480 239 markom
  if (verify_memoryarea(memaddr)) {
481
    if (cur_area->granularity == 1)
482
      cur_area->writefunc(memaddr, value);
483
    else {
484
      printf("EXCEPTION: write 8-bit value to %u-bit region (address 0x%08lX)\n", cur_area->granularity * 8, memaddr);
485
      cont_run = 0;
486
    }
487
  } else {
488
    printf("EXCEPTION: write out of memory (8-bit access to %.8lx)\n", memaddr);
489
    cont_run = 0;
490
  }
491 2 cvs
}
492 30 lampret
 
493 361 markom
void dumpmemory(unsigned int from, unsigned int to, int disasm, int nl)
494
{
495
  unsigned int i, j;
496
  struct label_entry *tmp;
497
  int breakpoint = 0;
498
  int ilen = disasm ? 4 : 16;
499
 
500
  for(i = from; i < to; i += ilen) {
501
    printf("%.8x: ", i);
502
    for (j = 0; j < ilen;) {
503
      int data = -1;
504
      if (!disasm) {
505
        tmp = NULL;
506
        if (verify_memoryarea(i+j)) {
507
          struct label_entry *entry;
508
          entry = get_label(i + j);
509
          if (entry)
510
            printf("(%s)", entry->name);
511
          printf("%02x ", data = evalsim_mem8(i+j));
512
        } else printf("XX ");
513
        j++;
514
      } else {
515
        int breakpoint;
516
        unsigned int _insn = read_mem(i, &breakpoint);
517
        int index = insn_decode (_insn);
518
        int len = insn_len (index);
519
 
520
        tmp = NULL;
521
        if (verify_memoryarea(i+j)) {
522
          struct label_entry *entry;
523
          entry = get_label(i + j);
524
          if (entry)
525
            printf("(%s)", entry->name);
526
 
527
          printf(": %08x ", (unsigned long)_insn);
528
          if (index >= 0) {
529
            disassemble_insn (_insn);
530
            printf(" %s", disassembled);
531
          } else
532
            printf("<invalid>");
533
        } else printf("XXXXXXXX");
534
        j += len;
535
      }
536
    }
537
    if (nl)
538
      printf ("\n");
539
  }
540
}
541
 
542
 
543 235 erez
unsigned long simmem_read_byte(unsigned long addr) {
544 297 markom
  return simmem[cur_area->misc + (addr & cur_area->size_mask)].data;
545 221 markom
}
546
 
547 235 erez
void simmem_write_byte(unsigned long addr, unsigned long value) {
548 297 markom
  simmem[cur_area->misc + (addr & cur_area->size_mask)].data = (unsigned char)value;
549 221 markom
}
550
 
551 239 markom
/* Initialize memory table from a file. Syntax:
552 261 markom
   start_address1 length1 type1 [ce1 [delayr1 [delayw1]]]
553
   start_address2 length2 type2 [ce2 [delayr2 [delayw2]]]
554
   start_address3 length3 type3 [ce3 [delayr3 [delayw3]]]
555 239 markom
 
556
   Example:
557
   00000100 00001F00 flash 3 100
558
   80000000 00010000 RAM
559
  */
560 221 markom
void sim_read_memory_table (char *filename)
561
{
562 239 markom
  FILE *f;
563
  unsigned long memory_needed = 0;
564
  char *home = getenv("HOME");
565
  char ctmp[256];
566
  int local = 1;
567 383 markom
  int gce = -1;
568 239 markom
  sprintf(ctmp, "%s/.or1k/%s", home, filename);
569
  if ((f = fopen (filename, "rt")) != NULL
570
      || home != NULL && !(local = 0) && (f = fopen (ctmp, "rt")) != NULL) {
571
    unsigned long start, length;
572
    char type[100];
573
    int nparam;
574 261 markom
    int rd, wd, ce;
575 308 markom
    if (config.sim.verbose)
576
      printf ("Reading memory table from '%s':\n", local ? filename : ctmp);
577 383 markom
      while ((nparam = fscanf (f, ">%08x %08x %s %i %i %i\n", &start, &length, &type, &ce, &rd, &wd)) >= 3 && nparam <= 6) {
578 261 markom
      if (nparam < 4)
579
        ce = gce + 1;
580
      if (nparam < 5)
581 239 markom
        rd = 1;
582 261 markom
      if (nparam < 6)
583 239 markom
        wd = 1;
584 261 markom
 
585
      gce = ce;
586 383 markom
      printf ("%08X %08X (%i KB): %s (activated by CE%i; read delay = %icyc, write delay = %icyc)\n",
587
        start, length, length >> 10, type, ce, rd, wd);
588 261 markom
      register_memoryarea(start, length, 1, &simmem_read_byte, &simmem_write_byte);
589 239 markom
      cur_area->misc = memory_needed;
590 261 markom
      memory_needed += cur_area->size;
591 239 markom
    }
592
    fclose (f);
593
    printf ("\n");
594
  } else {
595 308 markom
    if (config.sim.verbose)
596
      fprintf (stderr, "WARNING: Cannot read memory table from '%s',\nneither '%s', assuming standard configuration.\n", filename, ctmp);
597 261 markom
    register_memoryarea(DEFAULT_MEMORY_START, DEFAULT_MEMORY_LEN, 1, &simmem_read_byte, &simmem_write_byte);
598
    memory_needed += cur_area->size;
599 239 markom
  }
600
 
601
  simmem = (struct mem_entry *) malloc (sizeof (struct mem_entry) * memory_needed);
602
  if (!simmem) {
603
    fprintf (stderr, "Failed to allocate sim memory. Aborting\n");
604
    exit (-1);
605
  }
606 221 markom
}

powered by: WebSVN 2.1.0

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