void local_apic_timer_init(void) { local_apic_timer_calibrate(128); /* set periodic mode (set bit to 1) */ local_apic->lvt_timer.timer_mode |= (1 << 0); /* enable timer */ local_apic_timer_enable(); }
void apic_reenable(){// TODO : sometimes cpu stop recving the interrupt interrupt /* 1. enable all external interrupt except timer */ apic_lvt_lint_t lvt_lint=local_apic->lvt_lint0; lvt_lint.mask=0x0; local_apic->lvt_lint0.reg = lvt_lint.reg; lvt_lint=local_apic->lvt_lint1; lvt_lint.mask=0x0; local_apic->lvt_lint1.reg = lvt_lint.reg; /* 2. set the timer to the defualt frequency frequency */ local_apic_timer_disable(); local_apic_timer_ap_calibrate(TICKS_PER_SECOND); /* recevies 100 timer interrupts per sec */ local_apic_timer_enable(); }
/********************************** ELASTIC CPU ****************************/ void apic_disable_partially(){// TODO sometimes cpu stop recving the timer interrupt /* 1. disable all external interrupt except timer */ apic_lvt_lint_t lvt_lint=local_apic->lvt_lint0; lvt_lint.mask=0x1; local_apic->lvt_lint0.reg = lvt_lint.reg; lvt_lint=local_apic->lvt_lint1; lvt_lint.mask=0x1; local_apic->lvt_lint1.reg = lvt_lint.reg; /* 2. set the timer so that interrupts happens with very less frequency */ local_apic_timer_disable(); local_apic_timer_ap_calibrate(1); // recevies timer interrupt 1 per second instead of 100 per second local_apic_timer_enable(); }