1 /* 2 * PROJECT: NEC PC-98 series HAL 3 * LICENSE: GPL-2.0-or-later (https://spdx.org/licenses/GPL-2.0-or-later) 4 * PURPOSE: IRQL mapping 5 * COPYRIGHT: Copyright 2020 Dmitry Borisov (di.sean@protonmail.com) 6 */ 7 8 /* INCLUDES *******************************************************************/ 9 10 #include <hal.h> 11 12 /* GLOBALS ********************************************************************/ 13 14 /* This table contains the static x86 PIC mapping between IRQLs and IRQs */ 15 ULONG KiI8259MaskTable[32] = 16 { 17 /* 18 * See comments of the PC/AT version. 19 */ 20 0b00000000000000000000000000000000, /* IRQL 0 */ 21 0b00000000000000000000000000000000, /* IRQL 1 */ 22 0b00000000000000000000000000000000, /* IRQL 2 */ 23 0b00000000000000000000000000000000, /* IRQL 3 */ 24 0b11111111100000000000000000000000, /* IRQL 4 */ 25 0b11111111110000000000000000000000, /* IRQL 5 */ 26 0b11111111111000000000000000000000, /* IRQL 6 */ 27 0b11111111111100000000000000000000, /* IRQL 7 */ 28 0b11111111111110000000000000000000, /* IRQL 8 */ 29 0b11111111111111000000000000000000, /* IRQL 9 */ 30 0b11111111111111100000000000000000, /* IRQL 10 */ 31 0b11111111111111110000000000000000, /* IRQL 11 */ 32 33 /* 34 * Okay, now we're finally starting to mask off IRQs on the slave PIC, from 35 * IRQ15 to IRQ8. Note that the output of INT of RTC is connected to the IR7. 36 * We need to keep this IRQ unmasked, so we can ensure profiling the whole system. 37 */ 38 0b11111111111111110000000000000000, /* IRQL 12 */ 39 0b11111111111111110100000000000000, /* IRQL 13 */ 40 0b11111111111111110110000000000000, /* IRQL 14 */ 41 0b11111111111111110111000000000000, /* IRQL 15 */ 42 0b11111111111111110111100000000000, /* IRQL 16 */ 43 0b11111111111111110111110000000000, /* IRQL 17 */ 44 0b11111111111111110111111000000000, /* IRQL 18 */ 45 0b11111111111111110111111000000000, /* IRQL 19 */ 46 47 /* 48 * Now we mask off the IRQs on the master. Since IRQL 19 we have 0 "droplet". 49 * It's the cascade IRQ that we use to bridge the slave PIC with the master PIC. 50 */ 51 0b11111111111111110111111100000000, /* IRQL 20 */ 52 0b11111111111111110111111101000000, /* IRQL 21 */ 53 0b11111111111111110111111101100000, /* IRQL 22 */ 54 0b11111111111111110111111101110000, /* IRQL 23 */ 55 0b11111111111111110111111101111000, /* IRQL 24 */ 56 0b11111111111111110111111101111100, /* IRQL 25 */ 57 0b11111111111111110111111101111110, /* IRQL 26 */ 58 0b11111111111111111111111101111110, /* IRQL 27 */ 59 60 /* 61 * See comments of the PC/AT version. 62 */ 63 0b11111111111111111111111101111111, /* IRQL 28 */ 64 0b11111111111111111111111101111111, /* IRQL 29 */ 65 0b11111111111111111111111101111111, /* IRQL 30 */ 66 0b11111111111111111111111101111111 /* IRQL 31 */ 67 }; 68 69 /* This table indicates which IRQs, if pending, can preempt a given IRQL level */ 70 ULONG FindHigherIrqlMask[32] = 71 { 72 /* 73 * See comments of the PC/AT version. 74 */ 75 0b11111111111111111111111111111110, /* IRQL 0 */ 76 0b11111111111111111111111111111100, /* IRQL 1 */ 77 0b11111111111111111111111111111000, /* IRQL 2 */ 78 0b11111111111111111111111111110000, /* IRQL 3 */ 79 0b00000111111111111111111111110000, /* IRQL 4 */ 80 0b00000011111111111111111111110000, /* IRQL 5 */ 81 0b00000001111111111111111111110000, /* IRQL 6 */ 82 0b00000000111111111111111111110000, /* IRQL 7 */ 83 0b00000000011111111111111111110000, /* IRQL 8 */ 84 0b00000000001111111111111111110000, /* IRQL 9 */ 85 0b00000000000111111111111111110000, /* IRQL 10 */ 86 87 /* 88 * Now we start progressivly limiting which slave PIC interrupts have the 89 * right to preempt us at each level. The RTC timer used for profiling, 90 * so it will always preempt until we reach PROFILE_LEVEL. 91 */ 92 0b00000000000011111111111111110000, /* IRQL 11 */ 93 0b00000000000011111111111111110000, /* IRQL 12 */ 94 0b00000000000010111111111111110000, /* IRQL 13 */ 95 0b00000000000010011111111111110000, /* IRQL 14 */ 96 0b00000000000010001111111111110000, /* IRQL 15 */ 97 0b00000000000010000111111111110000, /* IRQL 16 */ 98 0b00000000000010000011111111110000, /* IRQL 17 */ 99 0b00000000000010000001111111110000, /* IRQL 18 */ 100 0b00000000000010000001111111110000, /* IRQL 19 */ 101 102 /* 103 * Now with IRQs on the master PIC. 104 */ 105 0b00000000000010000000011111110000, /* IRQL 20 */ 106 0b00000000000010000000001111110000, /* IRQL 21 */ 107 0b00000000000010000000000111110000, /* IRQL 22 */ 108 0b00000000000010000000000011110000, /* IRQL 23 */ 109 0b00000000000010000000000001110000, /* IRQL 24 */ 110 0b00000000000010000000000000110000, /* IRQL 25 */ 111 0b00000000000010000000000000010000, /* IRQL 26 */ 112 113 /* 114 * See comments of the PC/AT version. 115 */ 116 0b00000000000000000000000000010000, /* IRQL 27 */ 117 0b00000000000000000000000000000000, /* IRQL 28 */ 118 0b00000000000000000000000000000000, /* IRQL 29 */ 119 0b00000000000000000000000000000000, /* IRQL 30 */ 120 0b00000000000000000000000000000000 /* IRQL 31 */ 121 }; 122