ReactOS Fundraising Campaign 2012
 
€ 4,410 / € 30,000

Information | Donate

Home | Info | Community | Development | myReactOS | Contact Us

  1. Home
  2. Community
  3. Development
  4. myReactOS
  5. Fundraiser 2012

  1. Main Page
  2. Alphabetical List
  3. Data Structures
  4. Directories
  5. File List
  6. Data Fields
  7. Globals
  8. Related Pages

ReactOS Development > Doxygen

apic.h
Go to the documentation of this file.
00001 /*
00002  *
00003  */
00004 
00005 #pragma once
00006 
00007 #ifdef _M_AMD64
00008 #define APIC_DEFAULT_BASE     0xfffffffffee00000ULL;
00009 #else
00010 #define APIC_DEFAULT_BASE     0xFEE00000    /* Default Local APIC Base Register Address */
00011 #endif
00012 
00013 /* APIC Register Address Map */
00014 #define APIC_ID      0x0020 /* Local APIC ID Register (R/W) */
00015 #define APIC_VER     0x0030 /* Local APIC Version Register (R) */
00016 #define APIC_TPR     0x0080 /* Task Priority Register (R/W) */
00017 #define APIC_APR     0x0090 /* Arbitration Priority Register (R) */
00018 #define APIC_PPR     0x00A0 /* Processor Priority Register (R) */
00019 #define APIC_EOI     0x00B0 /* EOI Register (W) */
00020 #define APIC_LDR     0x00D0 /* Logical Destination Register (R/W) */
00021 #define APIC_DFR     0x00E0 /* Destination Format Register (0-27 R, 28-31 R/W) */
00022 #define APIC_SIVR    0x00F0 /* Spurious Interrupt Vector Register (0-3 R, 4-9 R/W) */
00023 #define APIC_ISR     0x0100 /* Interrupt Service Register 0-255 (R) */
00024 #define APIC_TMR     0x0180 /* Trigger Mode Register 0-255 (R) */
00025 #define APIC_IRR     0x0200 /* Interrupt Request Register 0-255 (r) */
00026 #define APIC_ESR     0x0280 /* Error Status Register (R) */
00027 #define APIC_ICR0    0x0300 /* Interrupt Command Register 0-31 (R/W) */
00028 #define APIC_ICR1    0x0310 /* Interrupt Command Register 32-63 (R/W) */
00029 #define APIC_LVTT    0x0320 /* Local Vector Table (Timer) (R/W) */
00030 #define APIC_LVTTHMR 0x0330
00031 #define APIC_LVTPC   0x0340 /* Performance Counter LVT (R/W) */
00032 #define APIC_LINT0   0x0350 /* Local Vector Table (LINT0) (R/W) */
00033 #define APIC_LINT1   0x0360 /* Local Vector Table (LINT1) (R/W) */
00034 #define APIC_LVT3    0x0370 /* Local Vector Table (Error) (R/W) */
00035 #define APIC_ICRT    0x0380 /* Initial Count Register for Timer (R/W) */
00036 #define APIC_CCRT    0x0390 /* Current Count Register for Timer (R) */
00037 #define APIC_TDCR    0x03E0 /* Timer Divide Configuration Register (R/W) */
00038 
00039 #define APIC_ID_MASK        (0xF << 24)
00040 #define GET_APIC_ID(x)      (((x) & APIC_ID_MASK) >> 24)
00041 #define GET_APIC_LOGICAL_ID(x)  (((x)>>24)&0xFF)
00042 #define APIC_VER_MASK       0xFF00FF
00043 #define GET_APIC_VERSION(x) ((x) & 0xFF)
00044 #define GET_APIC_MAXLVT(x)  (((x) >> 16) & 0xFF)
00045 
00046 #define APIC_TPR_PRI       0xFF
00047 #define APIC_TPR_INT       0xF0
00048 #define APIC_TPR_SUB       0xF
00049 #define APIC_TPR_MAX       0xFF           /* Maximum priority */
00050 #define APIC_TPR_MIN       0x20           /* Minimum priority */
00051 
00052 #define APIC_LDR_MASK      (0xFF << 24)
00053 
00054 #define APIC_SIVR_ENABLE   (0x1 << 8)
00055 #define APIC_SIVR_FOCUS    (0x1 << 9)
00056 
00057 #define APIC_ESR_MASK      (0xFE << 0)    /* Error Mask */
00058 
00059 #define APIC_ICR0_VECTOR   (0xFF << 0)    /* Vector */
00060 #define APIC_ICR0_DM       (0x7 << 8)     /* Delivery Mode */
00061 #define APIC_ICR0_DESTM    (0x1 << 11)    /* Destination Mode */
00062 #define APIC_ICR0_DS       (0x1 << 12)    /* Delivery Status */
00063 #define APIC_ICR0_LEVEL    (0x1 << 14)    /* Level */
00064 #define APIC_ICR0_TM       (0x1 << 15)    /* Trigger Mode */
00065 #define APIC_ICR0_DESTS    (0x3 << 18)    /* Destination Shorthand */
00066 
00067 /* Delivery Modes */
00068 #define APIC_DM_FIXED     (0x0 << 8)
00069 #define APIC_DM_LOWEST    (0x1 << 8)
00070 #define APIC_DM_SMI       (0x2 << 8)
00071 #define APIC_DM_REMRD     (0x3 << 8)
00072 #define APIC_DM_NMI       (0x4 << 8)
00073 #define APIC_DM_INIT      (0x5 << 8)
00074 #define APIC_DM_STARTUP   (0x6 << 8)
00075 #define APIC_DM_EXTINT    (0x7 << 8)
00076 #define GET_APIC_DELIVERY_MODE(x)   (((x) >> 8) & 0x7)
00077 #define SET_APIC_DELIVERY_MODE(x,y) (((x) & ~0x700) | ((y) << 8))
00078 
00079 /* Destination Shorthand values */
00080 #define APIC_ICR0_DESTS_FIELD          (0x0 << 0)
00081 #define APIC_ICR0_DESTS_SELF           (0x1 << 18)
00082 #define APIC_ICR0_DESTS_ALL            (0x2 << 18)
00083 #define APIC_ICR0_DESTS_ALL_BUT_SELF   (0x3 << 18)
00084 
00085 #define APIC_ICR0_LEVEL_DEASSERT (0x0 << 14) /* Deassert level */
00086 #define APIC_ICR0_LEVEL_ASSERT   (0x1 << 14) /* Assert level */
00087 
00088 #define GET_APIC_DEST_FIELD(x)   (((x) >> 24) & 0xFF)
00089 #define SET_APIC_DEST_FIELD(x)   (((x) & 0xFF) << 24)
00090 
00091 #define GET_APIC_TIMER_BASE(x)   (((x) >> 18) & 0x3)
00092 #define SET_APIC_TIMER_BASE(x)   ((x) << 18)
00093 #define APIC_TIMER_BASE_CLKIN    0x0
00094 #define APIC_TIMER_BASE_TMBASE   0x1
00095 #define APIC_TIMER_BASE_DIV      0x2
00096 
00097 #define APIC_LVT_VECTOR           (0xFF << 0)   /* Vector */
00098 #define APIC_LVT_DS               (0x1 << 12)   /* Delivery Status */
00099 #define APIC_LVT_REMOTE_IRR       (0x1 << 14)   /* Remote IRR */
00100 #define APIC_LVT_LEVEL_TRIGGER        (0x1 << 15)   /* Lvel Triggered */
00101 #define APIC_LVT_MASKED           (0x1 << 16)   /* Mask */
00102 #define APIC_LVT_PERIODIC         (0x1 << 17)   /* Timer Mode */
00103 
00104 #define APIC_LVT3_DM        (0x7 << 8)
00105 #define APIC_LVT3_IIPP      (0x1 << 13)
00106 #define APIC_LVT3_TM        (0x1 << 15)
00107 #define APIC_LVT3_MASKED    (0x1 << 16)
00108 #define APIC_LVT3_OS        (0x1 << 17)
00109 
00110 #define APIC_TDCR_TMBASE   (0x1 << 2)
00111 #define APIC_TDCR_MASK     0x0F
00112 #define APIC_TDCR_2        0x00
00113 #define APIC_TDCR_4        0x01
00114 #define APIC_TDCR_8        0x02
00115 #define APIC_TDCR_16       0x03
00116 #define APIC_TDCR_32       0x08
00117 #define APIC_TDCR_64       0x09
00118 #define APIC_TDCR_128      0x0A
00119 #define APIC_TDCR_1        0x0B
00120 
00121 #define APIC_TARGET_SELF         0x100
00122 #define APIC_TARGET_ALL          0x200
00123 #define APIC_TARGET_ALL_BUT_SELF 0x300
00124 
00125 #define APIC_INTEGRATED(version) (version & 0xF0)
00126 
00127 typedef enum {
00128   amPIC = 0,    /* IMCR and PIC compatibility mode */
00129   amVWIRE       /* Virtual Wire compatibility mode */
00130 } APIC_MODE;
00131 
00132 #ifdef CONFIG_SMP
00133 #define MAX_CPU   32
00134 #else
00135 #define MAX_CPU   1
00136 #endif
00137 
00138 /*
00139  * Local APIC timer IRQ vector is on a different priority level,
00140  * to work around the 'lost local interrupt if more than 2 IRQ
00141  * sources per level' errata.
00142  */
00143 #define LOCAL_TIMER_VECTOR      0xEF
00144 
00145 #define IPI_VECTOR          0xFB
00146 #define ERROR_VECTOR            0xFE
00147 #define SPURIOUS_VECTOR         0xFF  /* Must be 0xXF */
00148 
00149 /* CPU flags */
00150 #define CPU_USABLE   0x01  /* 1 if the CPU is usable (ie. can be used) */
00151 #define CPU_ENABLED  0x02  /* 1 if the CPU is enabled */
00152 #define CPU_BSP      0x04  /* 1 if the CPU is the bootstrap processor */
00153 #define CPU_TSC      0x08  /* 1 if the CPU has a time stamp counter */
00154 
00155 typedef struct _CPU_INFO
00156 {
00157    UCHAR    Flags;            /* CPU flags */
00158    UCHAR    APICId;           /* Local APIC ID */
00159    UCHAR    APICVersion;      /* Local APIC version */
00160 //   UCHAR    MaxLVT;           /* Number of LVT registers */
00161    ULONG    BusSpeed;         /* BUS speed */
00162    ULONG    CoreSpeed;        /* Core speed */
00163    UCHAR    Padding[16-12];   /* Padding to 16-byte */
00164 } CPU_INFO, *PCPU_INFO;
00165 
00166 extern ULONG CPUCount;          /* Total number of CPUs */
00167 extern ULONG BootCPU;           /* Bootstrap processor */
00168 extern ULONG OnlineCPUs;        /* Bitmask of online CPUs */
00169 extern CPU_INFO CPUMap[MAX_CPU];    /* Map of all CPUs in the system */
00170 extern PULONG APICBase;         /* Virtual address of local APIC */
00171 extern ULONG lastregr[MAX_CPU];     /* For debugging */
00172 extern ULONG lastvalr[MAX_CPU];
00173 extern ULONG lastregw[MAX_CPU];
00174 extern ULONG lastvalw[MAX_CPU];
00175 
00176 /* Prototypes */
00177 VOID APICSendIPI(ULONG Target, ULONG Mode);
00178 VOID APICSetup(VOID);
00179 VOID HaliInitBSP(VOID);
00180 VOID APICSyncArbIDs(VOID);
00181 VOID APICCalibrateTimer(ULONG CPU);
00182 VOID HaliStartApplicationProcessor(ULONG Cpu, ULONG Stack);
00183 
00184 static __inline ULONG _APICRead(ULONG Offset)
00185 {
00186     PULONG p;
00187 
00188     p = (PULONG)((ULONG_PTR)APICBase + Offset);
00189     return *p;
00190 }
00191 
00192 #if 0
00193 static __inline VOID APICWrite(ULONG Offset,
00194                                ULONG Value)
00195 {
00196     PULONG p;
00197 
00198     p = (PULONG)((ULONG_PTR)APICBase + Offset);
00199 
00200     *p = Value;
00201 }
00202 #else
00203 static __inline VOID APICWrite(ULONG Offset,
00204                                ULONG Value)
00205 {
00206     PULONG p;
00207     ULONG CPU = (_APICRead(APIC_ID) & APIC_ID_MASK) >> 24;
00208 
00209     lastregw[CPU] = Offset;
00210     lastvalw[CPU] = Value;
00211 
00212     p = (PULONG)((ULONG_PTR)APICBase + Offset);
00213 
00214     *p = Value;
00215 }
00216 #endif
00217 
00218 #if 0 
00219 static __inline ULONG APICRead(ULONG Offset)
00220 {
00221     PULONG p;
00222 
00223     p = (PULONG)((ULONG_PTR)APICBase + Offset);
00224     return *p;
00225 }
00226 #else
00227 static __inline ULONG APICRead(ULONG Offset)
00228 {
00229     PULONG p;
00230     ULONG CPU = (_APICRead(APIC_ID) & APIC_ID_MASK) >> 24;
00231 
00232     lastregr[CPU] = Offset;
00233     lastvalr[CPU] = 0;
00234 
00235     p = (PULONG)((ULONG_PTR)APICBase + Offset);
00236 
00237     lastvalr[CPU] = *p;
00238     return lastvalr[CPU];
00239 }
00240 #endif
00241 
00242 static __inline ULONG ThisCPU(VOID)
00243 {
00244     return (APICRead(APIC_ID) & APIC_ID_MASK) >> 24;
00245 }
00246 
00247 static __inline VOID APICSendEOI(VOID)
00248 {
00249     // Send the EOI
00250     APICWrite(APIC_EOI, 0);
00251 }
00252 
00253 /* EOF */

Generated on Sun May 27 2012 04:28:41 for ReactOS by doxygen 1.7.6.1

ReactOS is a registered trademark or a trademark of ReactOS Foundation in the United States and other countries.