Print this page
4663 apic_cr8pri complicates pcplusmp

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 ↓ 136 lines elided ↑ open up ↑
 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  146  #if defined(__amd64)
 147      -uchar_t apic_cr8pri[MAXIPL + 1];        /* unix ipl to cr8 pri  */
      147 +static unsigned char dummy_cpu_pri[MAXIPL + 1];
 148  148  #endif
 149  149  
 150  150  /*
 151  151   * Correlation of the hardware vector to the IPL in use, initialized
 152  152   * from apic_vectortoipl[] in apic_init().  The final IPLs may not correlate
 153  153   * to the IPLs in apic_vectortoipl on some systems that share interrupt lines
 154  154   * connected to errata-stricken IOAPICs
 155  155   */
 156  156  uchar_t apic_ipls[APIC_AVAIL_VECTOR];
 157  157  
↓ open down ↓ 136 lines elided ↑ open up ↑
 294  294                  for (; j <= apic_vectortoipl[i]; j++) {
 295  295                          apic_ipltopri[j] = (i << APIC_IPL_SHIFT) +
 296  296                              APIC_BASE_VECT;
 297  297                  }
 298  298          }
 299  299          for (; j < MAXIPL + 1; j++)
 300  300                  /* fill up any empty ipltopri slots */
 301  301                  apic_ipltopri[j] = (i << APIC_IPL_SHIFT) + APIC_BASE_VECT;
 302  302          apic_init_common();
 303  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;
      304 +        CPU->cpu_pri_data = dummy_cpu_pri;
 310  305  #else
 311  306          if (cpuid_have_cr8access(CPU))
 312  307                  apic_have_32bit_cr8 = 1;
 313  308  #endif  /* __amd64 */
 314  309  }
 315  310  
 316  311  static void
 317  312  apic_init_intr(void)
 318  313  {
 319  314          processorid_t   cpun = psm_get_cpu_id();
↓ open down ↓ 371 lines elided ↑ open up ↑
 691  686  /*
 692  687   * Any changes made to this function must also change X2APIC
 693  688   * version of intr_exit.
 694  689   */
 695  690  void
 696  691  apic_intr_exit(int prev_ipl, int irq)
 697  692  {
 698  693          apic_cpus_info_t *cpu_infop;
 699  694  
 700  695  #if defined(__amd64)
 701      -        setcr8((ulong_t)apic_cr8pri[prev_ipl]);
      696 +        setcr8((ulong_t)(apic_ipltopri[prev_ipl] >> APIC_IPL_SHIFT));
 702  697  #else
 703  698          if (apic_have_32bit_cr8)
 704  699                  setcr8((ulong_t)(apic_ipltopri[prev_ipl] >> APIC_IPL_SHIFT));
 705  700          else
 706  701                  apicadr[APIC_TASK_REG] = apic_ipltopri[prev_ipl];
 707  702  #endif
 708  703  
 709  704          APIC_INTR_EXIT();
 710  705  }
 711  706  
↓ open down ↓ 21 lines elided ↑ open up ↑
 733  728  
 734  729  /*
 735  730   * Mask all interrupts below or equal to the given IPL.
 736  731   * Any changes made to this function must also change X2APIC
 737  732   * version of setspl.
 738  733   */
 739  734  static void
 740  735  apic_setspl(int ipl)
 741  736  {
 742  737  #if defined(__amd64)
 743      -        setcr8((ulong_t)apic_cr8pri[ipl]);
      738 +        setcr8((ulong_t)(apic_ipltopri[ipl] >> APIC_IPL_SHIFT));
 744  739  #else
 745  740          if (apic_have_32bit_cr8)
 746  741                  setcr8((ulong_t)(apic_ipltopri[ipl] >> APIC_IPL_SHIFT));
 747  742          else
 748  743                  apicadr[APIC_TASK_REG] = apic_ipltopri[ipl];
 749  744  #endif
 750  745  
 751  746          /* interrupts at ipl above this cannot be in progress */
 752  747          apic_cpus[psm_get_cpu_id()].aci_ISR_in_progress &= (2 << ipl) - 1;
 753  748          /*
↓ open down ↓ 649 lines elided ↑ open up ↑
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX