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 |
93 /* 94 * Timing related stuff. 95 */ 96 Tick latency; 97 Tick clock; 98 99 class ApicTimerEvent : public Event 100 { |
101 private: 102 Interrupts *localApic; |
103 public: |
104 ApicTimerEvent(Interrupts *_localApic) : 105 Event(), localApic(_localApic) |
106 {} 107 108 void process() 109 { |
110 assert(localApic); 111 if (localApic->triggerTimerInterrupt()) { 112 localApic->setReg(APIC_INITIAL_COUNT, 113 localApic->readReg(APIC_INITIAL_COUNT)); 114 } |
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; |
125 uint8_t smiVector; |
126 bool pendingNmi; |
127 uint8_t nmiVector; |
128 bool pendingExtInt; |
129 uint8_t extIntVector; |
130 bool pendingInit; |
131 uint8_t initVector; |
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 |
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 |
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), |
257 apicTimerEvent(this), 258 pendingSmi(false), smiVector(0), 259 pendingNmi(false), nmiVector(0), 260 pendingExtInt(false), extIntVector(0), 261 pendingInit(false), initVector(0), |
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 --- |