|
|
1.1 ! root 1: #if ! __BORLANDC__ ! 2: #error This file is for Borland C++ support only. ! 3: #endif ! 4: ! 5: #define _DDI_DKI 1 ! 6: #define _SYSV4 1 ! 7: ! 8: #include <kernel/ddi_glob.h> ! 9: #include <kernel/ddi_cpu.h> ! 10: #include <kernel/x86lock.h> ! 11: #include <kernel/defer.h> ! 12: #include <sys/confinfo.h> ! 13: #include <stdlib.h> ! 14: #include <dos.h> ! 15: ! 16: __EXTERN_C_BEGIN__ ! 17: ! 18: void STREAMS_TIMEOUT __PROTO ((void)); ! 19: ! 20: __EXTERN_C_END__ ! 21: ! 22: ! 23: /* ! 24: * Clock-interrupt handler and friends. ! 25: */ ! 26: ! 27: static void clock_deferred_a (void) { ! 28: (* (char __far *) MK_FP (0xB800, 1)) ++; ! 29: } ! 30: static void clock_deferred_b (void) { ! 31: (* (char __far *) MK_FP (0xB800, 2)) ++; ! 32: } ! 33: static void clock_deferred_c (void) { ! 34: (* (char __far *) MK_FP (0xB800, 3)) ++; ! 35: } ! 36: ! 37: __EXTERN_C__ ! 38: void clock_intr (int __NOTUSED (unused)) { ! 39: (* (char __far *) MK_FP (0xB800, 0)) ++; ! 40: defer_int_cpu (clock_deferred_c, 0); ! 41: defer_int_here (clock_deferred_a); ! 42: defer_int_any (clock_deferred_b); ! 43: defer_int_any (STREAMS_TIMEOUT); ! 44: } ! 45: ! 46: /* ! 47: * Emulate the Coherent vector-manipulation routines in the DOS environment. ! 48: */ ! 49: ! 50: __EXTERN_C__ ! 51: void SETIVEC (int num) { ! 52: intthunk_t prevint; ! 53: intmask_t mask = __GET_BASE_MASK (); ! 54: int vect = inttab [num].int_vector; ! 55: int newmask = 1 << (vect & 7); ! 56: ! 57: ASSERT (vect != 2); ! 58: ASSERT_BASE_LEVEL (); ! 59: ! 60: prevint = getvect (vect < 8 ? vect + 8 : vect + 0x70); ! 61: ! 62: __emit__ (__CLI__); ! 63: ! 64: setvect (vect < 8 ? vect + 8 : vect + 0x70, inttab [num].int_thunk); ! 65: ! 66: mask = ddi_cpu_data ()->dc_base_mask; ! 67: ! 68: /* ! 69: * Set up for chaining if the interrupt was previously enabled. ! 70: */ ! 71: ! 72: if ((mask & newmask) == 0) ! 73: (* inttab [num].int_prev) = prevint; ! 74: else { ! 75: ! 76: mask &= ~ newmask; ! 77: __SET_BASE_MASK (mask); ! 78: } ! 79: ! 80: __emit__ (__STI__); ! 81: } ! 82: ! 83: ! 84: /* ! 85: * Note that the way our interrupt nesting system works, it would be a Bad ! 86: * Idea to try and clear an interrupt vector from an interrupt service ! 87: * routine. ! 88: */ ! 89: ! 90: __EXTERN_C__ ! 91: void CLRIVEC (int num) { ! 92: int vect = inttab [num].int_vector; ! 93: int newmask = 1 << (vect & 7); ! 94: intmask_t mask = __GET_BASE_MASK (); ! 95: ! 96: ASSERT_BASE_LEVEL (); ! 97: ! 98: __emit__ (__CLI__); ! 99: ! 100: if (* inttab [num].int_prev != NULL) ! 101: setvect (vect < 8 ? vect + 8 : vect + 0x70, ! 102: * inttab [num].int_prev); ! 103: else { ! 104: ! 105: mask |= newmask; ! 106: __SET_BASE_MASK (mask); ! 107: } ! 108: ! 109: __emit__ (__STI__); ! 110: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.