Deleted Added
sdiff udiff text old ( 6137:d3ee4e0d690c ) new ( 6138:6cbdd76b93db )
full compact
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();
515 switch (low.destShorthand) {
516 case 0:
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 }
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 {
560 for (int i = 0; i < numContexts; i++) {
561 if (i != initialApicId) {
562 apics.push_back(i);
563 }
564 }
565 }
566 break;
567 }
568 pendingIPIs += apics.size();
569 intPort->sendMessage(apics, message, timing);
570 newVal = regs[APIC_INTERRUPT_COMMAND_LOW];
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 ---