From 3ce97a427128dd0998e75a24748c6882eabee653 Mon Sep 17 00:00:00 2001 From: acevest Date: Thu, 8 Jan 2026 09:48:31 +0800 Subject: [PATCH] =?utf8?q?=E6=8A=8A8254=E7=9A=84=E6=97=B6=E9=92=9F?= =?utf8?q?=E4=B8=AD=E6=96=AD=E8=B7=AF=E7=94=B1=E5=88=B0AP,=E6=8A=8AHPET#0?= =?utf8?q?=E7=9A=84=E6=97=B6=E9=92=9F=E4=B8=AD=E6=96=AD=E8=B7=AF=E7=94=B1?= =?utf8?q?=E5=88=B0BSP?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- kernel/ap.c | 4 ++-- kernel/apic.c | 9 +++++---- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/kernel/ap.c b/kernel/ap.c index 0312377..fd05c06 100644 --- a/kernel/ap.c +++ b/kernel/ap.c @@ -128,7 +128,7 @@ void ap_kernel_entry() { lapic_svr |= (1 << 8); // 启用LAPIC lapic_svr &= ~(1 << 12); // 禁用EOI广播 lapic->write(LAPIC_SVR, lapic_svr); - +#if 0 // 先显示地屏蔽时钟中断 lapic->write(LAPIC_LVT_TIMER, LAPIC_LVT_MASKED); @@ -148,7 +148,7 @@ void ap_kernel_entry() { // lapic->write(LAPIC_LVT_TIMER, LAPIC_TIMER_MODE_PERIODIC | clkvec); - +#endif asm("sti;"); while (1) { diff --git a/kernel/apic.c b/kernel/apic.c index 8f3045e..5600206 100644 --- a/kernel/apic.c +++ b/kernel/apic.c @@ -343,7 +343,8 @@ void ioapic_init() { #if 1 // 把8253的中断通过IOAPIC转发到CPU0的0号中断 // 8253/8254连在i8259的0号引脚,但连在IO APIC的2号引脚上 - ioapic_rte_write(IOAPIC_RTE(2), 0x20 + 0 | (dst_cpuid << 56)); + // ioapic_rte_write(IOAPIC_RTE(2), 0x20 + 0 | (dst_cpuid << 56)); + ioapic_rte_write(IOAPIC_RTE(2), 0x20 + 0 | (1ULL << 56)); // 把键盘中断通过IOAPIC转发到CPU0的1号中断 ioapic_rte_write(IOAPIC_RTE(1), 0x20 + 1 | (dst_cpuid << 56)); irq_set_chip(0x00, &ioapic_chip); @@ -396,7 +397,7 @@ void ioapic_init() { printk("HPET enabled: %s\n", (GEN_CONF & (1 << 0)) == 0 ? "no" : "yes"); printk("HPET legacy replacement: %s\n", (GEN_CONF & (1 << 1)) == 0 ? "no" : "yes"); - uint32_t cpu_irq_vec = 64; + uint32_t cpu_irq_vec = 0; uint32_t ioapic_irq = 23; // TIM0_CONF @@ -451,8 +452,8 @@ void ioapic_init() { printk("TIM0_CONF: 0x%08x%08x\n", (uint32_t)(TIM0_CONF >> 32), (uint32_t)TIM0_CONF); - uint64_t x = freq_mhz * 1000000ULL; - x >>= 1; + // uint64_t x = freq_mhz * 1000000ULL; + uint64_t x = freq_mhz * 10000ULL; *(volatile uint32_t*)(hpet_base + 0x108 + 0x04) = (uint32_t)(x >> 32); *(volatile uint32_t*)(hpet_base + 0x108 + 0x00) = (uint32_t)(x & 0xFFFFFFFF); // *(volatile uint64_t*)(hpet_base + 0x108) = x; -- 2.47.0