forked from Imagelibrary/rtems
2010-11-16 Gedare Bloom <giddyup44@yahoo.com>
PR 1691/bsps * shared/clock/ckinit.c: The sparc64/shared/clock driver has a bug that causes nested timer interrupts to not be serviced, which leads to non-preemptive behavior especially when dispatching work from the timer ISR.
This commit is contained in:
@@ -1,3 +1,11 @@
|
|||||||
|
2010-11-16 Gedare Bloom <giddyup44@yahoo.com>
|
||||||
|
|
||||||
|
PR 1691/bsps
|
||||||
|
* shared/clock/ckinit.c: The sparc64/shared/clock driver has
|
||||||
|
a bug that causes nested timer interrupts to not be serviced,
|
||||||
|
which leads to non-preemptive behavior especially when dispatching
|
||||||
|
work from the timer ISR.
|
||||||
|
|
||||||
2010-11-15 Gedare Bloom <giddyup44@yahoo.com>
|
2010-11-15 Gedare Bloom <giddyup44@yahoo.com>
|
||||||
|
|
||||||
PR 1691/bsps
|
PR 1691/bsps
|
||||||
|
|||||||
@@ -50,11 +50,16 @@ void Clock_driver_support_at_tick(void)
|
|||||||
{
|
{
|
||||||
uint64_t tick_reg;
|
uint64_t tick_reg;
|
||||||
int bit_mask;
|
int bit_mask;
|
||||||
|
uint64_t pil_reg;
|
||||||
|
|
||||||
bit_mask = SPARC_SOFTINT_TM_MASK | SPARC_SOFTINT_SM_MASK | (1<<14);
|
bit_mask = SPARC_SOFTINT_TM_MASK | SPARC_SOFTINT_SM_MASK | (1<<14);
|
||||||
sparc64_clear_interrupt_bits(bit_mask);
|
sparc64_clear_interrupt_bits(bit_mask);
|
||||||
|
|
||||||
|
sparc64_get_pil(pil_reg);
|
||||||
|
if(pil_reg == 0xe) { /* 0xe is the tick compare interrupt (softint(14)) */
|
||||||
|
pil_reg--;
|
||||||
|
sparc64_set_pil(pil_reg); /* enable the next timer interrupt */
|
||||||
|
}
|
||||||
/* Note: sun4v uses stick_cmpr for clock driver for M5 simulator, which
|
/* Note: sun4v uses stick_cmpr for clock driver for M5 simulator, which
|
||||||
* does not currently have tick_cmpr implemented */
|
* does not currently have tick_cmpr implemented */
|
||||||
/* TODO: this could be more efficiently implemented as a single assembly
|
/* TODO: this could be more efficiently implemented as a single assembly
|
||||||
@@ -85,7 +90,6 @@ void Clock_driver_support_initialize_hardware(void)
|
|||||||
uint64_t tick_reg;
|
uint64_t tick_reg;
|
||||||
int bit_mask;
|
int bit_mask;
|
||||||
|
|
||||||
|
|
||||||
bit_mask = SPARC_SOFTINT_TM_MASK | SPARC_SOFTINT_SM_MASK | (1<<14);
|
bit_mask = SPARC_SOFTINT_TM_MASK | SPARC_SOFTINT_SM_MASK | (1<<14);
|
||||||
sparc64_clear_interrupt_bits(bit_mask);
|
sparc64_clear_interrupt_bits(bit_mask);
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user