Changes in kernel/arch/ia32/src/smp/apic.c [5e4f22b:0f17bff] in mainline
- File:
-
- 1 edited
-
kernel/arch/ia32/src/smp/apic.c (modified) (10 diffs)
Legend:
- Unmodified
- Added
- Removed
-
kernel/arch/ia32/src/smp/apic.c
r5e4f22b r0f17bff 42 42 #include <interrupt.h> 43 43 #include <arch/interrupt.h> 44 #include < print.h>44 #include <log.h> 45 45 #include <arch/asm.h> 46 46 #include <arch.h> … … 72 72 * 73 73 */ 74 volatile uint32_t *l_apic = (uint32_t *) UINT32_C(0xfee00000);75 volatile uint32_t *io_apic = (uint32_t *) UINT32_C(0xfec00000);74 volatile uint32_t *l_apic = (uint32_t *) L_APIC_BASE; 75 volatile uint32_t *io_apic = (uint32_t *) IO_APIC_BASE; 76 76 77 77 uint32_t apic_id_mask = 0; … … 135 135 { 136 136 #ifdef CONFIG_DEBUG 137 printf("cpu%u: APIC spurious interrupt\n", CPU->id);137 log(LF_ARCH, LVL_DEBUG, "cpu%u: APIC spurious interrupt", CPU->id); 138 138 #endif 139 139 } … … 241 241 esr.value = l_apic[ESR]; 242 242 243 if (esr.send_checksum_error) 244 printf("Send Checksum Error\n"); 245 if (esr.receive_checksum_error) 246 printf("Receive Checksum Error\n"); 247 if (esr.send_accept_error) 248 printf("Send Accept Error\n"); 249 if (esr.receive_accept_error) 250 printf("Receive Accept Error\n"); 251 if (esr.send_illegal_vector) 252 printf("Send Illegal Vector\n"); 253 if (esr.received_illegal_vector) 254 printf("Received Illegal Vector\n"); 255 if (esr.illegal_register_address) 256 printf("Illegal Register Address\n"); 243 if (esr.err_bitmap) { 244 log_begin(LF_ARCH, LVL_ERROR); 245 log_printf("APIC errors detected:"); 246 if (esr.send_checksum_error) 247 log_printf("\nSend Checksum Error"); 248 if (esr.receive_checksum_error) 249 log_printf("\nReceive Checksum Error"); 250 if (esr.send_accept_error) 251 log_printf("\nSend Accept Error"); 252 if (esr.receive_accept_error) 253 log_printf("\nReceive Accept Error"); 254 if (esr.send_illegal_vector) 255 log_printf("\nSend Illegal Vector"); 256 if (esr.received_illegal_vector) 257 log_printf("\nReceived Illegal Vector"); 258 if (esr.illegal_register_address) 259 log_printf("\nIllegal Register Address"); 260 log_end(); 261 } 257 262 258 263 return !esr.err_bitmap; 259 264 } 260 265 261 #define DELIVS_PENDING_SILENT_RETRIES 4 262 266 /* Waits for the destination cpu to accept the previous ipi. */ 263 267 static void l_apic_wait_for_delivery(void) 264 268 { 265 269 icr_t icr; 266 unsigned retries = 0; 267 270 268 271 do { 269 if (retries++ > DELIVS_PENDING_SILENT_RETRIES) {270 retries = 0;271 #ifdef CONFIG_DEBUG272 printf("IPI is pending.\n");273 #endif274 delay(20);275 }276 272 icr.lo = l_apic[ICRlo]; 277 } while (icr.delivs == DELIVS_PENDING); 278 273 } while (icr.delivs != DELIVS_IDLE); 274 } 275 276 /** Send one CPU an IPI vector. 277 * 278 * @param apicid Physical APIC ID of the destination CPU. 279 * @param vector Interrupt vector to be sent. 280 * 281 * @return 0 on failure, 1 on success. 282 */ 283 int l_apic_send_custom_ipi(uint8_t apicid, uint8_t vector) 284 { 285 icr_t icr; 286 287 /* Wait for a destination cpu to accept our previous ipi. */ 288 l_apic_wait_for_delivery(); 289 290 icr.lo = l_apic[ICRlo]; 291 icr.hi = l_apic[ICRhi]; 292 293 icr.delmod = DELMOD_FIXED; 294 icr.destmod = DESTMOD_PHYS; 295 icr.level = LEVEL_ASSERT; 296 icr.shorthand = SHORTHAND_NONE; 297 icr.trigger_mode = TRIGMOD_LEVEL; 298 icr.vector = vector; 299 icr.dest = apicid; 300 301 /* Send the IPI by writing to l_apic[ICRlo]. */ 302 l_apic[ICRhi] = icr.hi; 303 l_apic[ICRlo] = icr.lo; 304 305 return apic_poll_errors(); 279 306 } 280 307 … … 289 316 { 290 317 icr_t icr; 318 319 /* Wait for a destination cpu to accept our previous ipi. */ 320 l_apic_wait_for_delivery(); 291 321 292 322 icr.lo = l_apic[ICRlo]; … … 299 329 300 330 l_apic[ICRlo] = icr.lo; 301 302 l_apic_wait_for_delivery();303 331 304 332 return apic_poll_errors(); … … 489 517 { 490 518 #ifdef LAPIC_VERBOSE 491 printf("LVT on cpu%u, LAPIC ID: %" PRIu8 "\n", 519 log_begin(LF_ARCH, LVL_DEBUG); 520 log_printf("LVT on cpu%u, LAPIC ID: %" PRIu8 "\n", 492 521 CPU->id, l_apic_id()); 493 522 494 523 lvt_tm_t tm; 495 524 tm.value = l_apic[LVT_Tm]; 496 printf("LVT Tm: vector=%" PRIu8 ", %s, %s, %s\n",525 log_printf("LVT Tm: vector=%" PRIu8 ", %s, %s, %s\n", 497 526 tm.vector, delivs_str[tm.delivs], mask_str[tm.masked], 498 527 tm_mode_str[tm.mode]); … … 500 529 lvt_lint_t lint; 501 530 lint.value = l_apic[LVT_LINT0]; 502 printf("LVT LINT0: vector=%" PRIu8 ", %s, %s, %s, irr=%u, %s, %s\n",531 log_printf("LVT LINT0: vector=%" PRIu8 ", %s, %s, %s, irr=%u, %s, %s\n", 503 532 tm.vector, delmod_str[lint.delmod], delivs_str[lint.delivs], 504 533 intpol_str[lint.intpol], lint.irr, trigmod_str[lint.trigger_mode], … … 506 535 507 536 lint.value = l_apic[LVT_LINT1]; 508 printf("LVT LINT1: vector=%" PRIu8 ", %s, %s, %s, irr=%u, %s, %s\n",537 log_printf("LVT LINT1: vector=%" PRIu8 ", %s, %s, %s, irr=%u, %s, %s\n", 509 538 tm.vector, delmod_str[lint.delmod], delivs_str[lint.delivs], 510 539 intpol_str[lint.intpol], lint.irr, trigmod_str[lint.trigger_mode], … … 513 542 lvt_error_t error; 514 543 error.value = l_apic[LVT_Err]; 515 printf("LVT Err: vector=%" PRIu8 ", %s, %s\n", error.vector,544 log_printf("LVT Err: vector=%" PRIu8 ", %s, %s\n", error.vector, 516 545 delivs_str[error.delivs], mask_str[error.masked]); 546 log_end(); 517 547 #endif 518 548 }
Note:
See TracChangeset
for help on using the changeset viewer.
