M kernel/inc/apic.h +2 -0
@@ 43,6 43,8 @@ void apic_timer_set(uint32_t cycles, enu
void apic_timer_set_us(uint64_t us);
+void apic_timer_sleep_us(uint64_t us);
+
uint32_t apic_timer_get(void);
uint32_t apic_timer_get_current(void);
M kernel/src/apic.c +20 -0
@@ 183,6 183,26 @@ void apic_timer_set_us(uint64_t us) {
apic_timer_set(cycles, div);
}
+__attribute__((naked)) static void sleep(void) {
+ __asm__ __volatile__("xorq %rax, %rax;"
+ "iretq");
+}
+
+void apic_timer_sleep_us(uint64_t us) {
+ register bool sleeping asm("rax") = true;
+
+ idt_set_isr(0xFE, (uint64_t) sleep, 2);
+ apic_timer_init(0xFE, false);
+ apic_timer_set_us(us);
+ apic_timer_enable();
+
+ while(sleeping) {
+ __asm__ __volatile__("hlt");
+ }
+ apic_timer_disable();
+ apic_eoi();
+}
+
uint32_t apic_timer_get(void) {
return read_reg_raw(APIC_TIMER_ICR);
}