Changes in kernel/arch/ia32/src/smp/apic.c [b2fa1204:0f17bff] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
kernel/arch/ia32/src/smp/apic.c
rb2fa1204 r0f17bff 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; … … 264 264 } 265 265 266 #define DELIVS_PENDING_SILENT_RETRIES 4 267 266 /* Waits for the destination cpu to accept the previous ipi. */ 268 267 static void l_apic_wait_for_delivery(void) 269 268 { 270 269 icr_t icr; 271 unsigned retries = 0; 272 270 273 271 do { 274 if (retries++ > DELIVS_PENDING_SILENT_RETRIES) {275 retries = 0;276 #ifdef CONFIG_DEBUG277 log(LF_ARCH, LVL_DEBUG, "IPI is pending.");278 #endif279 delay(20);280 }281 272 icr.lo = l_apic[ICRlo]; 282 } while (icr.delivs == DELIVS_PENDING); 283 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(); 284 306 } 285 307 … … 294 316 { 295 317 icr_t icr; 318 319 /* Wait for a destination cpu to accept our previous ipi. */ 320 l_apic_wait_for_delivery(); 296 321 297 322 icr.lo = l_apic[ICRlo]; … … 304 329 305 330 l_apic[ICRlo] = icr.lo; 306 307 l_apic_wait_for_delivery();308 331 309 332 return apic_poll_errors();
Note:
See TracChangeset
for help on using the changeset viewer.