diff --git a/sys/platform/pc64/apic/lapic.c b/sys/platform/pc64/apic/lapic.c index 255d96f..c789e9c 100644 --- a/sys/platform/pc64/apic/lapic.c +++ b/sys/platform/pc64/apic/lapic.c @@ -785,3 +785,75 @@ lapic_fixup_noioapic(void) temp |= APIC_LVT_MASKED; lapic->lvt_lint1 = temp; } + +#ifdef HWPMC_HOOKS +void +lapic_reenable_pmc(void) +{ + uint32_t value; + value = lapic->lvt_pcint; + value &= ~APIC_LVT_MASKED; + lapic->lvt_pcint = value; +} + +static void +lapic_enable_pmc_oncpu(void *dummy __unused) +{ + uint32_t value; + + value = lapic->lvt_pcint; + value &= ~(APIC_LVT_MASKED | APIC_LVT_TRIG_MASK | APIC_LVT_POLARITY_MASK | + APIC_LVT_DM_MASK | APIC_LVT_VECTOR); + value |= APIC_LVT_DM_NMI | APIC_LVT_LEVELTRIG; + lapic->lvt_pcint = value; +} + +int +lapic_enable_pmc(void) +{ + /* XXX: need to check if lapic is initialized! */ + /* XXX: we're optimistic and assume the PMC LVT is always available */ +#ifdef SMP + lwkt_cpusync_simple(-1, lapic_enable_pmc_oncpu, NULL); +#else + lapic_enable_pmc_oncpu(NULL); +#endif + return 1; +} + +static void +lapic_disable_pmc_oncpu(void *dummy __unused) +{ + uint32_t value; + value = lapic->lvt_pcint; + value |= APIC_LVT_MASKED; + lapic->lvt_pcint = value; +} + +void +lapic_disable_pmc(void) +{ +#ifdef SMP + lwkt_cpusync_simple(-1, lapic_disable_pmc_oncpu, NULL); +#else + lapic_disable_pmc_oncpu(NULL); +#endif +} + +#else /* !HWPMC_HOOKS */ +void +lapic_reenable_pmc(void) +{ +} + +int +lapic_enable_pmc(void) +{ + return 0; +} + +void +lapic_disable_pmc(void) +{ +} +#endif /* HWPMC_HOOKS */