Changeset 2855 for trunk/kLdr/kLdr.c
- Timestamp:
- Nov 4, 2006, 3:30:19 AM (19 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/kLdr/kLdr.c
r2853 r2855 136 136 } 137 137 138 139 /** 140 * Compares arch+cpu some code was generated for with a arch+cpu for executing it 141 * to see if it'll work out fine or not. 142 * 143 * @returns 0 if the code is compatible with the cpu. 144 * @returns KLDR_ERR_ARCH_CPU_NOT_COMPATIBLE if the arch+cpu isn't compatible with the code. 145 * @param enmCodeArch The architecture the code was generated for. 146 * @param enmCodeCpu The cpu the code was generated for. 147 * @param enmArch The architecture to run it on. 148 * @param enmCpu The cpu to run it on. 149 */ 150 int kLdrCompareCpus(KLDRARCH enmCodeArch, KLDRCPU enmCodeCpu, KLDRARCH enmArch, KLDRCPU enmCpu) 151 { 152 /* 153 * Compare arch and cpu. 154 */ 155 if (enmCodeArch != enmArch) 156 return KLDR_ERR_ARCH_CPU_NOT_COMPATIBLE; 157 158 /* exact match is nice. */ 159 if (enmCodeCpu == enmCpu) 160 return 0; 161 switch (enmArch) 162 { 163 case KLDRARCH_X86_16: 164 if (enmCpu < KLDRCPU_FIRST_X86_16 || enmCpu > KLDRCPU_LAST_X86_16) 165 return KLDR_ERR_INVALID_PARAMETER; 166 167 /* intel? */ 168 if (enmCodeCpu <= KLDRCPU_CORE2_16) 169 { 170 /* also intel? */ 171 if (enmCpu <= KLDRCPU_CORE2_16) 172 return enmCodeCpu <= enmCpu ? 0 : KLDR_ERR_ARCH_CPU_NOT_COMPATIBLE; 173 switch (enmCpu) 174 { 175 case KLDRCPU_K6_16: 176 return enmCodeCpu <= KLDRCPU_I586 ? 0 : KLDR_ERR_ARCH_CPU_NOT_COMPATIBLE; 177 case KLDRCPU_K7_16: 178 case KLDRCPU_K8_16: 179 default: 180 return enmCodeCpu <= KLDRCPU_I686 ? 0 : KLDR_ERR_ARCH_CPU_NOT_COMPATIBLE; 181 } 182 } 183 /* amd */ 184 return enmCpu >= KLDRCPU_K6_16 && enmCpu <= KLDRCPU_K8_16 185 ? 0 : KLDR_ERR_ARCH_CPU_NOT_COMPATIBLE; 186 187 case KLDRARCH_X86_32: 188 if (enmCpu < KLDRCPU_FIRST_X86_32 || enmCpu > KLDRCPU_LAST_X86_32) 189 return KLDR_ERR_INVALID_PARAMETER; 190 191 /* blend? */ 192 if (enmCodeCpu == KLDRCPU_X86_32_BLEND) 193 return 0; 194 195 /* intel? */ 196 if (enmCodeCpu <= KLDRCPU_CORE2_32) 197 { 198 /* also intel? */ 199 if (enmCpu <= KLDRCPU_CORE2_32) 200 return enmCodeCpu <= enmCpu ? 0 : KLDR_ERR_ARCH_CPU_NOT_COMPATIBLE; 201 switch (enmCpu) 202 { 203 case KLDRCPU_K6: 204 return enmCodeCpu <= KLDRCPU_I586 ? 0 : KLDR_ERR_ARCH_CPU_NOT_COMPATIBLE; 205 case KLDRCPU_K7: 206 case KLDRCPU_K8_32: 207 default: 208 return enmCodeCpu <= KLDRCPU_I686 ? 0 : KLDR_ERR_ARCH_CPU_NOT_COMPATIBLE; 209 } 210 } 211 /* amd */ 212 return enmCpu >= KLDRCPU_K6 && enmCpu <= KLDRCPU_K8_32 213 ? 0 : KLDR_ERR_ARCH_CPU_NOT_COMPATIBLE; 214 215 case KLDRARCH_AMD64: 216 if (enmCpu < KLDRCPU_FIRST_AMD64 || enmCpu > KLDRCPU_LAST_AMD64) 217 return KLDR_ERR_INVALID_PARAMETER; 218 219 /* blend? */ 220 if (enmCodeCpu == KLDRCPU_AMD64_BLEND) 221 return 0; 222 /* this is simple for now. */ 223 return KLDR_ERR_ARCH_CPU_NOT_COMPATIBLE; 224 225 default: 226 break; 227 } 228 return KLDR_ERR_ARCH_CPU_NOT_COMPATIBLE; 229 } 230 231 232 /** 233 * Gets the arch+cpu of the calling cpu. 234 * 235 * @param penmArch Where to store the cpu architecture. 236 * @param penmCpu Where to store the cpu brand/model. 237 */ 238 void kLdrGetArchCpu(PKLDRARCH penmArch, PKLDRCPU penmCpu) 239 { 240 #if defined(__x86_64__) || defined(_M_X64) || defined(__AMD64__) || defined(_M_AMD64) 241 *penmArch = KLDRARCH_AMD64; 242 *penmCpu = KLDRCPU_AMD64_BLEND; ///@todo check it using cpu. 243 244 #elif defined(__i386__) || defined(_M_IX86) 245 *penmArch = KLDRARCH_X86_32; 246 *penmCpu = KLDRCPU_X86_32_BLEND; ///@todo check it using cpu. 247 248 #else 249 # error "Port me" 250 #endif 251 }
Note:
See TracChangeset
for help on using the changeset viewer.