/* StarForth — Steady-State Virtual Machine Runtime Copyright (c) 2023–2025 Robert A. James All rights reserved. This file is part of the StarForth project. Licensed under the StarForth License, Version 1.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at: https://github.com/star.4th@proton.me/StarForth/LICENSE.txt This software is provided "AS IS", WITHOUT WARRANTY OF ANY KIND, express or implied, including but not limited to the warranties of merchantability, fitness for a particular purpose, and noninfringement. See the License for the specific language governing permissions and limitations under the License. StarForth — Steady-State Virtual Machine Runtime Copyright (c) 2023–2025 Robert A. James All rights reserved. This file is part of the StarForth project. Licensed under the StarForth License, Version 1.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at: https://github.com/star.4th@proton.me/StarForth/LICENSE.txt This software is provided "AS IS", WITHOUT WARRANTY OF ANY KIND, express or implied, including but not limited to the warranties of merchantability, fitness for a particular purpose, and noninfringement. See the License for the specific language governing permissions and limitations under the License. */ /** * apic.h - Local APIC interface */ #ifndef STARKERNEL_APIC_H #define STARKERNEL_APIC_H #include "uefi.h" #include /* Heartbeat timer vector (user-defined IRQ space starts at 0x20) */ #define APIC_TIMER_VECTOR 0x20 /* Initialize Local APIC (enables APIC, sets spurious vector) */ int apic_init(BootInfo *boot_info); /* Send End-of-Interrupt signal */ void apic_eoi(void); /* * Initialize APIC timer for periodic heartbeat. * @param tsc_hz TSC frequency in Hz (for calibration) * @param tick_hz Desired tick frequency (e.g., 100 = 100 Hz = 10ms period) * @return 0 on success, -1 on failure */ int apic_timer_init(uint64_t tsc_hz, uint32_t tick_hz); /** * Start the APIC timer (enables periodic interrupts). * Call this after IDT and heartbeat handler are set up. */ void apic_timer_start(void); /** * Stop the APIC timer (disables periodic interrupts). */ void apic_timer_stop(void); /** * Re-arm the APIC timer at the current adaptive period (item 0.8, §26). * Recomputes the initial count from heartbeat_next_period_ns() and writes * it to the ICR; a periodic-mode ICR write restarts the countdown * immediately at the new value. Called once per tick from the ISR, before * heartbeat_tick(). */ void apic_timer_rearm(void); /** * Get the configured timer period in TSC ticks. */ uint64_t apic_timer_period_tsc(void); #endif /* STARKERNEL_APIC_H */