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

Subversion Repositories or1k

[/] [or1k/] [tags/] [nog_patch_47/] [or1ksim/] [cpu/] [or1k/] [except.c] - Blame information for rev 997

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 33 lampret
/* except.c -- Simulation of OR1K exceptions
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
#include <stdlib.h>
21
#include <stdio.h>
22
#include <string.h>
23
 
24
#include "abstract.h"
25
#include "except.h"
26
#include "sprs.h"
27 344 markom
#include "sim-config.h"
28 33 lampret
 
29
extern int cont_run;
30
extern struct iqueue_entry iqueue[20];
31
extern unsigned long pc;
32 82 lampret
extern unsigned long pcnext;
33 123 markom
extern unsigned long pc_phy;
34 51 lampret
extern struct iqueue_entry iqueue[];
35 33 lampret
 
36 82 lampret
extern int delay_insn;
37
 
38 437 simons
struct _pending pending;
39 139 chris
 
40 479 markom
/* Discards all pending exceptions */
41
void clear_pending_exception()
42 139 chris
{
43 479 markom
  pending.valid = 0;
44
  pending.type = 0;
45
  pending.address = 0;
46
  pending.saved = 0;
47 139 chris
}
48
 
49 479 markom
/* Asserts OR1K exception. */
50 33 lampret
void except_handle(int except, unsigned long ea)
51
{
52 479 markom
  if(debug_ignore_exception (except)) {
53
    clear_pending_exception ();
54
  } else {
55
    pending.valid = 1;
56
    pending.type = except;
57
    pending.address = ea;
58
    if (delay_insn)
59
      pending.saved = pc - 4;
60
    else
61
      pending.saved = pc;
62 997 markom
    if (config.sim.verbose) PRINTF("Exception 0x%x (%s) at 0x%x, EA: 0x%x, ppc: 0x%x, npc: 0x%x\n",
63 693 markom
                                   except, EXCEPT_NAME(except), iqueue[0].insn_addr, ea, pc, pcnext);
64 479 markom
  }
65 139 chris
}
66
 
67 479 markom
/* Actually handles exception */
68
void except_handle_backend (int except, unsigned long ea, unsigned long pc_saved)
69 139 chris
{
70 33 lampret
#if ONLY_VIRTUAL_MACHINE
71 479 markom
  fprintf(stderr, "WARNING: No exception processing while ONLY_VIRTUAL_MACHINE is defined.\n");
72
  cont_run = 0;
73 33 lampret
#else
74 51 lampret
 
75 479 markom
  if (delay_insn) {
76 997 markom
    if (config.sim.verbose) PRINTF("INFO: Exception during execution of delay slot insn.\n");
77 479 markom
    pc -= 4;
78
  }
79 693 markom
 
80 556 markom
  pc_saved = pc & ~0x3;
81 458 simons
  if (except == EXCEPT_ILLEGAL)
82 556 markom
    mtspr(SPR_EPCR_BASE, pending.saved);
83 458 simons
  else if (except == EXCEPT_ALIGN)
84
    mtspr(SPR_EPCR_BASE, pending.saved);
85
  else if (except == EXCEPT_DTLBMISS)
86
    mtspr(SPR_EPCR_BASE, pending.saved);
87
  else if (except == EXCEPT_DPF)
88
    mtspr(SPR_EPCR_BASE, pending.saved);
89
  else if (except == EXCEPT_BUSERR)
90
    mtspr(SPR_EPCR_BASE, pending.saved);
91
  else if (except == EXCEPT_TRAP)
92
    mtspr(SPR_EPCR_BASE, pending.saved);
93
  else if (except == EXCEPT_RANGE)
94
    mtspr(SPR_EPCR_BASE, pending.saved);
95 572 simons
  else if (except == EXCEPT_ITLBMISS)
96
    mtspr(SPR_EPCR_BASE, pending.saved);
97
  else if (except == EXCEPT_IPF)
98
    mtspr(SPR_EPCR_BASE, pending.saved);
99 458 simons
  else
100 479 markom
    mtspr(SPR_EPCR_BASE, pc_saved);
101 458 simons
 
102 479 markom
  mtspr(SPR_EEAR_BASE, ea);
103
  mtspr(SPR_ESR_BASE, mfspr(SPR_SR));
104 64 lampret
 
105 479 markom
  /* Address translation is always disabled when starting exception. */
106
  mtspr(SPR_SR, mfspr(SPR_SR) & ~(SPR_SR_DME));
107
  mtspr(SPR_SR, mfspr(SPR_SR) & ~(SPR_SR_IME));
108 64 lampret
 
109 479 markom
  mtspr(SPR_SR, mfspr(SPR_SR) & ~SPR_SR_OVE);   /* Disable overflow flag exception. */
110 458 simons
 
111 599 simons
  mtspr(SPR_SR, mfspr(SPR_SR) | SPR_SR_SM);     /* SUPV mode */
112
  mtspr(SPR_SR, mfspr(SPR_SR) & ~(SPR_SR_IEE | SPR_SR_TEE));    /* Disable interrupts. */
113 167 markom
 
114 479 markom
  clear_pending_exception ();
115 458 simons
 
116 599 simons
  pc = (unsigned long)except + (testsprbits (SPR_SR, SPR_SR_EPH) ? 0xf0000000 : 0x00000000);
117 556 markom
 
118 479 markom
  /* This has been removed. All exceptions (not just SYSCALL) suffer
119
     from the same problem. The solution is to continue just like
120
     the pipeline would, and issue the exception on the next
121
     clock cycle. We assume now that this function is being called
122
     ->BEFORE<- the instruction fetch and after the previous update
123
     which always yields the correct behavior. This has the added
124
     advantage that a debugger can prevent an exception from
125
     taking place by resetting the pc. */
126 139 chris
#if 0
127 479 markom
  /* MM: We do pc update after the execute (in the simulator), so we
128
     decrease it by 4 so that next instruction points to first exception
129
     instruction.  Do NOT comment this out. */
130
  if (except == EXCEPT_SYSCALL)
131
    pc -= 4;
132 139 chris
#endif
133 479 markom
  pcnext = pc + 4;
134 123 markom
 
135 479 markom
  /* Added by CZ 27/05/01 */
136
  pc_phy = pc;      /* An exception always turns off the MMU, so
137
           pc is always pc_phy */
138 139 chris
 
139 556 markom
#endif /* !ONLY_VIRUAL_MACHINE */
140 33 lampret
}

powered by: WebSVN 2.1.0

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