Print this page
patch apic-simplify
patch remove-apic_cr8pri
patch spacing-fix
patch apic-task-reg-write-dup

Split Close
Expand all
Collapse all
          --- old/usr/src/uts/i86pc/io/pcplusmp/apic.c
          +++ new/usr/src/uts/i86pc/io/pcplusmp/apic.c
↓ open down ↓ 135 lines elided ↑ open up ↑
 136  136  };
 137  137          /*
 138  138           * The ipl of an ISR at vector X is apic_vectortoipl[X>>4]
 139  139           * NOTE that this is vector as passed into intr_enter which is
 140  140           * programmed vector - 0x20 (APIC_BASE_VECT)
 141  141           */
 142  142  
 143  143  uchar_t apic_ipltopri[MAXIPL + 1];      /* unix ipl to apic pri */
 144  144          /* The taskpri to be programmed into apic to mask given ipl */
 145  145  
 146      -#if defined(__amd64)
 147      -uchar_t apic_cr8pri[MAXIPL + 1];        /* unix ipl to cr8 pri  */
 148      -#endif
 149      -
 150  146  /*
 151  147   * Correlation of the hardware vector to the IPL in use, initialized
 152  148   * from apic_vectortoipl[] in apic_init().  The final IPLs may not correlate
 153  149   * to the IPLs in apic_vectortoipl on some systems that share interrupt lines
 154  150   * connected to errata-stricken IOAPICs
 155  151   */
 156  152  uchar_t apic_ipls[APIC_AVAIL_VECTOR];
 157  153  
 158  154  /*
 159  155   * Patchable global variables.
↓ open down ↓ 133 lines elided ↑ open up ↑
 293  289                          continue;
 294  290                  for (; j <= apic_vectortoipl[i]; j++) {
 295  291                          apic_ipltopri[j] = (i << APIC_IPL_SHIFT) +
 296  292                              APIC_BASE_VECT;
 297  293                  }
 298  294          }
 299  295          for (; j < MAXIPL + 1; j++)
 300  296                  /* fill up any empty ipltopri slots */
 301  297                  apic_ipltopri[j] = (i << APIC_IPL_SHIFT) + APIC_BASE_VECT;
 302  298          apic_init_common();
 303      -#if defined(__amd64)
 304      -        /*
 305      -         * Make cpu-specific interrupt info point to cr8pri vector
 306      -         */
 307      -        for (i = 0; i <= MAXIPL; i++)
 308      -                apic_cr8pri[i] = apic_ipltopri[i] >> APIC_IPL_SHIFT;
 309      -        CPU->cpu_pri_data = apic_cr8pri;
 310      -#else
      299 +#ifndef __amd64
 311  300          if (cpuid_have_cr8access(CPU))
 312  301                  apic_have_32bit_cr8 = 1;
 313      -#endif  /* __amd64 */
      302 +#endif  /* !__amd64 */
 314  303  }
 315  304  
 316  305  static void
 317  306  apic_init_intr(void)
 318  307  {
 319  308          processorid_t   cpun = psm_get_cpu_id();
 320  309          uint_t nlvt;
 321  310          uint32_t svr = AV_UNIT_ENABLE | APIC_SPUR_INTR;
 322  311  
 323  312          apic_reg_ops->apic_write_task_reg(APIC_MASK_ALL);
↓ open down ↓ 250 lines elided ↑ open up ↑
 574  563                          apic_nsec_since_boot += apic_nsec_per_intr;
 575  564                          apic_hrtime_stamp++;
 576  565                          last_count_read = apic_hertz_count;
 577  566                          apic_redistribute_compute();
 578  567                  }
 579  568  
 580  569                  /* We will avoid all the book keeping overhead for clock */
 581  570                  nipl = apic_ipls[vector];
 582  571  
 583  572                  *vectorp = apic_vector_to_irq[vector + APIC_BASE_VECT];
 584      -                if (apic_mode == LOCAL_APIC) {
 585      -#if defined(__amd64)
 586      -                        setcr8((ulong_t)(apic_ipltopri[nipl] >>
 587      -                            APIC_IPL_SHIFT));
 588      -#else
 589      -                        if (apic_have_32bit_cr8)
 590      -                                setcr8((ulong_t)(apic_ipltopri[nipl] >>
 591      -                                    APIC_IPL_SHIFT));
 592      -                        else
 593      -                                LOCAL_APIC_WRITE_REG(APIC_TASK_REG,
 594      -                                    (uint32_t)apic_ipltopri[nipl]);
 595      -#endif
 596      -                        LOCAL_APIC_WRITE_REG(APIC_EOI_REG, 0);
 597      -                } else {
 598      -                        X2APIC_WRITE(APIC_TASK_REG, apic_ipltopri[nipl]);
 599      -                        X2APIC_WRITE(APIC_EOI_REG, 0);
 600      -                }
      573 +
      574 +                apic_reg_ops->apic_write_task_reg(apic_ipltopri[nipl]);
      575 +                apic_reg_ops->apic_send_eoi(0);
 601  576  
 602  577                  return (nipl);
 603  578          }
 604  579  
 605  580          cpu_infop = &apic_cpus[psm_get_cpu_id()];
 606  581  
 607  582          if (vector == (APIC_SPUR_INTR - APIC_BASE_VECT)) {
 608  583                  cpu_infop->aci_spur_cnt++;
 609  584                  return (APIC_INT_SPURIOUS);
 610  585          }
↓ open down ↓ 10 lines elided ↑ open up ↑
 621  596                   */
 622  597                  iflag = intr_clear();
 623  598                  vector = apic_xlate_vector(vector + APIC_BASE_VECT) -
 624  599                      APIC_BASE_VECT;
 625  600                  intr_restore(iflag);
 626  601          }
 627  602  
 628  603          nipl = apic_ipls[vector];
 629  604          *vectorp = irq = apic_vector_to_irq[vector + APIC_BASE_VECT];
 630  605  
 631      -        if (apic_mode == LOCAL_APIC) {
 632      -#if defined(__amd64)
 633      -                setcr8((ulong_t)(apic_ipltopri[nipl] >> APIC_IPL_SHIFT));
 634      -#else
 635      -                if (apic_have_32bit_cr8)
 636      -                        setcr8((ulong_t)(apic_ipltopri[nipl] >>
 637      -                            APIC_IPL_SHIFT));
 638      -                else
 639      -                        LOCAL_APIC_WRITE_REG(APIC_TASK_REG,
 640      -                            (uint32_t)apic_ipltopri[nipl]);
 641      -#endif
 642      -        } else {
 643      -                X2APIC_WRITE(APIC_TASK_REG, apic_ipltopri[nipl]);
 644      -        }
      606 +        apic_reg_ops->apic_write_task_reg(apic_ipltopri[nipl]);
 645  607  
 646  608          cpu_infop->aci_current[nipl] = (uchar_t)irq;
 647  609          cpu_infop->aci_curipl = (uchar_t)nipl;
 648  610          cpu_infop->aci_ISR_in_progress |= 1 << nipl;
 649  611  
 650  612          /*
 651  613           * apic_level_intr could have been assimilated into the irq struct.
 652  614           * but, having it as a character array is more efficient in terms of
 653  615           * cache usage. So, we leave it as is.
 654  616           */
 655  617          if (!apic_level_intr[irq]) {
 656      -                if (apic_mode == LOCAL_APIC) {
 657      -                        LOCAL_APIC_WRITE_REG(APIC_EOI_REG, 0);
 658      -                } else {
 659      -                        X2APIC_WRITE(APIC_EOI_REG, 0);
 660      -                }
      618 +                apic_reg_ops->apic_send_eoi(0);
 661  619          }
 662  620  
 663  621  #ifdef  DEBUG
 664  622          APIC_DEBUG_BUF_PUT(vector);
 665  623          APIC_DEBUG_BUF_PUT(irq);
 666  624          APIC_DEBUG_BUF_PUT(nipl);
 667  625          APIC_DEBUG_BUF_PUT(psm_get_cpu_id());
 668  626          if ((apic_stretch_interrupts) && (apic_stretch_ISR & (1 << nipl)))
 669  627                  drv_usecwait(apic_stretch_interrupts);
 670  628  
↓ open down ↓ 19 lines elided ↑ open up ↑
 690  648  
 691  649  /*
 692  650   * Any changes made to this function must also change X2APIC
 693  651   * version of intr_exit.
 694  652   */
 695  653  void
 696  654  apic_intr_exit(int prev_ipl, int irq)
 697  655  {
 698  656          apic_cpus_info_t *cpu_infop;
 699  657  
 700      -#if defined(__amd64)
 701      -        setcr8((ulong_t)apic_cr8pri[prev_ipl]);
 702      -#else
 703      -        if (apic_have_32bit_cr8)
 704      -                setcr8((ulong_t)(apic_ipltopri[prev_ipl] >> APIC_IPL_SHIFT));
 705      -        else
 706      -                apicadr[APIC_TASK_REG] = apic_ipltopri[prev_ipl];
 707      -#endif
      658 +        local_apic_write_task_reg(apic_ipltopri[prev_ipl]);
 708  659  
 709  660          APIC_INTR_EXIT();
 710  661  }
 711  662  
 712  663  /*
 713  664   * Same as apic_intr_exit() except it uses MSR rather than MMIO
 714  665   * to access local apic registers.
 715  666   */
 716  667  void
 717  668  x2apic_intr_exit(int prev_ipl, int irq)
↓ open down ↓ 14 lines elided ↑ open up ↑
 732  683  }
 733  684  
 734  685  /*
 735  686   * Mask all interrupts below or equal to the given IPL.
 736  687   * Any changes made to this function must also change X2APIC
 737  688   * version of setspl.
 738  689   */
 739  690  static void
 740  691  apic_setspl(int ipl)
 741  692  {
 742      -#if defined(__amd64)
 743      -        setcr8((ulong_t)apic_cr8pri[ipl]);
 744      -#else
 745      -        if (apic_have_32bit_cr8)
 746      -                setcr8((ulong_t)(apic_ipltopri[ipl] >> APIC_IPL_SHIFT));
 747      -        else
 748      -                apicadr[APIC_TASK_REG] = apic_ipltopri[ipl];
 749      -#endif
      693 +        local_apic_write_task_reg(apic_ipltopri[ipl]);
 750  694  
 751  695          /* interrupts at ipl above this cannot be in progress */
 752  696          apic_cpus[psm_get_cpu_id()].aci_ISR_in_progress &= (2 << ipl) - 1;
 753  697          /*
 754  698           * this is a patch fix for the ALR QSMP P5 machine, so that interrupts
 755  699           * have enough time to come in before the priority is raised again
 756  700           * during the idle() loop.
 757  701           */
 758  702          if (apic_setspl_delay)
 759  703                  (void) apic_reg_ops->apic_get_pri();
↓ open down ↓ 627 lines elided ↑ open up ↑
1387 1331  void
1388 1332  x2apic_update_psm(void)
1389 1333  {
1390 1334          struct psm_ops *pops = &apic_ops;
1391 1335  
1392 1336          ASSERT(pops != NULL);
1393 1337  
1394 1338          pops->psm_intr_exit = x2apic_intr_exit;
1395 1339          pops->psm_setspl = x2apic_setspl;
1396 1340  
1397      -        pops->psm_send_ipi =  x2apic_send_ipi;
     1341 +        pops->psm_send_ipi = x2apic_send_ipi;
1398 1342          send_dirintf = pops->psm_send_ipi;
1399 1343  
1400 1344          apic_mode = LOCAL_X2APIC;
1401 1345          apic_change_ops();
1402 1346  }
    
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX