faults.cc (2665:a124942bacb8) faults.cc (2680:246e7104f744)
1/*
2 * Copyright (c) 2003-2005 The Regents of The University of Michigan
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are
7 * met: redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer;
9 * redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution;
12 * neither the name of the copyright holders nor the names of its
13 * contributors may be used to endorse or promote products derived from
14 * this software without specific prior written permission.
15 *
16 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
17 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
18 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
19 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
20 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
26 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27 *
28 * Authors: Gabe Black
29 * Kevin Lim
30 */
31
32#include "arch/sparc/faults.hh"
1/*
2 * Copyright (c) 2003-2005 The Regents of The University of Michigan
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are
7 * met: redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer;
9 * redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution;
12 * neither the name of the copyright holders nor the names of its
13 * contributors may be used to endorse or promote products derived from
14 * this software without specific prior written permission.
15 *
16 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
17 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
18 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
19 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
20 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
26 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27 *
28 * Authors: Gabe Black
29 * Kevin Lim
30 */
31
32#include "arch/sparc/faults.hh"
33#include "cpu/exec_context.hh"
33#include "cpu/thread_context.hh"
34#include "cpu/base.hh"
35#include "base/trace.hh"
36
37namespace SparcISA
38{
39
40FaultName InternalProcessorError::_name = "intprocerr";
41TrapType InternalProcessorError::_trapType = 0x029;
42FaultPriority InternalProcessorError::_priority = 4;
43FaultStat InternalProcessorError::_count;
44
45FaultName MemAddressNotAligned::_name = "unalign";
46TrapType MemAddressNotAligned::_trapType = 0x034;
47FaultPriority MemAddressNotAligned::_priority = 10;
48FaultStat MemAddressNotAligned::_count;
49
50FaultName PowerOnReset::_name = "pow_reset";
51TrapType PowerOnReset::_trapType = 0x001;
52FaultPriority PowerOnReset::_priority = 0;
53FaultStat PowerOnReset::_count;
54
55FaultName WatchDogReset::_name = "watch_dog_reset";
56TrapType WatchDogReset::_trapType = 0x002;
57FaultPriority WatchDogReset::_priority = 1;
58FaultStat WatchDogReset::_count;
59
60FaultName ExternallyInitiatedReset::_name = "extern_reset";
61TrapType ExternallyInitiatedReset::_trapType = 0x003;
62FaultPriority ExternallyInitiatedReset::_priority = 1;
63FaultStat ExternallyInitiatedReset::_count;
64
65FaultName SoftwareInitiatedReset::_name = "software_reset";
66TrapType SoftwareInitiatedReset::_trapType = 0x004;
67FaultPriority SoftwareInitiatedReset::_priority = 1;
68FaultStat SoftwareInitiatedReset::_count;
69
70FaultName REDStateException::_name = "red_counte";
71TrapType REDStateException::_trapType = 0x005;
72FaultPriority REDStateException::_priority = 1;
73FaultStat REDStateException::_count;
74
75FaultName InstructionAccessException::_name = "inst_access";
76TrapType InstructionAccessException::_trapType = 0x008;
77FaultPriority InstructionAccessException::_priority = 5;
78FaultStat InstructionAccessException::_count;
79
80FaultName InstructionAccessMMUMiss::_name = "inst_mmu";
81TrapType InstructionAccessMMUMiss::_trapType = 0x009;
82FaultPriority InstructionAccessMMUMiss::_priority = 2;
83FaultStat InstructionAccessMMUMiss::_count;
84
85FaultName InstructionAccessError::_name = "inst_error";
86TrapType InstructionAccessError::_trapType = 0x00A;
87FaultPriority InstructionAccessError::_priority = 3;
88FaultStat InstructionAccessError::_count;
89
90FaultName IllegalInstruction::_name = "illegal_inst";
91TrapType IllegalInstruction::_trapType = 0x010;
92FaultPriority IllegalInstruction::_priority = 7;
93FaultStat IllegalInstruction::_count;
94
95FaultName PrivilegedOpcode::_name = "priv_opcode";
96TrapType PrivilegedOpcode::_trapType = 0x011;
97FaultPriority PrivilegedOpcode::_priority = 6;
98FaultStat PrivilegedOpcode::_count;
99
100FaultName UnimplementedLDD::_name = "unimp_ldd";
101TrapType UnimplementedLDD::_trapType = 0x012;
102FaultPriority UnimplementedLDD::_priority = 6;
103FaultStat UnimplementedLDD::_count;
104
105FaultName UnimplementedSTD::_name = "unimp_std";
106TrapType UnimplementedSTD::_trapType = 0x013;
107FaultPriority UnimplementedSTD::_priority = 6;
108FaultStat UnimplementedSTD::_count;
109
110FaultName FpDisabled::_name = "fp_disabled";
111TrapType FpDisabled::_trapType = 0x020;
112FaultPriority FpDisabled::_priority = 8;
113FaultStat FpDisabled::_count;
114
115FaultName FpExceptionIEEE754::_name = "fp_754";
116TrapType FpExceptionIEEE754::_trapType = 0x021;
117FaultPriority FpExceptionIEEE754::_priority = 11;
118FaultStat FpExceptionIEEE754::_count;
119
120FaultName FpExceptionOther::_name = "fp_other";
121TrapType FpExceptionOther::_trapType = 0x022;
122FaultPriority FpExceptionOther::_priority = 11;
123FaultStat FpExceptionOther::_count;
124
125FaultName TagOverflow::_name = "tag_overflow";
126TrapType TagOverflow::_trapType = 0x023;
127FaultPriority TagOverflow::_priority = 14;
128FaultStat TagOverflow::_count;
129
130FaultName DivisionByZero::_name = "div_by_zero";
131TrapType DivisionByZero::_trapType = 0x028;
132FaultPriority DivisionByZero::_priority = 15;
133FaultStat DivisionByZero::_count;
134
135FaultName DataAccessException::_name = "data_access";
136TrapType DataAccessException::_trapType = 0x030;
137FaultPriority DataAccessException::_priority = 12;
138FaultStat DataAccessException::_count;
139
140FaultName DataAccessMMUMiss::_name = "data_mmu";
141TrapType DataAccessMMUMiss::_trapType = 0x031;
142FaultPriority DataAccessMMUMiss::_priority = 12;
143FaultStat DataAccessMMUMiss::_count;
144
145FaultName DataAccessError::_name = "data_error";
146TrapType DataAccessError::_trapType = 0x032;
147FaultPriority DataAccessError::_priority = 12;
148FaultStat DataAccessError::_count;
149
150FaultName DataAccessProtection::_name = "data_protection";
151TrapType DataAccessProtection::_trapType = 0x033;
152FaultPriority DataAccessProtection::_priority = 12;
153FaultStat DataAccessProtection::_count;
154
155FaultName LDDFMemAddressNotAligned::_name = "unalign_lddf";
156TrapType LDDFMemAddressNotAligned::_trapType = 0x035;
157FaultPriority LDDFMemAddressNotAligned::_priority = 10;
158FaultStat LDDFMemAddressNotAligned::_count;
159
160FaultName STDFMemAddressNotAligned::_name = "unalign_stdf";
161TrapType STDFMemAddressNotAligned::_trapType = 0x036;
162FaultPriority STDFMemAddressNotAligned::_priority = 10;
163FaultStat STDFMemAddressNotAligned::_count;
164
165FaultName PrivilegedAction::_name = "priv_action";
166TrapType PrivilegedAction::_trapType = 0x037;
167FaultPriority PrivilegedAction::_priority = 11;
168FaultStat PrivilegedAction::_count;
169
170FaultName LDQFMemAddressNotAligned::_name = "unalign_ldqf";
171TrapType LDQFMemAddressNotAligned::_trapType = 0x038;
172FaultPriority LDQFMemAddressNotAligned::_priority = 10;
173FaultStat LDQFMemAddressNotAligned::_count;
174
175FaultName STQFMemAddressNotAligned::_name = "unalign_stqf";
176TrapType STQFMemAddressNotAligned::_trapType = 0x039;
177FaultPriority STQFMemAddressNotAligned::_priority = 10;
178FaultStat STQFMemAddressNotAligned::_count;
179
180FaultName AsyncDataError::_name = "async_data";
181TrapType AsyncDataError::_trapType = 0x040;
182FaultPriority AsyncDataError::_priority = 2;
183FaultStat AsyncDataError::_count;
184
185FaultName CleanWindow::_name = "clean_win";
186TrapType CleanWindow::_trapType = 0x024;
187FaultPriority CleanWindow::_priority = 10;
188FaultStat CleanWindow::_count;
189
190//The enumerated faults
191
192FaultName InterruptLevelN::_name = "interrupt_n";
193TrapType InterruptLevelN::_baseTrapType = 0x041;
194FaultStat InterruptLevelN::_count;
195
196FaultName SpillNNormal::_name = "spill_n_normal";
197TrapType SpillNNormal::_baseTrapType = 0x080;
198FaultPriority SpillNNormal::_priority = 9;
199FaultStat SpillNNormal::_count;
200
201FaultName SpillNOther::_name = "spill_n_other";
202TrapType SpillNOther::_baseTrapType = 0x0A0;
203FaultPriority SpillNOther::_priority = 9;
204FaultStat SpillNOther::_count;
205
206FaultName FillNNormal::_name = "fill_n_normal";
207TrapType FillNNormal::_baseTrapType = 0x0C0;
208FaultPriority FillNNormal::_priority = 9;
209FaultStat FillNNormal::_count;
210
211FaultName FillNOther::_name = "fill_n_other";
212TrapType FillNOther::_baseTrapType = 0x0E0;
213FaultPriority FillNOther::_priority = 9;
214FaultStat FillNOther::_count;
215
216FaultName TrapInstruction::_name = "trap_inst_n";
217TrapType TrapInstruction::_baseTrapType = 0x100;
218FaultPriority TrapInstruction::_priority = 16;
219FaultStat TrapInstruction::_count;
220
221#if FULL_SYSTEM
222
34#include "cpu/base.hh"
35#include "base/trace.hh"
36
37namespace SparcISA
38{
39
40FaultName InternalProcessorError::_name = "intprocerr";
41TrapType InternalProcessorError::_trapType = 0x029;
42FaultPriority InternalProcessorError::_priority = 4;
43FaultStat InternalProcessorError::_count;
44
45FaultName MemAddressNotAligned::_name = "unalign";
46TrapType MemAddressNotAligned::_trapType = 0x034;
47FaultPriority MemAddressNotAligned::_priority = 10;
48FaultStat MemAddressNotAligned::_count;
49
50FaultName PowerOnReset::_name = "pow_reset";
51TrapType PowerOnReset::_trapType = 0x001;
52FaultPriority PowerOnReset::_priority = 0;
53FaultStat PowerOnReset::_count;
54
55FaultName WatchDogReset::_name = "watch_dog_reset";
56TrapType WatchDogReset::_trapType = 0x002;
57FaultPriority WatchDogReset::_priority = 1;
58FaultStat WatchDogReset::_count;
59
60FaultName ExternallyInitiatedReset::_name = "extern_reset";
61TrapType ExternallyInitiatedReset::_trapType = 0x003;
62FaultPriority ExternallyInitiatedReset::_priority = 1;
63FaultStat ExternallyInitiatedReset::_count;
64
65FaultName SoftwareInitiatedReset::_name = "software_reset";
66TrapType SoftwareInitiatedReset::_trapType = 0x004;
67FaultPriority SoftwareInitiatedReset::_priority = 1;
68FaultStat SoftwareInitiatedReset::_count;
69
70FaultName REDStateException::_name = "red_counte";
71TrapType REDStateException::_trapType = 0x005;
72FaultPriority REDStateException::_priority = 1;
73FaultStat REDStateException::_count;
74
75FaultName InstructionAccessException::_name = "inst_access";
76TrapType InstructionAccessException::_trapType = 0x008;
77FaultPriority InstructionAccessException::_priority = 5;
78FaultStat InstructionAccessException::_count;
79
80FaultName InstructionAccessMMUMiss::_name = "inst_mmu";
81TrapType InstructionAccessMMUMiss::_trapType = 0x009;
82FaultPriority InstructionAccessMMUMiss::_priority = 2;
83FaultStat InstructionAccessMMUMiss::_count;
84
85FaultName InstructionAccessError::_name = "inst_error";
86TrapType InstructionAccessError::_trapType = 0x00A;
87FaultPriority InstructionAccessError::_priority = 3;
88FaultStat InstructionAccessError::_count;
89
90FaultName IllegalInstruction::_name = "illegal_inst";
91TrapType IllegalInstruction::_trapType = 0x010;
92FaultPriority IllegalInstruction::_priority = 7;
93FaultStat IllegalInstruction::_count;
94
95FaultName PrivilegedOpcode::_name = "priv_opcode";
96TrapType PrivilegedOpcode::_trapType = 0x011;
97FaultPriority PrivilegedOpcode::_priority = 6;
98FaultStat PrivilegedOpcode::_count;
99
100FaultName UnimplementedLDD::_name = "unimp_ldd";
101TrapType UnimplementedLDD::_trapType = 0x012;
102FaultPriority UnimplementedLDD::_priority = 6;
103FaultStat UnimplementedLDD::_count;
104
105FaultName UnimplementedSTD::_name = "unimp_std";
106TrapType UnimplementedSTD::_trapType = 0x013;
107FaultPriority UnimplementedSTD::_priority = 6;
108FaultStat UnimplementedSTD::_count;
109
110FaultName FpDisabled::_name = "fp_disabled";
111TrapType FpDisabled::_trapType = 0x020;
112FaultPriority FpDisabled::_priority = 8;
113FaultStat FpDisabled::_count;
114
115FaultName FpExceptionIEEE754::_name = "fp_754";
116TrapType FpExceptionIEEE754::_trapType = 0x021;
117FaultPriority FpExceptionIEEE754::_priority = 11;
118FaultStat FpExceptionIEEE754::_count;
119
120FaultName FpExceptionOther::_name = "fp_other";
121TrapType FpExceptionOther::_trapType = 0x022;
122FaultPriority FpExceptionOther::_priority = 11;
123FaultStat FpExceptionOther::_count;
124
125FaultName TagOverflow::_name = "tag_overflow";
126TrapType TagOverflow::_trapType = 0x023;
127FaultPriority TagOverflow::_priority = 14;
128FaultStat TagOverflow::_count;
129
130FaultName DivisionByZero::_name = "div_by_zero";
131TrapType DivisionByZero::_trapType = 0x028;
132FaultPriority DivisionByZero::_priority = 15;
133FaultStat DivisionByZero::_count;
134
135FaultName DataAccessException::_name = "data_access";
136TrapType DataAccessException::_trapType = 0x030;
137FaultPriority DataAccessException::_priority = 12;
138FaultStat DataAccessException::_count;
139
140FaultName DataAccessMMUMiss::_name = "data_mmu";
141TrapType DataAccessMMUMiss::_trapType = 0x031;
142FaultPriority DataAccessMMUMiss::_priority = 12;
143FaultStat DataAccessMMUMiss::_count;
144
145FaultName DataAccessError::_name = "data_error";
146TrapType DataAccessError::_trapType = 0x032;
147FaultPriority DataAccessError::_priority = 12;
148FaultStat DataAccessError::_count;
149
150FaultName DataAccessProtection::_name = "data_protection";
151TrapType DataAccessProtection::_trapType = 0x033;
152FaultPriority DataAccessProtection::_priority = 12;
153FaultStat DataAccessProtection::_count;
154
155FaultName LDDFMemAddressNotAligned::_name = "unalign_lddf";
156TrapType LDDFMemAddressNotAligned::_trapType = 0x035;
157FaultPriority LDDFMemAddressNotAligned::_priority = 10;
158FaultStat LDDFMemAddressNotAligned::_count;
159
160FaultName STDFMemAddressNotAligned::_name = "unalign_stdf";
161TrapType STDFMemAddressNotAligned::_trapType = 0x036;
162FaultPriority STDFMemAddressNotAligned::_priority = 10;
163FaultStat STDFMemAddressNotAligned::_count;
164
165FaultName PrivilegedAction::_name = "priv_action";
166TrapType PrivilegedAction::_trapType = 0x037;
167FaultPriority PrivilegedAction::_priority = 11;
168FaultStat PrivilegedAction::_count;
169
170FaultName LDQFMemAddressNotAligned::_name = "unalign_ldqf";
171TrapType LDQFMemAddressNotAligned::_trapType = 0x038;
172FaultPriority LDQFMemAddressNotAligned::_priority = 10;
173FaultStat LDQFMemAddressNotAligned::_count;
174
175FaultName STQFMemAddressNotAligned::_name = "unalign_stqf";
176TrapType STQFMemAddressNotAligned::_trapType = 0x039;
177FaultPriority STQFMemAddressNotAligned::_priority = 10;
178FaultStat STQFMemAddressNotAligned::_count;
179
180FaultName AsyncDataError::_name = "async_data";
181TrapType AsyncDataError::_trapType = 0x040;
182FaultPriority AsyncDataError::_priority = 2;
183FaultStat AsyncDataError::_count;
184
185FaultName CleanWindow::_name = "clean_win";
186TrapType CleanWindow::_trapType = 0x024;
187FaultPriority CleanWindow::_priority = 10;
188FaultStat CleanWindow::_count;
189
190//The enumerated faults
191
192FaultName InterruptLevelN::_name = "interrupt_n";
193TrapType InterruptLevelN::_baseTrapType = 0x041;
194FaultStat InterruptLevelN::_count;
195
196FaultName SpillNNormal::_name = "spill_n_normal";
197TrapType SpillNNormal::_baseTrapType = 0x080;
198FaultPriority SpillNNormal::_priority = 9;
199FaultStat SpillNNormal::_count;
200
201FaultName SpillNOther::_name = "spill_n_other";
202TrapType SpillNOther::_baseTrapType = 0x0A0;
203FaultPriority SpillNOther::_priority = 9;
204FaultStat SpillNOther::_count;
205
206FaultName FillNNormal::_name = "fill_n_normal";
207TrapType FillNNormal::_baseTrapType = 0x0C0;
208FaultPriority FillNNormal::_priority = 9;
209FaultStat FillNNormal::_count;
210
211FaultName FillNOther::_name = "fill_n_other";
212TrapType FillNOther::_baseTrapType = 0x0E0;
213FaultPriority FillNOther::_priority = 9;
214FaultStat FillNOther::_count;
215
216FaultName TrapInstruction::_name = "trap_inst_n";
217TrapType TrapInstruction::_baseTrapType = 0x100;
218FaultPriority TrapInstruction::_priority = 16;
219FaultStat TrapInstruction::_count;
220
221#if FULL_SYSTEM
222
223void SparcFault::invoke(ExecContext * xc)
223void SparcFault::invoke(ThreadContext * tc)
224{
224{
225 FaultBase::invoke(xc);
225 FaultBase::invoke(tc);
226 countStat()++;
227
228 //Use the SPARC trap state machine
229 /*// exception restart address
226 countStat()++;
227
228 //Use the SPARC trap state machine
229 /*// exception restart address
230 if (setRestartAddress() || !xc->inPalMode())
231 xc->setMiscReg(AlphaISA::IPR_EXC_ADDR, xc->regs.pc);
230 if (setRestartAddress() || !tc->inPalMode())
231 tc->setMiscReg(AlphaISA::IPR_EXC_ADDR, tc->regs.pc);
232
233 if (skipFaultingInstruction()) {
234 // traps... skip faulting instruction.
232
233 if (skipFaultingInstruction()) {
234 // traps... skip faulting instruction.
235 xc->setMiscReg(AlphaISA::IPR_EXC_ADDR,
236 xc->readMiscReg(AlphaISA::IPR_EXC_ADDR) + 4);
235 tc->setMiscReg(AlphaISA::IPR_EXC_ADDR,
236 tc->readMiscReg(AlphaISA::IPR_EXC_ADDR) + 4);
237 }
238
237 }
238
239 if (!xc->inPalMode())
240 AlphaISA::swap_palshadow(&(xc->regs), true);
239 if (!tc->inPalMode())
240 AlphaISA::swap_palshadow(&(tc->regs), true);
241
241
242 xc->regs.pc = xc->readMiscReg(AlphaISA::IPR_PAL_BASE) + vect();
243 xc->regs.npc = xc->regs.pc + sizeof(MachInst);*/
242 tc->regs.pc = tc->readMiscReg(AlphaISA::IPR_PAL_BASE) + vect();
243 tc->regs.npc = tc->regs.pc + sizeof(MachInst);*/
244}
245
246#endif
247
248#if !FULL_SYSTEM
249
244}
245
246#endif
247
248#if !FULL_SYSTEM
249
250void TrapInstruction::invoke(ExecContext * xc)
250void TrapInstruction::invoke(ThreadContext * tc)
251{
251{
252 xc->syscall(syscall_num);
252 tc->syscall(syscall_num);
253}
254
255#endif
256
257} // namespace SparcISA
258
253}
254
255#endif
256
257} // namespace SparcISA
258