Added apic_timer_sleep_us()
2 files changed, 22 insertions(+), 0 deletions(-)

M kernel/inc/apic.h
M kernel/src/apic.c
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);
 }