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 --- |