tlb.cc (10474:799c8ee4ecba) tlb.cc (10553:c1ad57c53a36)
1/*
2 * Copyright (c) 2007-2008 The Hewlett-Packard Development Company
3 * All rights reserved.
4 *
5 * The license below extends only to copyright in the software and shall
6 * not be construed as granting a license to any other intellectual
7 * property including but not limited to intellectual property relating
8 * to a hardware implementation of the functionality of the software

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

227 }
228}
229
230Fault
231TLB::finalizePhysical(RequestPtr req, ThreadContext *tc, Mode mode) const
232{
233 Addr paddr = req->getPaddr();
234
1/*
2 * Copyright (c) 2007-2008 The Hewlett-Packard Development Company
3 * All rights reserved.
4 *
5 * The license below extends only to copyright in the software and shall
6 * not be construed as granting a license to any other intellectual
7 * property including but not limited to intellectual property relating
8 * to a hardware implementation of the functionality of the software

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

227 }
228}
229
230Fault
231TLB::finalizePhysical(RequestPtr req, ThreadContext *tc, Mode mode) const
232{
233 Addr paddr = req->getPaddr();
234
235 // Check for an access to the local APIC
236 if (FullSystem) {
235 AddrRange m5opRange(0xFFFF0000, 0xFFFFFFFF);
236
237 if (m5opRange.contains(paddr)) {
238 if (m5opRange.contains(paddr)) {
239 req->setFlags(Request::MMAPPED_IPR | Request::GENERIC_IPR);
240 req->setPaddr(GenericISA::iprAddressPseudoInst(
241 (paddr >> 8) & 0xFF,
242 paddr & 0xFF));
243 }
244 } else if (FullSystem) {
245 // Check for an access to the local APIC
237 LocalApicBase localApicBase =
238 tc->readMiscRegNoEffect(MISCREG_APIC_BASE);
239 AddrRange apicRange(localApicBase.base * PageBytes,
240 (localApicBase.base + 1) * PageBytes - 1);
241
246 LocalApicBase localApicBase =
247 tc->readMiscRegNoEffect(MISCREG_APIC_BASE);
248 AddrRange apicRange(localApicBase.base * PageBytes,
249 (localApicBase.base + 1) * PageBytes - 1);
250
242 AddrRange m5opRange(0xFFFF0000, 0xFFFFFFFF);
243
244 if (apicRange.contains(paddr)) {
245 // The Intel developer's manuals say the below restrictions apply,
246 // but the linux kernel, because of a compiler optimization, breaks
247 // them.
248 /*
249 // Check alignment
250 if (paddr & ((32/8) - 1))
251 return new GeneralProtection(0);
252 // Check access size
253 if (req->getSize() != (32/8))
254 return new GeneralProtection(0);
255 */
256 // Force the access to be uncacheable.
257 req->setFlags(Request::UNCACHEABLE);
258 req->setPaddr(x86LocalAPICAddress(tc->contextId(),
259 paddr - apicRange.start()));
251 if (apicRange.contains(paddr)) {
252 // The Intel developer's manuals say the below restrictions apply,
253 // but the linux kernel, because of a compiler optimization, breaks
254 // them.
255 /*
256 // Check alignment
257 if (paddr & ((32/8) - 1))
258 return new GeneralProtection(0);
259 // Check access size
260 if (req->getSize() != (32/8))
261 return new GeneralProtection(0);
262 */
263 // Force the access to be uncacheable.
264 req->setFlags(Request::UNCACHEABLE);
265 req->setPaddr(x86LocalAPICAddress(tc->contextId(),
266 paddr - apicRange.start()));
260 } else if (m5opRange.contains(paddr)) {
261 req->setFlags(Request::MMAPPED_IPR | Request::GENERIC_IPR);
262 req->setPaddr(GenericISA::iprAddressPseudoInst(
263 (paddr >> 8) & 0xFF,
264 paddr & 0xFF));
265 }
266 }
267
268 return NoFault;
269}
270
271Fault
272TLB::translate(RequestPtr req, ThreadContext *tc, Translation *translation,

--- 232 unchanged lines hidden ---
267 }
268 }
269
270 return NoFault;
271}
272
273Fault
274TLB::translate(RequestPtr req, ThreadContext *tc, Translation *translation,

--- 232 unchanged lines hidden ---