interrupts.hh (5655:74f76480407f) interrupts.hh (5691:28d6ff8b94e2)
1/*
2 * Copyright (c) 2007 The Hewlett-Packard Development Company
3 * All rights reserved.
4 *
5 * Redistribution and use of this software in source and binary forms,
6 * with or without modification, are permitted provided that the
7 * following conditions are met:
8 *

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

74{
75
76class Interrupts : public BasicPioDevice, IntDev
77{
78 protected:
79 // Storage for the APIC registers
80 uint32_t regs[NUM_APIC_REGS];
81
1/*
2 * Copyright (c) 2007 The Hewlett-Packard Development Company
3 * All rights reserved.
4 *
5 * Redistribution and use of this software in source and binary forms,
6 * with or without modification, are permitted provided that the
7 * following conditions are met:
8 *

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

74{
75
76class Interrupts : public BasicPioDevice, IntDev
77{
78 protected:
79 // Storage for the APIC registers
80 uint32_t regs[NUM_APIC_REGS];
81
82 BitUnion32(LVTEntry)
83 Bitfield<7, 0> vector;
84 Bitfield<10, 8> deliveryMode;
85 Bitfield<12> status;
86 Bitfield<13> polarity;
87 Bitfield<14> remoteIRR;
88 Bitfield<15> trigger;
89 Bitfield<16> masked;
90 Bitfield<17> periodic;
91 EndBitUnion(LVTEntry)
92
82 /*
83 * Timing related stuff.
84 */
85 Tick latency;
86 Tick clock;
87
88 class ApicTimerEvent : public Event
89 {
93 /*
94 * Timing related stuff.
95 */
96 Tick latency;
97 Tick clock;
98
99 class ApicTimerEvent : public Event
100 {
101 private:
102 Interrupts *localApic;
90 public:
103 public:
91 ApicTimerEvent() : Event()
104 ApicTimerEvent(Interrupts *_localApic) :
105 Event(), localApic(_localApic)
92 {}
93
94 void process()
95 {
106 {}
107
108 void process()
109 {
96 warn("Local APIC timer event doesn't do anything!\n");
110 assert(localApic);
111 if (localApic->triggerTimerInterrupt()) {
112 localApic->setReg(APIC_INITIAL_COUNT,
113 localApic->readReg(APIC_INITIAL_COUNT));
114 }
97 }
98 };
99
100 ApicTimerEvent apicTimerEvent;
101
102 /*
103 * A set of variables to keep track of interrupts that don't go through
104 * the IRR.
105 */
106 bool pendingSmi;
115 }
116 };
117
118 ApicTimerEvent apicTimerEvent;
119
120 /*
121 * A set of variables to keep track of interrupts that don't go through
122 * the IRR.
123 */
124 bool pendingSmi;
107 TriggerIntMessage smiMessage;
125 uint8_t smiVector;
108 bool pendingNmi;
126 bool pendingNmi;
109 TriggerIntMessage nmiMessage;
127 uint8_t nmiVector;
110 bool pendingExtInt;
128 bool pendingExtInt;
111 TriggerIntMessage extIntMessage;
129 uint8_t extIntVector;
112 bool pendingInit;
130 bool pendingInit;
113 TriggerIntMessage initMessage;
131 uint8_t initVector;
114
115 // This is a quick check whether any of the above (except ExtInt) are set.
116 bool pendingUnmaskableInt;
117
118 /*
119 * IRR and ISR maintenance.
120 */
121 uint8_t IRRV;

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

158 }
159
160 bool
161 getRegArrayBit(ApicRegIndex base, uint8_t vector)
162 {
163 return bits(regs[base + (vector % 32)], vector >> 5);
164 }
165
132
133 // This is a quick check whether any of the above (except ExtInt) are set.
134 bool pendingUnmaskableInt;
135
136 /*
137 * IRR and ISR maintenance.
138 */
139 uint8_t IRRV;

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

176 }
177
178 bool
179 getRegArrayBit(ApicRegIndex base, uint8_t vector)
180 {
181 return bits(regs[base + (vector % 32)], vector >> 5);
182 }
183
184 void requestInterrupt(uint8_t vector, uint8_t deliveryMode, bool level);
185
166 public:
167 /*
168 * Params stuff.
169 */
170 typedef X86LocalApicParams Params;
171
172 void setClock(Tick newClock)
173 {

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

182
183 /*
184 * Functions to interact with the interrupt port from IntDev.
185 */
186 Tick read(PacketPtr pkt);
187 Tick write(PacketPtr pkt);
188 Tick recvMessage(PacketPtr pkt);
189
186 public:
187 /*
188 * Params stuff.
189 */
190 typedef X86LocalApicParams Params;
191
192 void setClock(Tick newClock)
193 {

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

202
203 /*
204 * Functions to interact with the interrupt port from IntDev.
205 */
206 Tick read(PacketPtr pkt);
207 Tick write(PacketPtr pkt);
208 Tick recvMessage(PacketPtr pkt);
209
210 bool
211 triggerTimerInterrupt()
212 {
213 LVTEntry entry = regs[APIC_LVT_TIMER];
214 if (!entry.masked)
215 requestInterrupt(entry.vector, entry.deliveryMode, entry.trigger);
216 return entry.periodic;
217 }
218
190 void addressRanges(AddrRangeList &range_list)
191 {
192 range_list.clear();
193 range_list.push_back(RangeEx(x86LocalAPICAddress(0, 0),
194 x86LocalAPICAddress(0, 0) + PageBytes));
195 }
196
197 void getIntAddrRange(AddrRangeList &range_list)

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

220 }
221
222 /*
223 * Constructor.
224 */
225
226 Interrupts(Params * p) : BasicPioDevice(p), IntDev(this),
227 latency(p->pio_latency), clock(0),
219 void addressRanges(AddrRangeList &range_list)
220 {
221 range_list.clear();
222 range_list.push_back(RangeEx(x86LocalAPICAddress(0, 0),
223 x86LocalAPICAddress(0, 0) + PageBytes));
224 }
225
226 void getIntAddrRange(AddrRangeList &range_list)

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

249 }
250
251 /*
252 * Constructor.
253 */
254
255 Interrupts(Params * p) : BasicPioDevice(p), IntDev(this),
256 latency(p->pio_latency), clock(0),
228 pendingSmi(false), smiMessage(0),
229 pendingNmi(false), nmiMessage(0),
230 pendingExtInt(false), extIntMessage(0),
231 pendingInit(false), initMessage(0),
257 apicTimerEvent(this),
258 pendingSmi(false), smiVector(0),
259 pendingNmi(false), nmiVector(0),
260 pendingExtInt(false), extIntVector(0),
261 pendingInit(false), initVector(0),
232 pendingUnmaskableInt(false)
233 {
234 pioSize = PageBytes;
235 memset(regs, 0, sizeof(regs));
236 //Set the local apic DFR to the flat model.
237 regs[APIC_DESTINATION_FORMAT] = (uint32_t)(-1);
238 ISRV = 0;
239 IRRV = 0;

--- 47 unchanged lines hidden ---
262 pendingUnmaskableInt(false)
263 {
264 pioSize = PageBytes;
265 memset(regs, 0, sizeof(regs));
266 //Set the local apic DFR to the flat model.
267 regs[APIC_DESTINATION_FORMAT] = (uint32_t)(-1);
268 ISRV = 0;
269 IRRV = 0;

--- 47 unchanged lines hidden ---