interrupts.hh (5254:c555f8b07345) interrupts.hh (5646:0a488a147fb8)
1/*
2 * Copyright (c) 2007 MIPS Technologies, Inc.
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: Rick Strong
29 */
30
31#ifndef __ARCH_MIPS_INTERRUPT_HH__
32#define __ARCH_MIPS_INTERRUPT_HH__
33
34
35#include "arch/mips/faults.hh"
36#include "base/compiler.hh"
37
38
39
40namespace MipsISA
41{
42class Interrupts
43{
44 /*
45 protected:
46 uint8_t intstatus;
47 bool oncputimerintr;
48 public:
49 Interrupts()
50 {
51 intstatus = 0;
52 newInfoSet = false;
53 oncputimerintr = false;
54
55 }
56 // post(int int_num, int index) is responsible
57 // for posting an interrupt. It sets a bit
58 // in intstatus corresponding to Cause IP*. The
59 // MIPS register Cause is updated by updateIntrInfo
60 // which is called by check_interrupts
61 //
62 void post(int int_num, int index);
63 // clear(int int_num, int index) is responsible
64 // for clearing an interrupt. It clear a bit
65 // in intstatus corresponding to Cause IP*. The
66 // MIPS register Cause is updated by updateIntrInfo
67 // which is called by check_interrupts
68 //
69 void clear(int int_num, int index);
70 // clear_all() is responsible
71 // for clearing all interrupts. It clears all bits
72 // in intstatus corresponding to Cause IP*. The
73 // MIPS register Cause is updated by updateIntrInfo
74 // which is called by check_interrupts
75 //
76 void clear_all();
77
78 // getInterrupt(ThreadContext * tc) checks if an interrupt
79 // should be returned. It ands the interrupt mask and
80 // and interrupt pending bits to see if one exists. It
81 // also makes sure interrupts are enabled (IE) and
82 // that ERL and ERX are not set
83 //
84 Fault getInterrupt(ThreadContext * tc);
85
86 // updateIntrInfo(ThreadContext *tc) const syncs the
87 // MIPS cause register with the instatus variable. instatus
88 // is essentially a copy of the MIPS cause[IP7:IP0]
89 //
90 void updateIntrInfo(ThreadContext *tc) const;
91 void updateIntrInfoCpuTimerIntr(ThreadContext *tc) const;
92 bool onCpuTimerInterrupt(ThreadContext *tc) const;
93
1/*
2 * Copyright (c) 2007 MIPS Technologies, Inc.
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: Rick Strong
29 */
30
31#ifndef __ARCH_MIPS_INTERRUPT_HH__
32#define __ARCH_MIPS_INTERRUPT_HH__
33
34
35#include "arch/mips/faults.hh"
36#include "base/compiler.hh"
37
38
39
40namespace MipsISA
41{
42class Interrupts
43{
44 /*
45 protected:
46 uint8_t intstatus;
47 bool oncputimerintr;
48 public:
49 Interrupts()
50 {
51 intstatus = 0;
52 newInfoSet = false;
53 oncputimerintr = false;
54
55 }
56 // post(int int_num, int index) is responsible
57 // for posting an interrupt. It sets a bit
58 // in intstatus corresponding to Cause IP*. The
59 // MIPS register Cause is updated by updateIntrInfo
60 // which is called by check_interrupts
61 //
62 void post(int int_num, int index);
63 // clear(int int_num, int index) is responsible
64 // for clearing an interrupt. It clear a bit
65 // in intstatus corresponding to Cause IP*. The
66 // MIPS register Cause is updated by updateIntrInfo
67 // which is called by check_interrupts
68 //
69 void clear(int int_num, int index);
70 // clear_all() is responsible
71 // for clearing all interrupts. It clears all bits
72 // in intstatus corresponding to Cause IP*. The
73 // MIPS register Cause is updated by updateIntrInfo
74 // which is called by check_interrupts
75 //
76 void clear_all();
77
78 // getInterrupt(ThreadContext * tc) checks if an interrupt
79 // should be returned. It ands the interrupt mask and
80 // and interrupt pending bits to see if one exists. It
81 // also makes sure interrupts are enabled (IE) and
82 // that ERL and ERX are not set
83 //
84 Fault getInterrupt(ThreadContext * tc);
85
86 // updateIntrInfo(ThreadContext *tc) const syncs the
87 // MIPS cause register with the instatus variable. instatus
88 // is essentially a copy of the MIPS cause[IP7:IP0]
89 //
90 void updateIntrInfo(ThreadContext *tc) const;
91 void updateIntrInfoCpuTimerIntr(ThreadContext *tc) const;
92 bool onCpuTimerInterrupt(ThreadContext *tc) const;
93
94 uint64_t get_vec(int int_num);
95
96 bool check_interrupts(ThreadContext * tc) const{
97 //return (intstatus != 0) && !(tc->readPC() & 0x3);
98 if (oncputimerintr == false){
99 updateIntrInfo(tc);
100 return ((intstatus != 0) || onCpuTimerInterrupt(tc));
101 }
102 else
103 return true;
104
105 }
106 */
107
108
109 protected:
110 //uint8_t intstatus;
111 //bool oncputimerintr;
112 public:
113 Interrupts()
114 {
115 //intstatus = 0;
116 newInfoSet = false;
117 //oncputimerintr = false;
118
119 }
120 // post(int int_num, int index) is responsible
121 // for posting an interrupt. It sets a bit
122 // in intstatus corresponding to Cause IP*. The
123 // MIPS register Cause is updated by updateIntrInfo
124 // which is called by check_interrupts
125 //
126 void post(int int_num, ThreadContext* tc);
127 void post(int int_num, int index);
128
129 // clear(int int_num, int index) is responsible
130 // for clearing an interrupt. It clear a bit
131 // in intstatus corresponding to Cause IP*. The
132 // MIPS register Cause is updated by updateIntrInfo
133 // which is called by check_interrupts
134 //
135 void clear(int int_num, ThreadContext* tc);
136 void clear(int int_num, int index);
137
138 // clear_all() is responsible
139 // for clearing all interrupts. It clears all bits
140 // in intstatus corresponding to Cause IP*. The
141 // MIPS register Cause is updated by updateIntrInfo
142 // which is called by check_interrupts
143 //
144 void clear_all(ThreadContext* tc);
145 void clear_all();
146
147 // getInterrupt(ThreadContext * tc) checks if an interrupt
148 // should be returned. It ands the interrupt mask and
149 // and interrupt pending bits to see if one exists. It
150 // also makes sure interrupts are enabled (IE) and
151 // that ERL and ERX are not set
152 //
153 Fault getInterrupt(ThreadContext * tc);
154
155 // updateIntrInfo(ThreadContext *tc) const syncs the
156 // MIPS cause register with the instatus variable. instatus
157 // is essentially a copy of the MIPS cause[IP7:IP0]
158 //
159 void updateIntrInfo(ThreadContext *tc) const;
160 bool interruptsPending(ThreadContext *tc) const;
161 bool onCpuTimerInterrupt(ThreadContext *tc) const;
162
94 bool check_interrupts(ThreadContext * tc) const{
95 //return (intstatus != 0) && !(tc->readPC() & 0x3);
96 if (oncputimerintr == false){
97 updateIntrInfo(tc);
98 return ((intstatus != 0) || onCpuTimerInterrupt(tc));
99 }
100 else
101 return true;
102
103 }
104 */
105
106
107 protected:
108 //uint8_t intstatus;
109 //bool oncputimerintr;
110 public:
111 Interrupts()
112 {
113 //intstatus = 0;
114 newInfoSet = false;
115 //oncputimerintr = false;
116
117 }
118 // post(int int_num, int index) is responsible
119 // for posting an interrupt. It sets a bit
120 // in intstatus corresponding to Cause IP*. The
121 // MIPS register Cause is updated by updateIntrInfo
122 // which is called by check_interrupts
123 //
124 void post(int int_num, ThreadContext* tc);
125 void post(int int_num, int index);
126
127 // clear(int int_num, int index) is responsible
128 // for clearing an interrupt. It clear a bit
129 // in intstatus corresponding to Cause IP*. The
130 // MIPS register Cause is updated by updateIntrInfo
131 // which is called by check_interrupts
132 //
133 void clear(int int_num, ThreadContext* tc);
134 void clear(int int_num, int index);
135
136 // clear_all() is responsible
137 // for clearing all interrupts. It clears all bits
138 // in intstatus corresponding to Cause IP*. The
139 // MIPS register Cause is updated by updateIntrInfo
140 // which is called by check_interrupts
141 //
142 void clear_all(ThreadContext* tc);
143 void clear_all();
144
145 // getInterrupt(ThreadContext * tc) checks if an interrupt
146 // should be returned. It ands the interrupt mask and
147 // and interrupt pending bits to see if one exists. It
148 // also makes sure interrupts are enabled (IE) and
149 // that ERL and ERX are not set
150 //
151 Fault getInterrupt(ThreadContext * tc);
152
153 // updateIntrInfo(ThreadContext *tc) const syncs the
154 // MIPS cause register with the instatus variable. instatus
155 // is essentially a copy of the MIPS cause[IP7:IP0]
156 //
157 void updateIntrInfo(ThreadContext *tc) const;
158 bool interruptsPending(ThreadContext *tc) const;
159 bool onCpuTimerInterrupt(ThreadContext *tc) const;
160
163 uint64_t get_vec(int int_num);
164
165 bool check_interrupts(ThreadContext * tc) const{
166 return interruptsPending(tc);
167 }
168
169
170 void serialize(std::ostream &os)
171 {
172 fatal("Serialization of Interrupts Unimplemented for MIPS");
173 //SERIALIZE_ARRAY(interrupts, NumInterruptLevels);
174 //SERIALIZE_SCALAR(intstatus);
175 }
176
177 void unserialize(Checkpoint *cp, const std::string &section)
178 {
179 fatal("Unserialization of Interrupts Unimplemented for MIPS");
180 //UNSERIALIZE_ARRAY(interrupts, NumInterruptLevels);
181 //UNSERIALIZE_SCALAR(intstatus);
182 }
183
184
185
186 private:
187 bool newInfoSet;
188 int newIpl;
189 int newSummary;
190
191};
192
193}
194
195#endif
196
161 bool check_interrupts(ThreadContext * tc) const{
162 return interruptsPending(tc);
163 }
164
165
166 void serialize(std::ostream &os)
167 {
168 fatal("Serialization of Interrupts Unimplemented for MIPS");
169 //SERIALIZE_ARRAY(interrupts, NumInterruptLevels);
170 //SERIALIZE_SCALAR(intstatus);
171 }
172
173 void unserialize(Checkpoint *cp, const std::string &section)
174 {
175 fatal("Unserialization of Interrupts Unimplemented for MIPS");
176 //UNSERIALIZE_ARRAY(interrupts, NumInterruptLevels);
177 //UNSERIALIZE_SCALAR(intstatus);
178 }
179
180
181
182 private:
183 bool newInfoSet;
184 int newIpl;
185 int newSummary;
186
187};
188
189}
190
191#endif
192