Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • kernel/arch/ia32/src/smp/apic.c

    r5e4f22b r0f17bff  
    4242#include <interrupt.h>
    4343#include <arch/interrupt.h>
    44 #include <print.h>
     44#include <log.h>
    4545#include <arch/asm.h>
    4646#include <arch.h>
     
    7272 *
    7373 */
    74 volatile uint32_t *l_apic = (uint32_t *) UINT32_C(0xfee00000);
    75 volatile uint32_t *io_apic = (uint32_t *) UINT32_C(0xfec00000);
     74volatile uint32_t *l_apic = (uint32_t *) L_APIC_BASE;
     75volatile uint32_t *io_apic = (uint32_t *) IO_APIC_BASE;
    7676
    7777uint32_t apic_id_mask = 0;
     
    135135{
    136136#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);
    138138#endif
    139139}
     
    241241        esr.value = l_apic[ESR];
    242242       
    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        }
    257262       
    258263        return !esr.err_bitmap;
    259264}
    260265
    261 #define DELIVS_PENDING_SILENT_RETRIES   4       
    262 
     266/* Waits for the destination cpu to accept the previous ipi. */
    263267static void l_apic_wait_for_delivery(void)
    264268{
    265269        icr_t icr;
    266         unsigned retries = 0;
    267 
     270       
    268271        do {
    269                 if (retries++ > DELIVS_PENDING_SILENT_RETRIES) {
    270                         retries = 0;
    271 #ifdef CONFIG_DEBUG
    272                         printf("IPI is pending.\n");
    273 #endif
    274                         delay(20);
    275                 }
    276272                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 */
     283int 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();
    279306}
    280307
     
    289316{
    290317        icr_t icr;
     318
     319        /* Wait for a destination cpu to accept our previous ipi. */
     320        l_apic_wait_for_delivery();
    291321       
    292322        icr.lo = l_apic[ICRlo];
     
    299329       
    300330        l_apic[ICRlo] = icr.lo;
    301 
    302         l_apic_wait_for_delivery();
    303331       
    304332        return apic_poll_errors();
     
    489517{
    490518#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",
    492521            CPU->id, l_apic_id());
    493522       
    494523        lvt_tm_t tm;
    495524        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",
    497526            tm.vector, delivs_str[tm.delivs], mask_str[tm.masked],
    498527            tm_mode_str[tm.mode]);
     
    500529        lvt_lint_t lint;
    501530        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",
    503532            tm.vector, delmod_str[lint.delmod], delivs_str[lint.delivs],
    504533            intpol_str[lint.intpol], lint.irr, trigmod_str[lint.trigger_mode],
     
    506535       
    507536        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",
    509538            tm.vector, delmod_str[lint.delmod], delivs_str[lint.delivs],
    510539            intpol_str[lint.intpol], lint.irr, trigmod_str[lint.trigger_mode],
     
    513542        lvt_error_t error;
    514543        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,
    516545            delivs_str[error.delivs], mask_str[error.masked]);
     546        log_end();
    517547#endif
    518548}
Note: See TracChangeset for help on using the changeset viewer.