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