faults.hh (8591:8f23aeaf6a91) faults.hh (8696:642f83fafffb)
1/*
2 * Copyright (c) 2003-2005 The Regents of The University of Michigan
3 * Copyright (c) 2007 MIPS Technologies, Inc.
4 * All rights reserved.
5 *
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions are
8 * met: redistributions of source code must retain the above copyright

--- 15 unchanged lines hidden (view full) ---

24 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
25 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
26 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
27 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28 *
29 * Authors: Gabe Black
30 * Korey Sewell
31 * Jaidev Patwardhan
1/*
2 * Copyright (c) 2003-2005 The Regents of The University of Michigan
3 * Copyright (c) 2007 MIPS Technologies, Inc.
4 * All rights reserved.
5 *
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions are
8 * met: redistributions of source code must retain the above copyright

--- 15 unchanged lines hidden (view full) ---

24 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
25 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
26 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
27 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28 *
29 * Authors: Gabe Black
30 * Korey Sewell
31 * Jaidev Patwardhan
32 * Zhengxing Li
33 * Deyuan Guo
32 */
33
34#ifndef __MIPS_FAULTS_HH__
35#define __MIPS_FAULTS_HH__
36
37#include "arch/mips/pra_constants.hh"
38#include "cpu/thread_context.hh"
39#include "debug/MipsPRA.hh"

--- 42 unchanged lines hidden (view full) ---

82
83 void setExceptionState(ThreadContext *, uint8_t);
84
85 virtual FaultVect offset(ThreadContext *tc) const = 0;
86 virtual ExcCode code() const = 0;
87 virtual FaultVect base(ThreadContext *tc) const
88 {
89 StatusReg status = tc->readMiscReg(MISCREG_STATUS);
34 */
35
36#ifndef __MIPS_FAULTS_HH__
37#define __MIPS_FAULTS_HH__
38
39#include "arch/mips/pra_constants.hh"
40#include "cpu/thread_context.hh"
41#include "debug/MipsPRA.hh"

--- 42 unchanged lines hidden (view full) ---

84
85 void setExceptionState(ThreadContext *, uint8_t);
86
87 virtual FaultVect offset(ThreadContext *tc) const = 0;
88 virtual ExcCode code() const = 0;
89 virtual FaultVect base(ThreadContext *tc) const
90 {
91 StatusReg status = tc->readMiscReg(MISCREG_STATUS);
90 if (status.bev)
92 if (!status.bev)
91 return tc->readMiscReg(MISCREG_EBASE);
92 else
93 return 0xbfc00200;
94 }
95
96 FaultVect
97 vect(ThreadContext *tc) const
98 {

--- 62 unchanged lines hidden (view full) ---

161 void
162 invoke(ThreadContext * tc,
163 StaticInstPtr inst = StaticInst::nullStaticInstPtr)
164 {
165 MipsFault<CoprocessorUnusableFault>::invoke(tc, inst);
166 if (FULL_SYSTEM) {
167 CauseReg cause = tc->readMiscReg(MISCREG_CAUSE);
168 cause.ce = coProcID;
93 return tc->readMiscReg(MISCREG_EBASE);
94 else
95 return 0xbfc00200;
96 }
97
98 FaultVect
99 vect(ThreadContext *tc) const
100 {

--- 62 unchanged lines hidden (view full) ---

163 void
164 invoke(ThreadContext * tc,
165 StaticInstPtr inst = StaticInst::nullStaticInstPtr)
166 {
167 MipsFault<CoprocessorUnusableFault>::invoke(tc, inst);
168 if (FULL_SYSTEM) {
169 CauseReg cause = tc->readMiscReg(MISCREG_CAUSE);
170 cause.ce = coProcID;
169 tc->setMiscReg(MISCREG_CAUSE, cause);
171 tc->setMiscRegNoEffect(MISCREG_CAUSE, cause);
170 }
171 }
172};
173
174class InterruptFault : public MipsFault<InterruptFault>
175{
176 public:
177 FaultVect
178 offset(ThreadContext *tc) const
179 {
180 CauseReg cause = tc->readMiscRegNoEffect(MISCREG_CAUSE);
172 }
173 }
174};
175
176class InterruptFault : public MipsFault<InterruptFault>
177{
178 public:
179 FaultVect
180 offset(ThreadContext *tc) const
181 {
182 CauseReg cause = tc->readMiscRegNoEffect(MISCREG_CAUSE);
181 return cause.iv ? 0x200 : 0x000;
183 // offset 0x200 for release 2, 0x180 for release 1.
184 return cause.iv ? 0x200 : 0x180;
182 }
183};
184
185template <typename T>
186class AddressFault : public MipsFault<T>
187{
188 protected:
189 Addr vaddr;

--- 55 unchanged lines hidden (view full) ---

245 tc->setMiscRegNoEffect(MISCREG_CONTEXT, context);
246 }
247
248 void
249 invoke(ThreadContext * tc,
250 StaticInstPtr inst = StaticInst::nullStaticInstPtr)
251 {
252 if (FULL_SYSTEM) {
185 }
186};
187
188template <typename T>
189class AddressFault : public MipsFault<T>
190{
191 protected:
192 Addr vaddr;

--- 55 unchanged lines hidden (view full) ---

248 tc->setMiscRegNoEffect(MISCREG_CONTEXT, context);
249 }
250
251 void
252 invoke(ThreadContext * tc,
253 StaticInstPtr inst = StaticInst::nullStaticInstPtr)
254 {
255 if (FULL_SYSTEM) {
253 DPRINTF(MipsPRA, "Fault %s encountered.\n", name());
254 tc->pcState(this->vect(tc));
256 DPRINTF(MipsPRA, "Fault %s encountered.\n", this->name());
257 Addr vect = this->vect(tc);
255 setTlbExceptionState(tc, this->code());
258 setTlbExceptionState(tc, this->code());
259 tc->pcState(vect);
256 } else {
257 AddressFault<T>::invoke(tc, inst);
258 }
259 }
260
261 ExcCode
262 code() const
263 {

--- 40 unchanged lines hidden ---
260 } else {
261 AddressFault<T>::invoke(tc, inst);
262 }
263 }
264
265 ExcCode
266 code() const
267 {

--- 40 unchanged lines hidden ---