diff --git a/sys/amd64/amd64/tsc.c b/sys/amd64/amd64/tsc.c index 2676332d8e39..196d34ce75ca 100644 --- a/sys/amd64/amd64/tsc.c +++ b/sys/amd64/amd64/tsc.c @@ -34,7 +34,7 @@ * SUCH DAMAGE. * * from: @(#)clock.c 7.2 (Berkeley) 5/12/91 - * $Id: clock.c,v 1.31 1995/01/19 22:05:27 ats Exp $ + * $Id: clock.c,v 1.32 1995/03/16 18:11:58 bde Exp $ */ /* @@ -92,6 +92,7 @@ int adjkerntz = 0; /* offset from CMOS clock */ int disable_rtc_set = 0; /* disable resettodr() if != 0 */ +u_int idelayed; #ifdef I586_CPU int pentium_mhz; #endif @@ -124,6 +125,7 @@ void clkintr(struct clockframe frame) { hardclock(&frame); + setdelayed(); } #else void @@ -132,15 +134,18 @@ clkintr(struct clockframe frame) timer_func(&frame); switch (timer0_state) { case 0: + setdelayed(); break; case 1: if ((timer0_prescaler_count += timer0_max_count) >= hardclock_max_count) { hardclock(&frame); + setdelayed(); timer0_prescaler_count -= hardclock_max_count; } break; case 2: + setdelayed(); timer0_max_count = TIMER_DIV(new_rate); timer0_overflow_threshold = timer0_max_count - TIMER0_LATCH_COUNT; @@ -157,6 +162,7 @@ clkintr(struct clockframe frame) if ((timer0_prescaler_count += timer0_max_count) >= hardclock_max_count) { hardclock(&frame); + setdelayed(); timer0_max_count = hardclock_max_count; timer0_overflow_threshold = timer0_max_count - TIMER0_LATCH_COUNT; diff --git a/sys/amd64/isa/clock.c b/sys/amd64/isa/clock.c index 2676332d8e39..196d34ce75ca 100644 --- a/sys/amd64/isa/clock.c +++ b/sys/amd64/isa/clock.c @@ -34,7 +34,7 @@ * SUCH DAMAGE. * * from: @(#)clock.c 7.2 (Berkeley) 5/12/91 - * $Id: clock.c,v 1.31 1995/01/19 22:05:27 ats Exp $ + * $Id: clock.c,v 1.32 1995/03/16 18:11:58 bde Exp $ */ /* @@ -92,6 +92,7 @@ int adjkerntz = 0; /* offset from CMOS clock */ int disable_rtc_set = 0; /* disable resettodr() if != 0 */ +u_int idelayed; #ifdef I586_CPU int pentium_mhz; #endif @@ -124,6 +125,7 @@ void clkintr(struct clockframe frame) { hardclock(&frame); + setdelayed(); } #else void @@ -132,15 +134,18 @@ clkintr(struct clockframe frame) timer_func(&frame); switch (timer0_state) { case 0: + setdelayed(); break; case 1: if ((timer0_prescaler_count += timer0_max_count) >= hardclock_max_count) { hardclock(&frame); + setdelayed(); timer0_prescaler_count -= hardclock_max_count; } break; case 2: + setdelayed(); timer0_max_count = TIMER_DIV(new_rate); timer0_overflow_threshold = timer0_max_count - TIMER0_LATCH_COUNT; @@ -157,6 +162,7 @@ clkintr(struct clockframe frame) if ((timer0_prescaler_count += timer0_max_count) >= hardclock_max_count) { hardclock(&frame); + setdelayed(); timer0_max_count = hardclock_max_count; timer0_overflow_threshold = timer0_max_count - TIMER0_LATCH_COUNT; diff --git a/sys/i386/i386/tsc.c b/sys/i386/i386/tsc.c index 2676332d8e39..196d34ce75ca 100644 --- a/sys/i386/i386/tsc.c +++ b/sys/i386/i386/tsc.c @@ -34,7 +34,7 @@ * SUCH DAMAGE. * * from: @(#)clock.c 7.2 (Berkeley) 5/12/91 - * $Id: clock.c,v 1.31 1995/01/19 22:05:27 ats Exp $ + * $Id: clock.c,v 1.32 1995/03/16 18:11:58 bde Exp $ */ /* @@ -92,6 +92,7 @@ int adjkerntz = 0; /* offset from CMOS clock */ int disable_rtc_set = 0; /* disable resettodr() if != 0 */ +u_int idelayed; #ifdef I586_CPU int pentium_mhz; #endif @@ -124,6 +125,7 @@ void clkintr(struct clockframe frame) { hardclock(&frame); + setdelayed(); } #else void @@ -132,15 +134,18 @@ clkintr(struct clockframe frame) timer_func(&frame); switch (timer0_state) { case 0: + setdelayed(); break; case 1: if ((timer0_prescaler_count += timer0_max_count) >= hardclock_max_count) { hardclock(&frame); + setdelayed(); timer0_prescaler_count -= hardclock_max_count; } break; case 2: + setdelayed(); timer0_max_count = TIMER_DIV(new_rate); timer0_overflow_threshold = timer0_max_count - TIMER0_LATCH_COUNT; @@ -157,6 +162,7 @@ clkintr(struct clockframe frame) if ((timer0_prescaler_count += timer0_max_count) >= hardclock_max_count) { hardclock(&frame); + setdelayed(); timer0_max_count = hardclock_max_count; timer0_overflow_threshold = timer0_max_count - TIMER0_LATCH_COUNT; diff --git a/sys/i386/include/spl.h b/sys/i386/include/spl.h index 3ffc50fd1bbd..1db479fe5ddc 100644 --- a/sys/i386/include/spl.h +++ b/sys/i386/include/spl.h @@ -30,7 +30,7 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $Id: spl.h,v 1.6 1994/12/30 12:42:15 bde Exp $ + * $Id: spl.h,v 1.7 1995/05/11 00:13:01 wollman Exp $ */ #ifndef _MACHINE_IPL_H_ @@ -74,6 +74,7 @@ extern unsigned bio_imask; /* group of interrupts masked with splbio() */ extern unsigned cpl; /* current priority level mask */ +extern volatile unsigned idelayed; /* interrupts to become pending */ extern volatile unsigned ipending; /* active interrupts masked by cpl */ extern unsigned net_imask; /* group of interrupts masked with splimp() */ extern unsigned stat_imask; /* interrupts masked with splstatclock() */ @@ -85,11 +86,14 @@ extern unsigned tty_imask; /* group of interrupts masked with spltty() */ * it is changed. Pretending that ipending is a plain int happens to give * suitable atomic code for "ipending |= constant;". */ +#define setdelayed() (*(unsigned *)&ipending |= loadandclear(&idelayed)) #define setsoftast() (*(unsigned *)&ipending |= SWI_AST_PENDING) #define setsoftclock() (*(unsigned *)&ipending |= SWI_CLOCK_PENDING) #define setsoftnet() (*(unsigned *)&ipending |= SWI_NET_PENDING) #define setsofttty() (*(unsigned *)&ipending |= SWI_TTY_PENDING) +#define schedsofttty() (*(unsigned *)&idelayed |= SWI_TTY_PENDING) + void unpend_V __P((void)); #ifdef __GNUC__ diff --git a/sys/i386/isa/clock.c b/sys/i386/isa/clock.c index 2676332d8e39..196d34ce75ca 100644 --- a/sys/i386/isa/clock.c +++ b/sys/i386/isa/clock.c @@ -34,7 +34,7 @@ * SUCH DAMAGE. * * from: @(#)clock.c 7.2 (Berkeley) 5/12/91 - * $Id: clock.c,v 1.31 1995/01/19 22:05:27 ats Exp $ + * $Id: clock.c,v 1.32 1995/03/16 18:11:58 bde Exp $ */ /* @@ -92,6 +92,7 @@ int adjkerntz = 0; /* offset from CMOS clock */ int disable_rtc_set = 0; /* disable resettodr() if != 0 */ +u_int idelayed; #ifdef I586_CPU int pentium_mhz; #endif @@ -124,6 +125,7 @@ void clkintr(struct clockframe frame) { hardclock(&frame); + setdelayed(); } #else void @@ -132,15 +134,18 @@ clkintr(struct clockframe frame) timer_func(&frame); switch (timer0_state) { case 0: + setdelayed(); break; case 1: if ((timer0_prescaler_count += timer0_max_count) >= hardclock_max_count) { hardclock(&frame); + setdelayed(); timer0_prescaler_count -= hardclock_max_count; } break; case 2: + setdelayed(); timer0_max_count = TIMER_DIV(new_rate); timer0_overflow_threshold = timer0_max_count - TIMER0_LATCH_COUNT; @@ -157,6 +162,7 @@ clkintr(struct clockframe frame) if ((timer0_prescaler_count += timer0_max_count) >= hardclock_max_count) { hardclock(&frame); + setdelayed(); timer0_max_count = hardclock_max_count; timer0_overflow_threshold = timer0_max_count - TIMER0_LATCH_COUNT; diff --git a/sys/isa/atrtc.c b/sys/isa/atrtc.c index 2676332d8e39..196d34ce75ca 100644 --- a/sys/isa/atrtc.c +++ b/sys/isa/atrtc.c @@ -34,7 +34,7 @@ * SUCH DAMAGE. * * from: @(#)clock.c 7.2 (Berkeley) 5/12/91 - * $Id: clock.c,v 1.31 1995/01/19 22:05:27 ats Exp $ + * $Id: clock.c,v 1.32 1995/03/16 18:11:58 bde Exp $ */ /* @@ -92,6 +92,7 @@ int adjkerntz = 0; /* offset from CMOS clock */ int disable_rtc_set = 0; /* disable resettodr() if != 0 */ +u_int idelayed; #ifdef I586_CPU int pentium_mhz; #endif @@ -124,6 +125,7 @@ void clkintr(struct clockframe frame) { hardclock(&frame); + setdelayed(); } #else void @@ -132,15 +134,18 @@ clkintr(struct clockframe frame) timer_func(&frame); switch (timer0_state) { case 0: + setdelayed(); break; case 1: if ((timer0_prescaler_count += timer0_max_count) >= hardclock_max_count) { hardclock(&frame); + setdelayed(); timer0_prescaler_count -= hardclock_max_count; } break; case 2: + setdelayed(); timer0_max_count = TIMER_DIV(new_rate); timer0_overflow_threshold = timer0_max_count - TIMER0_LATCH_COUNT; @@ -157,6 +162,7 @@ clkintr(struct clockframe frame) if ((timer0_prescaler_count += timer0_max_count) >= hardclock_max_count) { hardclock(&frame); + setdelayed(); timer0_max_count = hardclock_max_count; timer0_overflow_threshold = timer0_max_count - TIMER0_LATCH_COUNT;