faults.cc (8570:ea93f18eead8) | faults.cc (8573:be51bef13962) |
---|---|
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 --- 71 unchanged lines hidden (view full) --- 80 { "interrupt", 0x0180 }; 81 82template <> FaultVals MipsFault<TrapFault>::vals = 83 { "Trap", 0x0180 }; 84 85template <> FaultVals MipsFault<BreakpointFault>::vals = 86 { "Breakpoint", 0x0180 }; 87 | 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 --- 71 unchanged lines hidden (view full) --- 80 { "interrupt", 0x0180 }; 81 82template <> FaultVals MipsFault<TrapFault>::vals = 83 { "Trap", 0x0180 }; 84 85template <> FaultVals MipsFault<BreakpointFault>::vals = 86 { "Breakpoint", 0x0180 }; 87 |
88template <> FaultVals MipsFault<ItbInvalidFault>::vals = 89 { "Invalid TLB Entry Exception (I-Fetch/LW)", 0x0180 }; | 88template <> FaultVals MipsFault<TlbInvalidFault>::vals = 89 { "Invalid TLB Entry Exception", 0x0180 }; |
90 | 90 |
91template <> FaultVals MipsFault<ItbRefillFault>::vals = 92 { "TLB Refill Exception (I-Fetch/LW)", 0x0180 }; | 91template <> FaultVals MipsFault<TlbRefillFault>::vals = 92 { "TLB Refill Exception", 0x0180 }; |
93 | 93 |
94template <> FaultVals MipsFault<DtbInvalidFault>::vals = 95 { "Invalid TLB Entry Exception (Store)", 0x0180 }; 96 97template <> FaultVals MipsFault<DtbRefillFault>::vals = 98 { "TLB Refill Exception (Store)", 0x0180 }; 99 | |
100template <> FaultVals MipsFault<TLBModifiedFault>::vals = 101 { "TLB Modified Exception", 0x0180 }; 102 103template <> FaultVals MipsFault<DspStateDisabledFault>::vals = 104 { "DSP Disabled Fault", 0x001a }; 105 106#if FULL_SYSTEM 107void --- 86 unchanged lines hidden (view full) --- 194 // Set new PC 195 Addr HandlerBase; 196 // Offset 0x180 - General Exception Vector 197 HandlerBase = vect() + tc->readMiscReg(MISCREG_EBASE); 198 setHandlerPC(HandlerBase, tc); 199} 200 201void | 94template <> FaultVals MipsFault<TLBModifiedFault>::vals = 95 { "TLB Modified Exception", 0x0180 }; 96 97template <> FaultVals MipsFault<DspStateDisabledFault>::vals = 98 { "DSP Disabled Fault", 0x001a }; 99 100#if FULL_SYSTEM 101void --- 86 unchanged lines hidden (view full) --- 188 // Set new PC 189 Addr HandlerBase; 190 // Offset 0x180 - General Exception Vector 191 HandlerBase = vect() + tc->readMiscReg(MISCREG_EBASE); 192 setHandlerPC(HandlerBase, tc); 193} 194 195void |
202DtbInvalidFault::invoke(ThreadContext *tc, StaticInstPtr inst) | 196TlbInvalidFault::invoke(ThreadContext *tc, StaticInstPtr inst) |
203{ 204 DPRINTF(MipsPRA, "%s encountered.\n", name()); | 197{ 198 DPRINTF(MipsPRA, "%s encountered.\n", name()); |
199 setExceptionState(tc, store ? 0x3 : 0x2); |
|
205 206 tc->setMiscRegNoEffect(MISCREG_BADVADDR, badVAddr); 207 EntryHiReg entryHi = tc->readMiscReg(MISCREG_ENTRYHI); 208 entryHi.asid = entryHiAsid; 209 entryHi.vpn2 = entryHiVPN2; 210 entryHi.vpn2x = entryHiVPN2X; 211 tc->setMiscRegNoEffect(MISCREG_ENTRYHI, entryHi); 212 213 ContextReg context = tc->readMiscReg(MISCREG_CONTEXT); 214 context.badVPN2 = contextBadVPN2; 215 tc->setMiscRegNoEffect(MISCREG_CONTEXT, context); | 200 201 tc->setMiscRegNoEffect(MISCREG_BADVADDR, badVAddr); 202 EntryHiReg entryHi = tc->readMiscReg(MISCREG_ENTRYHI); 203 entryHi.asid = entryHiAsid; 204 entryHi.vpn2 = entryHiVPN2; 205 entryHi.vpn2x = entryHiVPN2X; 206 tc->setMiscRegNoEffect(MISCREG_ENTRYHI, entryHi); 207 208 ContextReg context = tc->readMiscReg(MISCREG_CONTEXT); 209 context.badVPN2 = contextBadVPN2; 210 tc->setMiscRegNoEffect(MISCREG_CONTEXT, context); |
216 setExceptionState(tc, 0x3); | |
217 | 211 |
218 | |
219 // Set new PC 220 Addr HandlerBase; 221 // Offset 0x180 - General Exception Vector 222 HandlerBase = vect() + tc->readMiscReg(MISCREG_EBASE); 223 setHandlerPC(HandlerBase, tc); 224} 225 226void --- 6 unchanged lines hidden (view full) --- 233 // Set new PC 234 Addr HandlerBase; 235 // Offset 0x180 - General Exception Vector 236 HandlerBase = vect() + tc->readMiscReg(MISCREG_EBASE); 237 setHandlerPC(HandlerBase, tc); 238} 239 240void | 212 // Set new PC 213 Addr HandlerBase; 214 // Offset 0x180 - General Exception Vector 215 HandlerBase = vect() + tc->readMiscReg(MISCREG_EBASE); 216 setHandlerPC(HandlerBase, tc); 217} 218 219void --- 6 unchanged lines hidden (view full) --- 226 // Set new PC 227 Addr HandlerBase; 228 // Offset 0x180 - General Exception Vector 229 HandlerBase = vect() + tc->readMiscReg(MISCREG_EBASE); 230 setHandlerPC(HandlerBase, tc); 231} 232 233void |
241ItbInvalidFault::invoke(ThreadContext *tc, StaticInstPtr inst) | 234TlbRefillFault::invoke(ThreadContext *tc, StaticInstPtr inst) |
242{ | 235{ |
243 DPRINTF(MipsPRA, "%s encountered.\n", name()); 244 setExceptionState(tc, 0x2); 245 tc->setMiscRegNoEffect(MISCREG_BADVADDR, badVAddr); 246 EntryHiReg entryHi = tc->readMiscReg(MISCREG_ENTRYHI); 247 entryHi.asid = entryHiAsid; 248 entryHi.vpn2 = entryHiVPN2; 249 entryHi.vpn2x = entryHiVPN2X; 250 tc->setMiscRegNoEffect(MISCREG_ENTRYHI, entryHi); | 236 DPRINTF(MipsPRA, "%s encountered (%x).\n", name(), MISCREG_BADVADDR); 237 setExceptionState(tc, store ? 0x3 : 0x2); |
251 | 238 |
252 ContextReg context = tc->readMiscReg(MISCREG_CONTEXT); 253 context.badVPN2 = contextBadVPN2; 254 tc->setMiscRegNoEffect(MISCREG_CONTEXT, context); 255 256 257 // Set new PC | |
258 Addr HandlerBase; | 239 Addr HandlerBase; |
259 // Offset 0x180 - General Exception Vector 260 HandlerBase = vect() + tc->readMiscReg(MISCREG_EBASE); 261 setHandlerPC(HandlerBase,tc); 262 DPRINTF(MipsPRA, "Exception Handler At: %x , EPC set to %x\n", 263 HandlerBase, tc->readMiscReg(MISCREG_EPC)); 264} 265 266void 267ItbRefillFault::invoke(ThreadContext *tc, StaticInstPtr inst) 268{ 269 DPRINTF(MipsPRA, "%s encountered (%x).\n", name(), MISCREG_BADVADDR); 270 Addr HandlerBase; | |
271 tc->setMiscRegNoEffect(MISCREG_BADVADDR, badVAddr); 272 EntryHiReg entryHi = tc->readMiscReg(MISCREG_ENTRYHI); 273 entryHi.asid = entryHiAsid; 274 entryHi.vpn2 = entryHiVPN2; 275 entryHi.vpn2x = entryHiVPN2X; 276 tc->setMiscRegNoEffect(MISCREG_ENTRYHI, entryHi); 277 ContextReg context = tc->readMiscReg(MISCREG_CONTEXT); 278 context.badVPN2 = contextBadVPN2; --- 4 unchanged lines hidden (view full) --- 283 // See MIPS ARM Vol 3, Revision 2, Page 38 284 if (status.exl == 1) { 285 // Offset 0x180 - General Exception Vector 286 HandlerBase = vect() + tc->readMiscReg(MISCREG_EBASE); 287 } else { 288 // Offset 0x000 289 HandlerBase = tc->readMiscReg(MISCREG_EBASE); 290 } | 240 tc->setMiscRegNoEffect(MISCREG_BADVADDR, badVAddr); 241 EntryHiReg entryHi = tc->readMiscReg(MISCREG_ENTRYHI); 242 entryHi.asid = entryHiAsid; 243 entryHi.vpn2 = entryHiVPN2; 244 entryHi.vpn2x = entryHiVPN2X; 245 tc->setMiscRegNoEffect(MISCREG_ENTRYHI, entryHi); 246 ContextReg context = tc->readMiscReg(MISCREG_CONTEXT); 247 context.badVPN2 = contextBadVPN2; --- 4 unchanged lines hidden (view full) --- 252 // See MIPS ARM Vol 3, Revision 2, Page 38 253 if (status.exl == 1) { 254 // Offset 0x180 - General Exception Vector 255 HandlerBase = vect() + tc->readMiscReg(MISCREG_EBASE); 256 } else { 257 // Offset 0x000 258 HandlerBase = tc->readMiscReg(MISCREG_EBASE); 259 } |
291 292 setExceptionState(tc, 0x2); | |
293 setHandlerPC(HandlerBase, tc); 294} 295 296void | 260 setHandlerPC(HandlerBase, tc); 261} 262 263void |
297DtbRefillFault::invoke(ThreadContext *tc, StaticInstPtr inst) 298{ 299 // Set new PC 300 DPRINTF(MipsPRA, "%s encountered.\n", name()); 301 Addr HandlerBase; 302 tc->setMiscRegNoEffect(MISCREG_BADVADDR, badVAddr); 303 EntryHiReg entryHi = tc->readMiscReg(MISCREG_ENTRYHI); 304 entryHi.asid = entryHiAsid; 305 entryHi.vpn2 = entryHiVPN2; 306 entryHi.vpn2x = entryHiVPN2X; 307 tc->setMiscRegNoEffect(MISCREG_ENTRYHI, entryHi); 308 309 ContextReg context = tc->readMiscReg(MISCREG_CONTEXT); 310 context.badVPN2 = contextBadVPN2; 311 tc->setMiscRegNoEffect(MISCREG_CONTEXT, context); 312 313 StatusReg status = tc->readMiscReg(MISCREG_STATUS); 314 // Since handler depends on EXL bit, must check EXL bit before setting it!! 315 // See MIPS ARM Vol 3, Revision 2, Page 38 316 if (status.exl) { 317 // Offset 0x180 - General Exception Vector 318 HandlerBase = vect() + tc->readMiscReg(MISCREG_EBASE); 319 } else { 320 // Offset 0x000 321 HandlerBase = tc->readMiscReg(MISCREG_EBASE); 322 } 323 324 setExceptionState(tc, 0x3); 325 326 setHandlerPC(HandlerBase, tc); 327} 328 329void | |
330TLBModifiedFault::invoke(ThreadContext *tc, StaticInstPtr inst) 331{ 332 DPRINTF(MipsPRA, "%s encountered.\n", name()); 333 tc->setMiscRegNoEffect(MISCREG_BADVADDR, badVAddr); 334 EntryHiReg entryHi = tc->readMiscReg(MISCREG_ENTRYHI); 335 entryHi.asid = entryHiAsid; 336 entryHi.vpn2 = entryHiVPN2; 337 entryHi.vpn2x = entryHiVPN2X; --- 122 unchanged lines hidden --- | 264TLBModifiedFault::invoke(ThreadContext *tc, StaticInstPtr inst) 265{ 266 DPRINTF(MipsPRA, "%s encountered.\n", name()); 267 tc->setMiscRegNoEffect(MISCREG_BADVADDR, badVAddr); 268 EntryHiReg entryHi = tc->readMiscReg(MISCREG_ENTRYHI); 269 entryHi.asid = entryHiAsid; 270 entryHi.vpn2 = entryHiVPN2; 271 entryHi.vpn2x = entryHiVPN2X; --- 122 unchanged lines hidden --- |