Home | Info | Community | Development | myReactOS | Contact Us
ReactOS Development > Doxygenapic.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
1.7.6.1
|