Fixes set_timer() for x86
authorBarret Rhoden <brho@cs.berkeley.edu>
Fri, 22 Jan 2010 01:41:24 +0000 (17:41 -0800)
committerBarret Rhoden <brho@cs.berkeley.edu>
Fri, 22 Jan 2010 01:41:24 +0000 (17:41 -0800)
kern/arch/i386/apic.c
kern/arch/i386/apic.h

index 92c4ee1..57bbee8 100644 (file)
@@ -92,7 +92,10 @@ void lapic_set_timer(uint32_t usec, bool periodic)
 
 void set_timer(uint32_t usec)
 {
-       lapic_set_timer(usec,!!usec);
+       if (usec)
+               lapic_set_timer(usec, TRUE);
+       else
+               lapic_disable_timer();
 }
 
 uint32_t lapic_get_default_id(void)
index 615950f..72f7b46 100644 (file)
@@ -111,6 +111,7 @@ static inline uint32_t lapic_get_id(void);
 static inline void lapic_set_id(uint8_t id); // Careful, may not actually work
 static inline uint8_t lapic_get_logid(void);
 static inline void lapic_set_logid(uint8_t id);
+static inline void lapic_disable_timer(void);
 static inline void lapic_disable(void);
 static inline void lapic_enable(void);
 static inline void lapic_wait_to_send(void);
@@ -170,6 +171,11 @@ static inline void lapic_set_logid(uint8_t id)
        write_mmreg32(LAPIC_LOGICAL_ID, id << 24);
 }
 
+static inline void lapic_disable_timer(void)
+{
+       write_mmreg32(LAPIC_LVT_TIMER, 0);
+}
+
 /* There are a couple ways to do it.  The MSR route doesn't seem to work
  * in KVM.  It's also a somewhat permanent thing
  */