Rev 1899 | Rev 2067 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
| Rev 1899 | Rev 2044 | ||
|---|---|---|---|
| Line 50... | Line 50... | ||
| 50 | { |
50 | { |
| 51 | tick_compare_reg_t compare; |
51 | tick_compare_reg_t compare; |
| 52 | 52 | ||
| 53 | interrupt_register(14, "tick_int", tick_interrupt); |
53 | interrupt_register(14, "tick_int", tick_interrupt); |
| 54 | compare.int_dis = false; |
54 | compare.int_dis = false; |
| 55 | compare.tick_cmpr = CPU->arch.clock_frequency/HZ; |
55 | compare.tick_cmpr = CPU->arch.clock_frequency / HZ; |
| - | 56 | CPU->arch.next_tick_cmpr = compare.tick_cmpr; |
|
| 56 | tick_compare_write(compare.value); |
57 | tick_compare_write(compare.value); |
| 57 | tick_write(0); |
58 | tick_write(0); |
| 58 | } |
59 | } |
| 59 | 60 | ||
| 60 | /** Process tick interrupt. |
61 | /** Process tick interrupt. |
| Line 63... | Line 64... | ||
| 63 | * @param istate Interrupted state. |
64 | * @param istate Interrupted state. |
| 64 | */ |
65 | */ |
| 65 | void tick_interrupt(int n, istate_t *istate) |
66 | void tick_interrupt(int n, istate_t *istate) |
| 66 | { |
67 | { |
| 67 | softint_reg_t softint, clear; |
68 | softint_reg_t softint, clear; |
| 68 | uint64_t next, compare, start, stop; |
69 | uint64_t drift; |
| 69 | 70 | ||
| 70 | softint.value = softint_read(); |
71 | softint.value = softint_read(); |
| 71 | 72 | ||
| 72 | /* |
73 | /* |
| 73 | * Make sure we are servicing interrupt_level_14 |
74 | * Make sure we are servicing interrupt_level_14 |
| Line 85... | Line 86... | ||
| 85 | clear.value = 0; |
86 | clear.value = 0; |
| 86 | clear.tick_int = 1; |
87 | clear.tick_int = 1; |
| 87 | clear_softint_write(clear.value); |
88 | clear_softint_write(clear.value); |
| 88 | 89 | ||
| 89 | /* |
90 | /* |
| 90 | * Restart counter. |
91 | * Reprogram the compare register. |
| - | 92 | * For now, we can ignore the potential of the registers to overflow. |
|
| - | 93 | * On a 360MHz Ultra 60, the 63-bit compare counter will overflow in |
|
| - | 94 | * about 812 years. If there was a 2GHz UltraSPARC computer, it would |
|
| - | 95 | * overflow only in 146 years. |
|
| 91 | */ |
96 | */ |
| 92 | compare = CPU->arch.clock_frequency/HZ; |
97 | drift = tick_read() - CPU->arch.next_tick_cmpr; |
| 93 | start = tick_read(); |
- | |
| 94 | next = start - compare; |
- | |
| 95 | while (next >= compare - TICK_RESTART_TIME) { |
98 | while (drift > CPU->arch.clock_frequency / HZ) { |
| 96 | next -= compare; |
99 | drift -= CPU->arch.clock_frequency / HZ; |
| 97 | CPU->missed_clock_ticks++; |
100 | CPU->missed_clock_ticks++; |
| 98 | } |
101 | } |
| - | 102 | CPU->arch.next_tick_cmpr = tick_read() + (CPU->arch.clock_frequency / HZ) |
|
| 99 | stop = tick_read(); |
103 | - drift; |
| 100 | tick_write(next + (stop - start)); |
104 | tick_compare_write(CPU->arch.next_tick_cmpr); |
| 101 | - | ||
| 102 | clock(); |
105 | clock(); |
| 103 | } |
106 | } |
| 104 | 107 | ||
| 105 | /** @} |
108 | /** @} |
| 106 | */ |
109 | */ |