interrupts.cc (6137:d3ee4e0d690c) | interrupts.cc (6138:6cbdd76b93db) |
---|---|
1/* 2 * Copyright (c) 2008 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 * --- 496 unchanged lines hidden (view full) --- 505 message.vector = low.vector; 506 message.deliveryMode = low.deliveryMode; 507 message.destMode = low.destMode; 508 message.level = low.level; 509 message.trigger = low.trigger; 510 bool timing = sys->getMemoryMode() == Enums::timing; 511 // Be careful no updates of the delivery status bit get lost. 512 regs[APIC_INTERRUPT_COMMAND_LOW] = low; | 1/* 2 * Copyright (c) 2008 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 * --- 496 unchanged lines hidden (view full) --- 505 message.vector = low.vector; 506 message.deliveryMode = low.deliveryMode; 507 message.destMode = low.destMode; 508 message.level = low.level; 509 message.trigger = low.trigger; 510 bool timing = sys->getMemoryMode() == Enums::timing; 511 // Be careful no updates of the delivery status bit get lost. 512 regs[APIC_INTERRUPT_COMMAND_LOW] = low; |
513 ApicList apics; 514 int numContexts = sys->numContexts(); |
|
513 switch (low.destShorthand) { 514 case 0: | 515 switch (low.destShorthand) { 516 case 0: |
515 pendingIPIs++; 516 intPort->sendMessage(message, timing); 517 newVal = regs[APIC_INTERRUPT_COMMAND_LOW]; | 517 if (message.deliveryMode == DeliveryMode::LowestPriority) { 518 panic("Lowest priority delivery mode " 519 "IPIs aren't implemented.\n"); 520 } 521 if (message.destMode == 1) { 522 int dest = message.destination; 523 hack_once("Assuming logical destinations are 1 << id.\n"); 524 for (int i = 0; i < numContexts; i++) { 525 if (dest & 0x1) 526 apics.push_back(i); 527 dest = dest >> 1; 528 } 529 } else { 530 if (message.destination == 0xFF) { 531 for (int i = 0; i < numContexts; i++) { 532 if (i == initialApicId) { 533 requestInterrupt(message.vector, 534 message.deliveryMode, message.trigger); 535 } else { 536 apics.push_back(i); 537 } 538 } 539 } else { 540 if (message.destination == initialApicId) { 541 requestInterrupt(message.vector, 542 message.deliveryMode, message.trigger); 543 } else { 544 apics.push_back(message.destination); 545 } 546 } 547 } |
518 break; 519 case 1: 520 newVal = val; 521 requestInterrupt(message.vector, 522 message.deliveryMode, message.trigger); 523 break; 524 case 2: 525 requestInterrupt(message.vector, 526 message.deliveryMode, message.trigger); 527 // Fall through 528 case 3: 529 { | 548 break; 549 case 1: 550 newVal = val; 551 requestInterrupt(message.vector, 552 message.deliveryMode, message.trigger); 553 break; 554 case 2: 555 requestInterrupt(message.vector, 556 message.deliveryMode, message.trigger); 557 // Fall through 558 case 3: 559 { |
530 int numContexts = sys->numContexts(); 531 pendingIPIs += (numContexts - 1); | |
532 for (int i = 0; i < numContexts; i++) { | 560 for (int i = 0; i < numContexts; i++) { |
533 int thisId = sys->getThreadContext(i)->contextId(); 534 if (thisId != initialApicId) { 535 PacketPtr pkt = buildIntRequest(thisId, message); 536 if (timing) 537 intPort->sendMessageTiming(pkt, latency); 538 else 539 intPort->sendMessageAtomic(pkt); | 561 if (i != initialApicId) { 562 apics.push_back(i); |
540 } 541 } 542 } | 563 } 564 } 565 } |
543 newVal = regs[APIC_INTERRUPT_COMMAND_LOW]; | |
544 break; 545 } | 566 break; 567 } |
568 pendingIPIs += apics.size(); 569 intPort->sendMessage(apics, message, timing); 570 newVal = regs[APIC_INTERRUPT_COMMAND_LOW]; |
|
546 } 547 break; 548 case APIC_LVT_TIMER: 549 case APIC_LVT_THERMAL_SENSOR: 550 case APIC_LVT_PERFORMANCE_MONITORING_COUNTERS: 551 case APIC_LVT_LINT0: 552 case APIC_LVT_LINT1: 553 case APIC_LVT_ERROR: --- 154 unchanged lines hidden --- | 571 } 572 break; 573 case APIC_LVT_TIMER: 574 case APIC_LVT_THERMAL_SENSOR: 575 case APIC_LVT_PERFORMANCE_MONITORING_COUNTERS: 576 case APIC_LVT_LINT0: 577 case APIC_LVT_LINT1: 578 case APIC_LVT_ERROR: --- 154 unchanged lines hidden --- |