--- /dev/null
+#ifndef __LUNAIX_I386_INTR_H
+#define __LUNAIX_I386_INTR_H
+
+void
+exception_install_handler();
+
+void
+intr_routine_init();
+
+#endif /* __LUNAIX_I386_INTR_H */
--- /dev/null
+#include "i386_intr.h"
+#include <lunaix/types.h>
+
+#define IDT_INTERRUPT 0x70
+#define KERNEL_CS 0x8
+#define IDT_ATTR(dpl, type) (((type) << 5) | ((dpl & 3) << 13) | (1 << 15))
+#define IDT_ENTRY 256
+
+#define DECLARE_ISR(iv) extern void _asm_isr##iv();
+
+#define ISR_INSTALL(idt, iv, isr) \
+ _idt[iv] = ((ptr_t)isr & 0xffff0000) | IDT_ATTR(0, IDT_INTERRUPT); \
+ _idt[iv] <<= 32; \
+ _idt[iv] |= (KERNEL_CS << 16) | ((ptr_t)isr & 0x0000ffff);
+
+u64_t _idt[IDT_ENTRY];
+u16_t _idt_limit = sizeof(_idt) - 1;
+
+DECLARE_ISR(0)
+DECLARE_ISR(1)
+DECLARE_ISR(2)
+DECLARE_ISR(3)
+DECLARE_ISR(4)
+DECLARE_ISR(5)
+DECLARE_ISR(6)
+DECLARE_ISR(7)
+DECLARE_ISR(8)
+DECLARE_ISR(9)
+DECLARE_ISR(10)
+DECLARE_ISR(11)
+DECLARE_ISR(12)
+DECLARE_ISR(13)
+DECLARE_ISR(14)
+DECLARE_ISR(15)
+DECLARE_ISR(16)
+DECLARE_ISR(17)
+DECLARE_ISR(18)
+DECLARE_ISR(19)
+DECLARE_ISR(20)
+DECLARE_ISR(21)
+DECLARE_ISR(22)
+DECLARE_ISR(23)
+DECLARE_ISR(24)
+DECLARE_ISR(25)
+DECLARE_ISR(26)
+DECLARE_ISR(27)
+DECLARE_ISR(28)
+DECLARE_ISR(29)
+DECLARE_ISR(30)
+DECLARE_ISR(31)
+DECLARE_ISR(32)
+DECLARE_ISR(33)
+DECLARE_ISR(34)
+DECLARE_ISR(35)
+DECLARE_ISR(36)
+DECLARE_ISR(37)
+DECLARE_ISR(38)
+DECLARE_ISR(39)
+DECLARE_ISR(40)
+DECLARE_ISR(41)
+DECLARE_ISR(42)
+DECLARE_ISR(43)
+DECLARE_ISR(44)
+DECLARE_ISR(45)
+DECLARE_ISR(46)
+DECLARE_ISR(47)
+DECLARE_ISR(48)
+DECLARE_ISR(49)
+DECLARE_ISR(50)
+DECLARE_ISR(51)
+DECLARE_ISR(52)
+DECLARE_ISR(53)
+DECLARE_ISR(54)
+DECLARE_ISR(55)
+DECLARE_ISR(56)
+DECLARE_ISR(57)
+DECLARE_ISR(58)
+DECLARE_ISR(59)
+DECLARE_ISR(60)
+DECLARE_ISR(61)
+DECLARE_ISR(62)
+DECLARE_ISR(63)
+DECLARE_ISR(64)
+DECLARE_ISR(65)
+DECLARE_ISR(66)
+DECLARE_ISR(67)
+DECLARE_ISR(68)
+DECLARE_ISR(69)
+DECLARE_ISR(70)
+DECLARE_ISR(71)
+DECLARE_ISR(72)
+DECLARE_ISR(73)
+DECLARE_ISR(74)
+DECLARE_ISR(75)
+DECLARE_ISR(76)
+DECLARE_ISR(77)
+DECLARE_ISR(78)
+DECLARE_ISR(79)
+DECLARE_ISR(80)
+DECLARE_ISR(81)
+DECLARE_ISR(82)
+DECLARE_ISR(83)
+DECLARE_ISR(84)
+DECLARE_ISR(85)
+DECLARE_ISR(86)
+DECLARE_ISR(87)
+DECLARE_ISR(88)
+DECLARE_ISR(89)
+DECLARE_ISR(90)
+DECLARE_ISR(91)
+DECLARE_ISR(92)
+DECLARE_ISR(93)
+DECLARE_ISR(94)
+DECLARE_ISR(95)
+DECLARE_ISR(96)
+DECLARE_ISR(97)
+DECLARE_ISR(98)
+DECLARE_ISR(99)
+DECLARE_ISR(100)
+DECLARE_ISR(101)
+DECLARE_ISR(102)
+DECLARE_ISR(103)
+DECLARE_ISR(104)
+DECLARE_ISR(105)
+DECLARE_ISR(106)
+DECLARE_ISR(107)
+DECLARE_ISR(108)
+DECLARE_ISR(109)
+DECLARE_ISR(110)
+DECLARE_ISR(111)
+DECLARE_ISR(112)
+DECLARE_ISR(113)
+DECLARE_ISR(114)
+DECLARE_ISR(115)
+DECLARE_ISR(116)
+DECLARE_ISR(117)
+DECLARE_ISR(118)
+DECLARE_ISR(119)
+DECLARE_ISR(120)
+DECLARE_ISR(121)
+DECLARE_ISR(122)
+DECLARE_ISR(123)
+DECLARE_ISR(124)
+DECLARE_ISR(125)
+DECLARE_ISR(126)
+DECLARE_ISR(127)
+DECLARE_ISR(128)
+DECLARE_ISR(129)
+DECLARE_ISR(130)
+DECLARE_ISR(131)
+DECLARE_ISR(132)
+DECLARE_ISR(133)
+DECLARE_ISR(134)
+DECLARE_ISR(135)
+DECLARE_ISR(136)
+DECLARE_ISR(137)
+DECLARE_ISR(138)
+DECLARE_ISR(139)
+DECLARE_ISR(140)
+DECLARE_ISR(141)
+DECLARE_ISR(142)
+DECLARE_ISR(143)
+DECLARE_ISR(144)
+DECLARE_ISR(145)
+DECLARE_ISR(146)
+DECLARE_ISR(147)
+DECLARE_ISR(148)
+DECLARE_ISR(149)
+DECLARE_ISR(150)
+DECLARE_ISR(151)
+DECLARE_ISR(152)
+DECLARE_ISR(153)
+DECLARE_ISR(154)
+DECLARE_ISR(155)
+DECLARE_ISR(156)
+DECLARE_ISR(157)
+DECLARE_ISR(158)
+DECLARE_ISR(159)
+DECLARE_ISR(160)
+DECLARE_ISR(161)
+DECLARE_ISR(162)
+DECLARE_ISR(163)
+DECLARE_ISR(164)
+DECLARE_ISR(165)
+DECLARE_ISR(166)
+DECLARE_ISR(167)
+DECLARE_ISR(168)
+DECLARE_ISR(169)
+DECLARE_ISR(170)
+DECLARE_ISR(171)
+DECLARE_ISR(172)
+DECLARE_ISR(173)
+DECLARE_ISR(174)
+DECLARE_ISR(175)
+DECLARE_ISR(176)
+DECLARE_ISR(177)
+DECLARE_ISR(178)
+DECLARE_ISR(179)
+DECLARE_ISR(180)
+DECLARE_ISR(181)
+DECLARE_ISR(182)
+DECLARE_ISR(183)
+DECLARE_ISR(184)
+DECLARE_ISR(185)
+DECLARE_ISR(186)
+DECLARE_ISR(187)
+DECLARE_ISR(188)
+DECLARE_ISR(189)
+DECLARE_ISR(190)
+DECLARE_ISR(191)
+DECLARE_ISR(192)
+DECLARE_ISR(193)
+DECLARE_ISR(194)
+DECLARE_ISR(195)
+DECLARE_ISR(196)
+DECLARE_ISR(197)
+DECLARE_ISR(198)
+DECLARE_ISR(199)
+DECLARE_ISR(200)
+DECLARE_ISR(201)
+DECLARE_ISR(202)
+DECLARE_ISR(203)
+DECLARE_ISR(204)
+DECLARE_ISR(205)
+DECLARE_ISR(206)
+DECLARE_ISR(207)
+DECLARE_ISR(208)
+DECLARE_ISR(209)
+DECLARE_ISR(210)
+DECLARE_ISR(211)
+DECLARE_ISR(212)
+DECLARE_ISR(213)
+DECLARE_ISR(214)
+DECLARE_ISR(215)
+DECLARE_ISR(216)
+DECLARE_ISR(217)
+DECLARE_ISR(218)
+DECLARE_ISR(219)
+DECLARE_ISR(220)
+DECLARE_ISR(221)
+DECLARE_ISR(222)
+DECLARE_ISR(223)
+DECLARE_ISR(224)
+DECLARE_ISR(225)
+DECLARE_ISR(226)
+DECLARE_ISR(227)
+DECLARE_ISR(228)
+DECLARE_ISR(229)
+DECLARE_ISR(230)
+DECLARE_ISR(231)
+DECLARE_ISR(232)
+DECLARE_ISR(233)
+DECLARE_ISR(234)
+DECLARE_ISR(235)
+DECLARE_ISR(236)
+DECLARE_ISR(237)
+DECLARE_ISR(238)
+DECLARE_ISR(239)
+DECLARE_ISR(240)
+DECLARE_ISR(241)
+DECLARE_ISR(242)
+DECLARE_ISR(243)
+DECLARE_ISR(244)
+DECLARE_ISR(245)
+DECLARE_ISR(246)
+DECLARE_ISR(247)
+DECLARE_ISR(248)
+DECLARE_ISR(249)
+DECLARE_ISR(250)
+DECLARE_ISR(251)
+DECLARE_ISR(252)
+DECLARE_ISR(253)
+DECLARE_ISR(254)
+DECLARE_ISR(255)
+
+void
+exception_install_handler()
+{
+ ISR_INSTALL(_idt, 0, _asm_isr0)
+ ISR_INSTALL(_idt, 1, _asm_isr1)
+ ISR_INSTALL(_idt, 2, _asm_isr2)
+ ISR_INSTALL(_idt, 3, _asm_isr3)
+ ISR_INSTALL(_idt, 4, _asm_isr4)
+ ISR_INSTALL(_idt, 5, _asm_isr5)
+ ISR_INSTALL(_idt, 6, _asm_isr6)
+ ISR_INSTALL(_idt, 7, _asm_isr7)
+ ISR_INSTALL(_idt, 8, _asm_isr8)
+ ISR_INSTALL(_idt, 9, _asm_isr9)
+ ISR_INSTALL(_idt, 10, _asm_isr10)
+ ISR_INSTALL(_idt, 11, _asm_isr11)
+ ISR_INSTALL(_idt, 12, _asm_isr12)
+ ISR_INSTALL(_idt, 13, _asm_isr13)
+ ISR_INSTALL(_idt, 14, _asm_isr14)
+ ISR_INSTALL(_idt, 15, _asm_isr15)
+ ISR_INSTALL(_idt, 16, _asm_isr16)
+ ISR_INSTALL(_idt, 17, _asm_isr17)
+ ISR_INSTALL(_idt, 18, _asm_isr18)
+ ISR_INSTALL(_idt, 19, _asm_isr19)
+ ISR_INSTALL(_idt, 20, _asm_isr20)
+ ISR_INSTALL(_idt, 21, _asm_isr21)
+ ISR_INSTALL(_idt, 22, _asm_isr22)
+ ISR_INSTALL(_idt, 23, _asm_isr23)
+ ISR_INSTALL(_idt, 24, _asm_isr24)
+ ISR_INSTALL(_idt, 25, _asm_isr25)
+ ISR_INSTALL(_idt, 26, _asm_isr26)
+ ISR_INSTALL(_idt, 27, _asm_isr27)
+ ISR_INSTALL(_idt, 28, _asm_isr28)
+ ISR_INSTALL(_idt, 29, _asm_isr29)
+ ISR_INSTALL(_idt, 30, _asm_isr30)
+ ISR_INSTALL(_idt, 31, _asm_isr31)
+ ISR_INSTALL(_idt, 32, _asm_isr32)
+ ISR_INSTALL(_idt, 33, _asm_isr33)
+ ISR_INSTALL(_idt, 34, _asm_isr34)
+ ISR_INSTALL(_idt, 35, _asm_isr35)
+ ISR_INSTALL(_idt, 36, _asm_isr36)
+ ISR_INSTALL(_idt, 37, _asm_isr37)
+ ISR_INSTALL(_idt, 38, _asm_isr38)
+ ISR_INSTALL(_idt, 39, _asm_isr39)
+ ISR_INSTALL(_idt, 40, _asm_isr40)
+ ISR_INSTALL(_idt, 41, _asm_isr41)
+ ISR_INSTALL(_idt, 42, _asm_isr42)
+ ISR_INSTALL(_idt, 43, _asm_isr43)
+ ISR_INSTALL(_idt, 44, _asm_isr44)
+ ISR_INSTALL(_idt, 45, _asm_isr45)
+ ISR_INSTALL(_idt, 46, _asm_isr46)
+ ISR_INSTALL(_idt, 47, _asm_isr47)
+ ISR_INSTALL(_idt, 48, _asm_isr48)
+ ISR_INSTALL(_idt, 49, _asm_isr49)
+ ISR_INSTALL(_idt, 50, _asm_isr50)
+ ISR_INSTALL(_idt, 51, _asm_isr51)
+ ISR_INSTALL(_idt, 52, _asm_isr52)
+ ISR_INSTALL(_idt, 53, _asm_isr53)
+ ISR_INSTALL(_idt, 54, _asm_isr54)
+ ISR_INSTALL(_idt, 55, _asm_isr55)
+ ISR_INSTALL(_idt, 56, _asm_isr56)
+ ISR_INSTALL(_idt, 57, _asm_isr57)
+ ISR_INSTALL(_idt, 58, _asm_isr58)
+ ISR_INSTALL(_idt, 59, _asm_isr59)
+ ISR_INSTALL(_idt, 60, _asm_isr60)
+ ISR_INSTALL(_idt, 61, _asm_isr61)
+ ISR_INSTALL(_idt, 62, _asm_isr62)
+ ISR_INSTALL(_idt, 63, _asm_isr63)
+ ISR_INSTALL(_idt, 64, _asm_isr64)
+ ISR_INSTALL(_idt, 65, _asm_isr65)
+ ISR_INSTALL(_idt, 66, _asm_isr66)
+ ISR_INSTALL(_idt, 67, _asm_isr67)
+ ISR_INSTALL(_idt, 68, _asm_isr68)
+ ISR_INSTALL(_idt, 69, _asm_isr69)
+ ISR_INSTALL(_idt, 70, _asm_isr70)
+ ISR_INSTALL(_idt, 71, _asm_isr71)
+ ISR_INSTALL(_idt, 72, _asm_isr72)
+ ISR_INSTALL(_idt, 73, _asm_isr73)
+ ISR_INSTALL(_idt, 74, _asm_isr74)
+ ISR_INSTALL(_idt, 75, _asm_isr75)
+ ISR_INSTALL(_idt, 76, _asm_isr76)
+ ISR_INSTALL(_idt, 77, _asm_isr77)
+ ISR_INSTALL(_idt, 78, _asm_isr78)
+ ISR_INSTALL(_idt, 79, _asm_isr79)
+ ISR_INSTALL(_idt, 80, _asm_isr80)
+ ISR_INSTALL(_idt, 81, _asm_isr81)
+ ISR_INSTALL(_idt, 82, _asm_isr82)
+ ISR_INSTALL(_idt, 83, _asm_isr83)
+ ISR_INSTALL(_idt, 84, _asm_isr84)
+ ISR_INSTALL(_idt, 85, _asm_isr85)
+ ISR_INSTALL(_idt, 86, _asm_isr86)
+ ISR_INSTALL(_idt, 87, _asm_isr87)
+ ISR_INSTALL(_idt, 88, _asm_isr88)
+ ISR_INSTALL(_idt, 89, _asm_isr89)
+ ISR_INSTALL(_idt, 90, _asm_isr90)
+ ISR_INSTALL(_idt, 91, _asm_isr91)
+ ISR_INSTALL(_idt, 92, _asm_isr92)
+ ISR_INSTALL(_idt, 93, _asm_isr93)
+ ISR_INSTALL(_idt, 94, _asm_isr94)
+ ISR_INSTALL(_idt, 95, _asm_isr95)
+ ISR_INSTALL(_idt, 96, _asm_isr96)
+ ISR_INSTALL(_idt, 97, _asm_isr97)
+ ISR_INSTALL(_idt, 98, _asm_isr98)
+ ISR_INSTALL(_idt, 99, _asm_isr99)
+ ISR_INSTALL(_idt, 100, _asm_isr100)
+ ISR_INSTALL(_idt, 101, _asm_isr101)
+ ISR_INSTALL(_idt, 102, _asm_isr102)
+ ISR_INSTALL(_idt, 103, _asm_isr103)
+ ISR_INSTALL(_idt, 104, _asm_isr104)
+ ISR_INSTALL(_idt, 105, _asm_isr105)
+ ISR_INSTALL(_idt, 106, _asm_isr106)
+ ISR_INSTALL(_idt, 107, _asm_isr107)
+ ISR_INSTALL(_idt, 108, _asm_isr108)
+ ISR_INSTALL(_idt, 109, _asm_isr109)
+ ISR_INSTALL(_idt, 110, _asm_isr110)
+ ISR_INSTALL(_idt, 111, _asm_isr111)
+ ISR_INSTALL(_idt, 112, _asm_isr112)
+ ISR_INSTALL(_idt, 113, _asm_isr113)
+ ISR_INSTALL(_idt, 114, _asm_isr114)
+ ISR_INSTALL(_idt, 115, _asm_isr115)
+ ISR_INSTALL(_idt, 116, _asm_isr116)
+ ISR_INSTALL(_idt, 117, _asm_isr117)
+ ISR_INSTALL(_idt, 118, _asm_isr118)
+ ISR_INSTALL(_idt, 119, _asm_isr119)
+ ISR_INSTALL(_idt, 120, _asm_isr120)
+ ISR_INSTALL(_idt, 121, _asm_isr121)
+ ISR_INSTALL(_idt, 122, _asm_isr122)
+ ISR_INSTALL(_idt, 123, _asm_isr123)
+ ISR_INSTALL(_idt, 124, _asm_isr124)
+ ISR_INSTALL(_idt, 125, _asm_isr125)
+ ISR_INSTALL(_idt, 126, _asm_isr126)
+ ISR_INSTALL(_idt, 127, _asm_isr127)
+ ISR_INSTALL(_idt, 128, _asm_isr128)
+ ISR_INSTALL(_idt, 129, _asm_isr129)
+ ISR_INSTALL(_idt, 130, _asm_isr130)
+ ISR_INSTALL(_idt, 131, _asm_isr131)
+ ISR_INSTALL(_idt, 132, _asm_isr132)
+ ISR_INSTALL(_idt, 133, _asm_isr133)
+ ISR_INSTALL(_idt, 134, _asm_isr134)
+ ISR_INSTALL(_idt, 135, _asm_isr135)
+ ISR_INSTALL(_idt, 136, _asm_isr136)
+ ISR_INSTALL(_idt, 137, _asm_isr137)
+ ISR_INSTALL(_idt, 138, _asm_isr138)
+ ISR_INSTALL(_idt, 139, _asm_isr139)
+ ISR_INSTALL(_idt, 140, _asm_isr140)
+ ISR_INSTALL(_idt, 141, _asm_isr141)
+ ISR_INSTALL(_idt, 142, _asm_isr142)
+ ISR_INSTALL(_idt, 143, _asm_isr143)
+ ISR_INSTALL(_idt, 144, _asm_isr144)
+ ISR_INSTALL(_idt, 145, _asm_isr145)
+ ISR_INSTALL(_idt, 146, _asm_isr146)
+ ISR_INSTALL(_idt, 147, _asm_isr147)
+ ISR_INSTALL(_idt, 148, _asm_isr148)
+ ISR_INSTALL(_idt, 149, _asm_isr149)
+ ISR_INSTALL(_idt, 150, _asm_isr150)
+ ISR_INSTALL(_idt, 151, _asm_isr151)
+ ISR_INSTALL(_idt, 152, _asm_isr152)
+ ISR_INSTALL(_idt, 153, _asm_isr153)
+ ISR_INSTALL(_idt, 154, _asm_isr154)
+ ISR_INSTALL(_idt, 155, _asm_isr155)
+ ISR_INSTALL(_idt, 156, _asm_isr156)
+ ISR_INSTALL(_idt, 157, _asm_isr157)
+ ISR_INSTALL(_idt, 158, _asm_isr158)
+ ISR_INSTALL(_idt, 159, _asm_isr159)
+ ISR_INSTALL(_idt, 160, _asm_isr160)
+ ISR_INSTALL(_idt, 161, _asm_isr161)
+ ISR_INSTALL(_idt, 162, _asm_isr162)
+ ISR_INSTALL(_idt, 163, _asm_isr163)
+ ISR_INSTALL(_idt, 164, _asm_isr164)
+ ISR_INSTALL(_idt, 165, _asm_isr165)
+ ISR_INSTALL(_idt, 166, _asm_isr166)
+ ISR_INSTALL(_idt, 167, _asm_isr167)
+ ISR_INSTALL(_idt, 168, _asm_isr168)
+ ISR_INSTALL(_idt, 169, _asm_isr169)
+ ISR_INSTALL(_idt, 170, _asm_isr170)
+ ISR_INSTALL(_idt, 171, _asm_isr171)
+ ISR_INSTALL(_idt, 172, _asm_isr172)
+ ISR_INSTALL(_idt, 173, _asm_isr173)
+ ISR_INSTALL(_idt, 174, _asm_isr174)
+ ISR_INSTALL(_idt, 175, _asm_isr175)
+ ISR_INSTALL(_idt, 176, _asm_isr176)
+ ISR_INSTALL(_idt, 177, _asm_isr177)
+ ISR_INSTALL(_idt, 178, _asm_isr178)
+ ISR_INSTALL(_idt, 179, _asm_isr179)
+ ISR_INSTALL(_idt, 180, _asm_isr180)
+ ISR_INSTALL(_idt, 181, _asm_isr181)
+ ISR_INSTALL(_idt, 182, _asm_isr182)
+ ISR_INSTALL(_idt, 183, _asm_isr183)
+ ISR_INSTALL(_idt, 184, _asm_isr184)
+ ISR_INSTALL(_idt, 185, _asm_isr185)
+ ISR_INSTALL(_idt, 186, _asm_isr186)
+ ISR_INSTALL(_idt, 187, _asm_isr187)
+ ISR_INSTALL(_idt, 188, _asm_isr188)
+ ISR_INSTALL(_idt, 189, _asm_isr189)
+ ISR_INSTALL(_idt, 190, _asm_isr190)
+ ISR_INSTALL(_idt, 191, _asm_isr191)
+ ISR_INSTALL(_idt, 192, _asm_isr192)
+ ISR_INSTALL(_idt, 193, _asm_isr193)
+ ISR_INSTALL(_idt, 194, _asm_isr194)
+ ISR_INSTALL(_idt, 195, _asm_isr195)
+ ISR_INSTALL(_idt, 196, _asm_isr196)
+ ISR_INSTALL(_idt, 197, _asm_isr197)
+ ISR_INSTALL(_idt, 198, _asm_isr198)
+ ISR_INSTALL(_idt, 199, _asm_isr199)
+ ISR_INSTALL(_idt, 200, _asm_isr200)
+ ISR_INSTALL(_idt, 201, _asm_isr201)
+ ISR_INSTALL(_idt, 202, _asm_isr202)
+ ISR_INSTALL(_idt, 203, _asm_isr203)
+ ISR_INSTALL(_idt, 204, _asm_isr204)
+ ISR_INSTALL(_idt, 205, _asm_isr205)
+ ISR_INSTALL(_idt, 206, _asm_isr206)
+ ISR_INSTALL(_idt, 207, _asm_isr207)
+ ISR_INSTALL(_idt, 208, _asm_isr208)
+ ISR_INSTALL(_idt, 209, _asm_isr209)
+ ISR_INSTALL(_idt, 210, _asm_isr210)
+ ISR_INSTALL(_idt, 211, _asm_isr211)
+ ISR_INSTALL(_idt, 212, _asm_isr212)
+ ISR_INSTALL(_idt, 213, _asm_isr213)
+ ISR_INSTALL(_idt, 214, _asm_isr214)
+ ISR_INSTALL(_idt, 215, _asm_isr215)
+ ISR_INSTALL(_idt, 216, _asm_isr216)
+ ISR_INSTALL(_idt, 217, _asm_isr217)
+ ISR_INSTALL(_idt, 218, _asm_isr218)
+ ISR_INSTALL(_idt, 219, _asm_isr219)
+ ISR_INSTALL(_idt, 220, _asm_isr220)
+ ISR_INSTALL(_idt, 221, _asm_isr221)
+ ISR_INSTALL(_idt, 222, _asm_isr222)
+ ISR_INSTALL(_idt, 223, _asm_isr223)
+ ISR_INSTALL(_idt, 224, _asm_isr224)
+ ISR_INSTALL(_idt, 225, _asm_isr225)
+ ISR_INSTALL(_idt, 226, _asm_isr226)
+ ISR_INSTALL(_idt, 227, _asm_isr227)
+ ISR_INSTALL(_idt, 228, _asm_isr228)
+ ISR_INSTALL(_idt, 229, _asm_isr229)
+ ISR_INSTALL(_idt, 230, _asm_isr230)
+ ISR_INSTALL(_idt, 231, _asm_isr231)
+ ISR_INSTALL(_idt, 232, _asm_isr232)
+ ISR_INSTALL(_idt, 233, _asm_isr233)
+ ISR_INSTALL(_idt, 234, _asm_isr234)
+ ISR_INSTALL(_idt, 235, _asm_isr235)
+ ISR_INSTALL(_idt, 236, _asm_isr236)
+ ISR_INSTALL(_idt, 237, _asm_isr237)
+ ISR_INSTALL(_idt, 238, _asm_isr238)
+ ISR_INSTALL(_idt, 239, _asm_isr239)
+ ISR_INSTALL(_idt, 240, _asm_isr240)
+ ISR_INSTALL(_idt, 241, _asm_isr241)
+ ISR_INSTALL(_idt, 242, _asm_isr242)
+ ISR_INSTALL(_idt, 243, _asm_isr243)
+ ISR_INSTALL(_idt, 244, _asm_isr244)
+ ISR_INSTALL(_idt, 245, _asm_isr245)
+ ISR_INSTALL(_idt, 246, _asm_isr246)
+ ISR_INSTALL(_idt, 247, _asm_isr247)
+ ISR_INSTALL(_idt, 248, _asm_isr248)
+ ISR_INSTALL(_idt, 249, _asm_isr249)
+ ISR_INSTALL(_idt, 250, _asm_isr250)
+ ISR_INSTALL(_idt, 251, _asm_isr251)
+ ISR_INSTALL(_idt, 252, _asm_isr252)
+ ISR_INSTALL(_idt, 253, _asm_isr253)
+ ISR_INSTALL(_idt, 254, _asm_isr254)
+ ISR_INSTALL(_idt, 255, _asm_isr255)
+}
\ No newline at end of file
#include <hal/apic.h>
#include <hal/cpu.h>
+#include <arch/exception.h>
+
#include <lunaix/isrm.h>
#include <lunaix/mm/page.h>
#include <lunaix/mm/vmm.h>
#include <lunaix/syslog.h>
#include <lunaix/tty/tty.h>
+#include "i386_intr.h"
+
LOG_MODULE("INTR")
extern x86_page_table* __kernel_ptd;
+void
+exception_init()
+{
+ exception_install_handler();
+ isrm_init();
+ intr_routine_init();
+}
+
void
intr_handler(isr_param* param)
{
#include <hal/apic.h>
+#include "i386_intr.h"
+
LOG_MODULE("INTR")
extern void
-
#define __ASM__
.macro isr_template vector, no_error_code=1
.global _asm_isr\vector
+++ /dev/null
-#include <klibc/stdio.h>
-#include <lunaix/peripheral/serial.h>
-#include <lunaix/syslog.h>
-#include <sdbg/lsdbg.h>
-
-#define COM SERIAL_COM1
-
-LOG_MODULE("DBG");
-
-static volatile int sdbg_state = 0;
-
-void
-sdbg_printf(char* fmt, ...)
-{
- char buf[256];
- va_list l;
-
- va_start(l, fmt);
-
- size_t len = __ksprintf_internal(buf, fmt, 256, l);
- serial_tx_buffer(COM, buf, len);
-
- va_end(l);
-}
-
-void
-lunaix_sdbg_loop(isr_param* param)
-{
- u8_t c;
-
- if (sdbg_state == SDBG_STATE_WAIT_BRK) {
- (param)->execp->eflags &= ~(1 << 8);
- sdbg_state = SDBG_STATE_INSESSION;
- sdbg_printf("[%p:%p] Break point reached.\n",
- param->execp->cs,
- param->execp->eip);
- }
-
- while (1) {
- c = (u8_t)serial_rx_byte(SERIAL_COM1);
- if (c == SDBG_CLNT_QUIT) {
- sdbg_state = SDBG_STATE_START;
- break;
- }
-
- switch (c) {
- case SDBG_CLNT_HI:
- if (sdbg_state == SDBG_STATE_START) {
- sdbg_printf("[%p:%p] Session started.\n",
- param->execp->cs,
- param->execp->eip);
- sdbg_state = SDBG_STATE_INSESSION;
- } else {
- sdbg_printf("[%p:%p] Session resumed.\n",
- param->execp->cs,
- param->execp->eip);
- }
- break;
- case SDBG_CLNT_RREG:
-
- serial_tx_buffer(SERIAL_COM1, (char*)param, sizeof(isr_param));
- break;
- case SDBG_CLNT_STEP:
- ((isr_param*)param)->execp->eflags |= (1 << 8); // set TF flags
- sdbg_state = SDBG_STATE_WAIT_BRK;
- return;
- case SDBG_CLNT_BRKP:
- // the break point address
- // serial_rx_buffer(SERIAL_COM1, buffer, sizeof(ptr_t));
-
- // asm("movl %0, %%dr0" ::"r"(*((ptr_t*)buffer)));
-
- sdbg_state = SDBG_STATE_WAIT_BRK;
- return;
- case SDBG_CLNT_CONT:
- return;
- default:
- break;
- }
- }
-}
\ No newline at end of file
--- /dev/null
+#ifndef __LUNAIX_EXCEPTION_H
+#define __LUNAIX_EXCEPTION_H
+
+void
+exception_init();
+
+#endif /* __LUNAIX_EXCEPTION_H */
void
intr_handler(isr_param* param);
-void
-intr_routine_init();
-
#endif
#endif /* __LUNAIX_INTERRUPTS_H */
+++ /dev/null
-
-#ifndef __LUNAIX_INTRHNDS_H
-#define __LUNAIX_INTRHNDS_H
-#define ISR(iv) void _asm_isr##iv();
-ISR(0)
-ISR(1)
-ISR(2)
-ISR(3)
-ISR(4)
-ISR(5)
-ISR(6)
-ISR(7)
-ISR(8)
-ISR(9)
-ISR(10)
-ISR(11)
-ISR(12)
-ISR(13)
-ISR(14)
-ISR(15)
-ISR(16)
-ISR(17)
-ISR(18)
-ISR(19)
-ISR(20)
-ISR(21)
-ISR(22)
-ISR(23)
-ISR(24)
-ISR(25)
-ISR(26)
-ISR(27)
-ISR(28)
-ISR(29)
-ISR(30)
-ISR(31)
-ISR(32)
-ISR(33)
-ISR(34)
-ISR(35)
-ISR(36)
-ISR(37)
-ISR(38)
-ISR(39)
-ISR(40)
-ISR(41)
-ISR(42)
-ISR(43)
-ISR(44)
-ISR(45)
-ISR(46)
-ISR(47)
-ISR(48)
-ISR(49)
-ISR(50)
-ISR(51)
-ISR(52)
-ISR(53)
-ISR(54)
-ISR(55)
-ISR(56)
-ISR(57)
-ISR(58)
-ISR(59)
-ISR(60)
-ISR(61)
-ISR(62)
-ISR(63)
-ISR(64)
-ISR(65)
-ISR(66)
-ISR(67)
-ISR(68)
-ISR(69)
-ISR(70)
-ISR(71)
-ISR(72)
-ISR(73)
-ISR(74)
-ISR(75)
-ISR(76)
-ISR(77)
-ISR(78)
-ISR(79)
-ISR(80)
-ISR(81)
-ISR(82)
-ISR(83)
-ISR(84)
-ISR(85)
-ISR(86)
-ISR(87)
-ISR(88)
-ISR(89)
-ISR(90)
-ISR(91)
-ISR(92)
-ISR(93)
-ISR(94)
-ISR(95)
-ISR(96)
-ISR(97)
-ISR(98)
-ISR(99)
-ISR(100)
-ISR(101)
-ISR(102)
-ISR(103)
-ISR(104)
-ISR(105)
-ISR(106)
-ISR(107)
-ISR(108)
-ISR(109)
-ISR(110)
-ISR(111)
-ISR(112)
-ISR(113)
-ISR(114)
-ISR(115)
-ISR(116)
-ISR(117)
-ISR(118)
-ISR(119)
-ISR(120)
-ISR(121)
-ISR(122)
-ISR(123)
-ISR(124)
-ISR(125)
-ISR(126)
-ISR(127)
-ISR(128)
-ISR(129)
-ISR(130)
-ISR(131)
-ISR(132)
-ISR(133)
-ISR(134)
-ISR(135)
-ISR(136)
-ISR(137)
-ISR(138)
-ISR(139)
-ISR(140)
-ISR(141)
-ISR(142)
-ISR(143)
-ISR(144)
-ISR(145)
-ISR(146)
-ISR(147)
-ISR(148)
-ISR(149)
-ISR(150)
-ISR(151)
-ISR(152)
-ISR(153)
-ISR(154)
-ISR(155)
-ISR(156)
-ISR(157)
-ISR(158)
-ISR(159)
-ISR(160)
-ISR(161)
-ISR(162)
-ISR(163)
-ISR(164)
-ISR(165)
-ISR(166)
-ISR(167)
-ISR(168)
-ISR(169)
-ISR(170)
-ISR(171)
-ISR(172)
-ISR(173)
-ISR(174)
-ISR(175)
-ISR(176)
-ISR(177)
-ISR(178)
-ISR(179)
-ISR(180)
-ISR(181)
-ISR(182)
-ISR(183)
-ISR(184)
-ISR(185)
-ISR(186)
-ISR(187)
-ISR(188)
-ISR(189)
-ISR(190)
-ISR(191)
-ISR(192)
-ISR(193)
-ISR(194)
-ISR(195)
-ISR(196)
-ISR(197)
-ISR(198)
-ISR(199)
-ISR(200)
-ISR(201)
-ISR(202)
-ISR(203)
-ISR(204)
-ISR(205)
-ISR(206)
-ISR(207)
-ISR(208)
-ISR(209)
-ISR(210)
-ISR(211)
-ISR(212)
-ISR(213)
-ISR(214)
-ISR(215)
-ISR(216)
-ISR(217)
-ISR(218)
-ISR(219)
-ISR(220)
-ISR(221)
-ISR(222)
-ISR(223)
-ISR(224)
-ISR(225)
-ISR(226)
-ISR(227)
-ISR(228)
-ISR(229)
-ISR(230)
-ISR(231)
-ISR(232)
-ISR(233)
-ISR(234)
-ISR(235)
-ISR(236)
-ISR(237)
-ISR(238)
-ISR(239)
-ISR(240)
-ISR(241)
-ISR(242)
-ISR(243)
-ISR(244)
-ISR(245)
-ISR(246)
-ISR(247)
-ISR(248)
-ISR(249)
-ISR(250)
-ISR(251)
-ISR(252)
-ISR(253)
-ISR(254)
-ISR(255)
-#endif
+++ /dev/null
-
-#include <arch/i386/idt.h>
-#include <arch/i386/intrhnds.h>
-#include <lunaix/types.h>
-
-#define IDT_ENTRY 256
-
-u64_t _idt[IDT_ENTRY];
-u16_t _idt_limit = sizeof(_idt) - 1;
-static inline void
-_set_idt_entry(u32_t vector,
- u16_t seg_selector,
- void (*isr)(),
- u8_t dpl,
- u8_t type)
-{
- ptr_t offset = (ptr_t)isr;
- _idt[vector] = (offset & 0xffff0000) | IDT_ATTR(dpl, type);
- _idt[vector] <<= 32;
- _idt[vector] |= (seg_selector << 16) | (offset & 0x0000ffff);
-}
-
-void
-_init_idt()
-{
- _set_idt_entry(0, 8, _asm_isr0, 0, IDT_INTERRUPT);
- _set_idt_entry(1, 8, _asm_isr1, 0, IDT_INTERRUPT);
- _set_idt_entry(2, 8, _asm_isr2, 0, IDT_INTERRUPT);
- _set_idt_entry(3, 8, _asm_isr3, 0, IDT_INTERRUPT);
- _set_idt_entry(4, 8, _asm_isr4, 0, IDT_INTERRUPT);
- _set_idt_entry(5, 8, _asm_isr5, 0, IDT_INTERRUPT);
- _set_idt_entry(6, 8, _asm_isr6, 0, IDT_INTERRUPT);
- _set_idt_entry(7, 8, _asm_isr7, 0, IDT_INTERRUPT);
- _set_idt_entry(8, 8, _asm_isr8, 0, IDT_INTERRUPT);
- _set_idt_entry(9, 8, _asm_isr9, 0, IDT_INTERRUPT);
- _set_idt_entry(10, 8, _asm_isr10, 0, IDT_INTERRUPT);
- _set_idt_entry(11, 8, _asm_isr11, 0, IDT_INTERRUPT);
- _set_idt_entry(12, 8, _asm_isr12, 0, IDT_INTERRUPT);
- _set_idt_entry(13, 8, _asm_isr13, 0, IDT_INTERRUPT);
- _set_idt_entry(14, 8, _asm_isr14, 0, IDT_INTERRUPT);
- _set_idt_entry(15, 8, _asm_isr15, 0, IDT_INTERRUPT);
- _set_idt_entry(16, 8, _asm_isr16, 0, IDT_INTERRUPT);
- _set_idt_entry(17, 8, _asm_isr17, 0, IDT_INTERRUPT);
- _set_idt_entry(18, 8, _asm_isr18, 0, IDT_INTERRUPT);
- _set_idt_entry(19, 8, _asm_isr19, 0, IDT_INTERRUPT);
- _set_idt_entry(20, 8, _asm_isr20, 0, IDT_INTERRUPT);
- _set_idt_entry(21, 8, _asm_isr21, 0, IDT_INTERRUPT);
- _set_idt_entry(22, 8, _asm_isr22, 0, IDT_INTERRUPT);
- _set_idt_entry(23, 8, _asm_isr23, 0, IDT_INTERRUPT);
- _set_idt_entry(24, 8, _asm_isr24, 0, IDT_INTERRUPT);
- _set_idt_entry(25, 8, _asm_isr25, 0, IDT_INTERRUPT);
- _set_idt_entry(26, 8, _asm_isr26, 0, IDT_INTERRUPT);
- _set_idt_entry(27, 8, _asm_isr27, 0, IDT_INTERRUPT);
- _set_idt_entry(28, 8, _asm_isr28, 0, IDT_INTERRUPT);
- _set_idt_entry(29, 8, _asm_isr29, 0, IDT_INTERRUPT);
- _set_idt_entry(30, 8, _asm_isr30, 0, IDT_INTERRUPT);
- _set_idt_entry(31, 8, _asm_isr31, 0, IDT_INTERRUPT);
- _set_idt_entry(32, 8, _asm_isr32, 0, IDT_INTERRUPT);
- _set_idt_entry(33, 8, _asm_isr33, 3, IDT_INTERRUPT);
- _set_idt_entry(34, 8, _asm_isr34, 0, IDT_INTERRUPT);
- _set_idt_entry(35, 8, _asm_isr35, 0, IDT_INTERRUPT);
- _set_idt_entry(36, 8, _asm_isr36, 0, IDT_INTERRUPT);
- _set_idt_entry(37, 8, _asm_isr37, 0, IDT_INTERRUPT);
- _set_idt_entry(38, 8, _asm_isr38, 0, IDT_INTERRUPT);
- _set_idt_entry(39, 8, _asm_isr39, 0, IDT_INTERRUPT);
- _set_idt_entry(40, 8, _asm_isr40, 0, IDT_INTERRUPT);
- _set_idt_entry(41, 8, _asm_isr41, 0, IDT_INTERRUPT);
- _set_idt_entry(42, 8, _asm_isr42, 0, IDT_INTERRUPT);
- _set_idt_entry(43, 8, _asm_isr43, 0, IDT_INTERRUPT);
- _set_idt_entry(44, 8, _asm_isr44, 0, IDT_INTERRUPT);
- _set_idt_entry(45, 8, _asm_isr45, 0, IDT_INTERRUPT);
- _set_idt_entry(46, 8, _asm_isr46, 0, IDT_INTERRUPT);
- _set_idt_entry(47, 8, _asm_isr47, 0, IDT_INTERRUPT);
- _set_idt_entry(48, 8, _asm_isr48, 0, IDT_INTERRUPT);
- _set_idt_entry(49, 8, _asm_isr49, 0, IDT_INTERRUPT);
- _set_idt_entry(50, 8, _asm_isr50, 0, IDT_INTERRUPT);
- _set_idt_entry(51, 8, _asm_isr51, 0, IDT_INTERRUPT);
- _set_idt_entry(52, 8, _asm_isr52, 0, IDT_INTERRUPT);
- _set_idt_entry(53, 8, _asm_isr53, 0, IDT_INTERRUPT);
- _set_idt_entry(54, 8, _asm_isr54, 0, IDT_INTERRUPT);
- _set_idt_entry(55, 8, _asm_isr55, 0, IDT_INTERRUPT);
- _set_idt_entry(56, 8, _asm_isr56, 0, IDT_INTERRUPT);
- _set_idt_entry(57, 8, _asm_isr57, 0, IDT_INTERRUPT);
- _set_idt_entry(58, 8, _asm_isr58, 0, IDT_INTERRUPT);
- _set_idt_entry(59, 8, _asm_isr59, 0, IDT_INTERRUPT);
- _set_idt_entry(60, 8, _asm_isr60, 0, IDT_INTERRUPT);
- _set_idt_entry(61, 8, _asm_isr61, 0, IDT_INTERRUPT);
- _set_idt_entry(62, 8, _asm_isr62, 0, IDT_INTERRUPT);
- _set_idt_entry(63, 8, _asm_isr63, 0, IDT_INTERRUPT);
- _set_idt_entry(64, 8, _asm_isr64, 0, IDT_INTERRUPT);
- _set_idt_entry(65, 8, _asm_isr65, 0, IDT_INTERRUPT);
- _set_idt_entry(66, 8, _asm_isr66, 0, IDT_INTERRUPT);
- _set_idt_entry(67, 8, _asm_isr67, 0, IDT_INTERRUPT);
- _set_idt_entry(68, 8, _asm_isr68, 0, IDT_INTERRUPT);
- _set_idt_entry(69, 8, _asm_isr69, 0, IDT_INTERRUPT);
- _set_idt_entry(70, 8, _asm_isr70, 0, IDT_INTERRUPT);
- _set_idt_entry(71, 8, _asm_isr71, 0, IDT_INTERRUPT);
- _set_idt_entry(72, 8, _asm_isr72, 0, IDT_INTERRUPT);
- _set_idt_entry(73, 8, _asm_isr73, 0, IDT_INTERRUPT);
- _set_idt_entry(74, 8, _asm_isr74, 0, IDT_INTERRUPT);
- _set_idt_entry(75, 8, _asm_isr75, 0, IDT_INTERRUPT);
- _set_idt_entry(76, 8, _asm_isr76, 0, IDT_INTERRUPT);
- _set_idt_entry(77, 8, _asm_isr77, 0, IDT_INTERRUPT);
- _set_idt_entry(78, 8, _asm_isr78, 0, IDT_INTERRUPT);
- _set_idt_entry(79, 8, _asm_isr79, 0, IDT_INTERRUPT);
- _set_idt_entry(80, 8, _asm_isr80, 0, IDT_INTERRUPT);
- _set_idt_entry(81, 8, _asm_isr81, 0, IDT_INTERRUPT);
- _set_idt_entry(82, 8, _asm_isr82, 0, IDT_INTERRUPT);
- _set_idt_entry(83, 8, _asm_isr83, 0, IDT_INTERRUPT);
- _set_idt_entry(84, 8, _asm_isr84, 0, IDT_INTERRUPT);
- _set_idt_entry(85, 8, _asm_isr85, 0, IDT_INTERRUPT);
- _set_idt_entry(86, 8, _asm_isr86, 0, IDT_INTERRUPT);
- _set_idt_entry(87, 8, _asm_isr87, 0, IDT_INTERRUPT);
- _set_idt_entry(88, 8, _asm_isr88, 0, IDT_INTERRUPT);
- _set_idt_entry(89, 8, _asm_isr89, 0, IDT_INTERRUPT);
- _set_idt_entry(90, 8, _asm_isr90, 0, IDT_INTERRUPT);
- _set_idt_entry(91, 8, _asm_isr91, 0, IDT_INTERRUPT);
- _set_idt_entry(92, 8, _asm_isr92, 0, IDT_INTERRUPT);
- _set_idt_entry(93, 8, _asm_isr93, 0, IDT_INTERRUPT);
- _set_idt_entry(94, 8, _asm_isr94, 0, IDT_INTERRUPT);
- _set_idt_entry(95, 8, _asm_isr95, 0, IDT_INTERRUPT);
- _set_idt_entry(96, 8, _asm_isr96, 0, IDT_INTERRUPT);
- _set_idt_entry(97, 8, _asm_isr97, 0, IDT_INTERRUPT);
- _set_idt_entry(98, 8, _asm_isr98, 0, IDT_INTERRUPT);
- _set_idt_entry(99, 8, _asm_isr99, 0, IDT_INTERRUPT);
- _set_idt_entry(100, 8, _asm_isr100, 0, IDT_INTERRUPT);
- _set_idt_entry(101, 8, _asm_isr101, 0, IDT_INTERRUPT);
- _set_idt_entry(102, 8, _asm_isr102, 0, IDT_INTERRUPT);
- _set_idt_entry(103, 8, _asm_isr103, 0, IDT_INTERRUPT);
- _set_idt_entry(104, 8, _asm_isr104, 0, IDT_INTERRUPT);
- _set_idt_entry(105, 8, _asm_isr105, 0, IDT_INTERRUPT);
- _set_idt_entry(106, 8, _asm_isr106, 0, IDT_INTERRUPT);
- _set_idt_entry(107, 8, _asm_isr107, 0, IDT_INTERRUPT);
- _set_idt_entry(108, 8, _asm_isr108, 0, IDT_INTERRUPT);
- _set_idt_entry(109, 8, _asm_isr109, 0, IDT_INTERRUPT);
- _set_idt_entry(110, 8, _asm_isr110, 0, IDT_INTERRUPT);
- _set_idt_entry(111, 8, _asm_isr111, 0, IDT_INTERRUPT);
- _set_idt_entry(112, 8, _asm_isr112, 0, IDT_INTERRUPT);
- _set_idt_entry(113, 8, _asm_isr113, 0, IDT_INTERRUPT);
- _set_idt_entry(114, 8, _asm_isr114, 0, IDT_INTERRUPT);
- _set_idt_entry(115, 8, _asm_isr115, 0, IDT_INTERRUPT);
- _set_idt_entry(116, 8, _asm_isr116, 0, IDT_INTERRUPT);
- _set_idt_entry(117, 8, _asm_isr117, 0, IDT_INTERRUPT);
- _set_idt_entry(118, 8, _asm_isr118, 0, IDT_INTERRUPT);
- _set_idt_entry(119, 8, _asm_isr119, 0, IDT_INTERRUPT);
- _set_idt_entry(120, 8, _asm_isr120, 0, IDT_INTERRUPT);
- _set_idt_entry(121, 8, _asm_isr121, 0, IDT_INTERRUPT);
- _set_idt_entry(122, 8, _asm_isr122, 0, IDT_INTERRUPT);
- _set_idt_entry(123, 8, _asm_isr123, 0, IDT_INTERRUPT);
- _set_idt_entry(124, 8, _asm_isr124, 0, IDT_INTERRUPT);
- _set_idt_entry(125, 8, _asm_isr125, 0, IDT_INTERRUPT);
- _set_idt_entry(126, 8, _asm_isr126, 0, IDT_INTERRUPT);
- _set_idt_entry(127, 8, _asm_isr127, 0, IDT_INTERRUPT);
- _set_idt_entry(128, 8, _asm_isr128, 0, IDT_INTERRUPT);
- _set_idt_entry(129, 8, _asm_isr129, 0, IDT_INTERRUPT);
- _set_idt_entry(130, 8, _asm_isr130, 0, IDT_INTERRUPT);
- _set_idt_entry(131, 8, _asm_isr131, 0, IDT_INTERRUPT);
- _set_idt_entry(132, 8, _asm_isr132, 0, IDT_INTERRUPT);
- _set_idt_entry(133, 8, _asm_isr133, 0, IDT_INTERRUPT);
- _set_idt_entry(134, 8, _asm_isr134, 0, IDT_INTERRUPT);
- _set_idt_entry(135, 8, _asm_isr135, 0, IDT_INTERRUPT);
- _set_idt_entry(136, 8, _asm_isr136, 0, IDT_INTERRUPT);
- _set_idt_entry(137, 8, _asm_isr137, 0, IDT_INTERRUPT);
- _set_idt_entry(138, 8, _asm_isr138, 0, IDT_INTERRUPT);
- _set_idt_entry(139, 8, _asm_isr139, 0, IDT_INTERRUPT);
- _set_idt_entry(140, 8, _asm_isr140, 0, IDT_INTERRUPT);
- _set_idt_entry(141, 8, _asm_isr141, 0, IDT_INTERRUPT);
- _set_idt_entry(142, 8, _asm_isr142, 0, IDT_INTERRUPT);
- _set_idt_entry(143, 8, _asm_isr143, 0, IDT_INTERRUPT);
- _set_idt_entry(144, 8, _asm_isr144, 0, IDT_INTERRUPT);
- _set_idt_entry(145, 8, _asm_isr145, 0, IDT_INTERRUPT);
- _set_idt_entry(146, 8, _asm_isr146, 0, IDT_INTERRUPT);
- _set_idt_entry(147, 8, _asm_isr147, 0, IDT_INTERRUPT);
- _set_idt_entry(148, 8, _asm_isr148, 0, IDT_INTERRUPT);
- _set_idt_entry(149, 8, _asm_isr149, 0, IDT_INTERRUPT);
- _set_idt_entry(150, 8, _asm_isr150, 0, IDT_INTERRUPT);
- _set_idt_entry(151, 8, _asm_isr151, 0, IDT_INTERRUPT);
- _set_idt_entry(152, 8, _asm_isr152, 0, IDT_INTERRUPT);
- _set_idt_entry(153, 8, _asm_isr153, 0, IDT_INTERRUPT);
- _set_idt_entry(154, 8, _asm_isr154, 0, IDT_INTERRUPT);
- _set_idt_entry(155, 8, _asm_isr155, 0, IDT_INTERRUPT);
- _set_idt_entry(156, 8, _asm_isr156, 0, IDT_INTERRUPT);
- _set_idt_entry(157, 8, _asm_isr157, 0, IDT_INTERRUPT);
- _set_idt_entry(158, 8, _asm_isr158, 0, IDT_INTERRUPT);
- _set_idt_entry(159, 8, _asm_isr159, 0, IDT_INTERRUPT);
- _set_idt_entry(160, 8, _asm_isr160, 0, IDT_INTERRUPT);
- _set_idt_entry(161, 8, _asm_isr161, 0, IDT_INTERRUPT);
- _set_idt_entry(162, 8, _asm_isr162, 0, IDT_INTERRUPT);
- _set_idt_entry(163, 8, _asm_isr163, 0, IDT_INTERRUPT);
- _set_idt_entry(164, 8, _asm_isr164, 0, IDT_INTERRUPT);
- _set_idt_entry(165, 8, _asm_isr165, 0, IDT_INTERRUPT);
- _set_idt_entry(166, 8, _asm_isr166, 0, IDT_INTERRUPT);
- _set_idt_entry(167, 8, _asm_isr167, 0, IDT_INTERRUPT);
- _set_idt_entry(168, 8, _asm_isr168, 0, IDT_INTERRUPT);
- _set_idt_entry(169, 8, _asm_isr169, 0, IDT_INTERRUPT);
- _set_idt_entry(170, 8, _asm_isr170, 0, IDT_INTERRUPT);
- _set_idt_entry(171, 8, _asm_isr171, 0, IDT_INTERRUPT);
- _set_idt_entry(172, 8, _asm_isr172, 0, IDT_INTERRUPT);
- _set_idt_entry(173, 8, _asm_isr173, 0, IDT_INTERRUPT);
- _set_idt_entry(174, 8, _asm_isr174, 0, IDT_INTERRUPT);
- _set_idt_entry(175, 8, _asm_isr175, 0, IDT_INTERRUPT);
- _set_idt_entry(176, 8, _asm_isr176, 0, IDT_INTERRUPT);
- _set_idt_entry(177, 8, _asm_isr177, 0, IDT_INTERRUPT);
- _set_idt_entry(178, 8, _asm_isr178, 0, IDT_INTERRUPT);
- _set_idt_entry(179, 8, _asm_isr179, 0, IDT_INTERRUPT);
- _set_idt_entry(180, 8, _asm_isr180, 0, IDT_INTERRUPT);
- _set_idt_entry(181, 8, _asm_isr181, 0, IDT_INTERRUPT);
- _set_idt_entry(182, 8, _asm_isr182, 0, IDT_INTERRUPT);
- _set_idt_entry(183, 8, _asm_isr183, 0, IDT_INTERRUPT);
- _set_idt_entry(184, 8, _asm_isr184, 0, IDT_INTERRUPT);
- _set_idt_entry(185, 8, _asm_isr185, 0, IDT_INTERRUPT);
- _set_idt_entry(186, 8, _asm_isr186, 0, IDT_INTERRUPT);
- _set_idt_entry(187, 8, _asm_isr187, 0, IDT_INTERRUPT);
- _set_idt_entry(188, 8, _asm_isr188, 0, IDT_INTERRUPT);
- _set_idt_entry(189, 8, _asm_isr189, 0, IDT_INTERRUPT);
- _set_idt_entry(190, 8, _asm_isr190, 0, IDT_INTERRUPT);
- _set_idt_entry(191, 8, _asm_isr191, 0, IDT_INTERRUPT);
- _set_idt_entry(192, 8, _asm_isr192, 0, IDT_INTERRUPT);
- _set_idt_entry(193, 8, _asm_isr193, 0, IDT_INTERRUPT);
- _set_idt_entry(194, 8, _asm_isr194, 0, IDT_INTERRUPT);
- _set_idt_entry(195, 8, _asm_isr195, 0, IDT_INTERRUPT);
- _set_idt_entry(196, 8, _asm_isr196, 0, IDT_INTERRUPT);
- _set_idt_entry(197, 8, _asm_isr197, 0, IDT_INTERRUPT);
- _set_idt_entry(198, 8, _asm_isr198, 0, IDT_INTERRUPT);
- _set_idt_entry(199, 8, _asm_isr199, 0, IDT_INTERRUPT);
- _set_idt_entry(200, 8, _asm_isr200, 0, IDT_INTERRUPT);
- _set_idt_entry(201, 8, _asm_isr201, 0, IDT_INTERRUPT);
- _set_idt_entry(202, 8, _asm_isr202, 0, IDT_INTERRUPT);
- _set_idt_entry(203, 8, _asm_isr203, 0, IDT_INTERRUPT);
- _set_idt_entry(204, 8, _asm_isr204, 0, IDT_INTERRUPT);
- _set_idt_entry(205, 8, _asm_isr205, 0, IDT_INTERRUPT);
- _set_idt_entry(206, 8, _asm_isr206, 0, IDT_INTERRUPT);
- _set_idt_entry(207, 8, _asm_isr207, 0, IDT_INTERRUPT);
- _set_idt_entry(208, 8, _asm_isr208, 0, IDT_INTERRUPT);
- _set_idt_entry(209, 8, _asm_isr209, 0, IDT_INTERRUPT);
- _set_idt_entry(210, 8, _asm_isr210, 0, IDT_INTERRUPT);
- _set_idt_entry(211, 8, _asm_isr211, 0, IDT_INTERRUPT);
- _set_idt_entry(212, 8, _asm_isr212, 0, IDT_INTERRUPT);
- _set_idt_entry(213, 8, _asm_isr213, 0, IDT_INTERRUPT);
- _set_idt_entry(214, 8, _asm_isr214, 0, IDT_INTERRUPT);
- _set_idt_entry(215, 8, _asm_isr215, 0, IDT_INTERRUPT);
- _set_idt_entry(216, 8, _asm_isr216, 0, IDT_INTERRUPT);
- _set_idt_entry(217, 8, _asm_isr217, 0, IDT_INTERRUPT);
- _set_idt_entry(218, 8, _asm_isr218, 0, IDT_INTERRUPT);
- _set_idt_entry(219, 8, _asm_isr219, 0, IDT_INTERRUPT);
- _set_idt_entry(220, 8, _asm_isr220, 0, IDT_INTERRUPT);
- _set_idt_entry(221, 8, _asm_isr221, 0, IDT_INTERRUPT);
- _set_idt_entry(222, 8, _asm_isr222, 0, IDT_INTERRUPT);
- _set_idt_entry(223, 8, _asm_isr223, 0, IDT_INTERRUPT);
- _set_idt_entry(224, 8, _asm_isr224, 0, IDT_INTERRUPT);
- _set_idt_entry(225, 8, _asm_isr225, 0, IDT_INTERRUPT);
- _set_idt_entry(226, 8, _asm_isr226, 0, IDT_INTERRUPT);
- _set_idt_entry(227, 8, _asm_isr227, 0, IDT_INTERRUPT);
- _set_idt_entry(228, 8, _asm_isr228, 0, IDT_INTERRUPT);
- _set_idt_entry(229, 8, _asm_isr229, 0, IDT_INTERRUPT);
- _set_idt_entry(230, 8, _asm_isr230, 0, IDT_INTERRUPT);
- _set_idt_entry(231, 8, _asm_isr231, 0, IDT_INTERRUPT);
- _set_idt_entry(232, 8, _asm_isr232, 0, IDT_INTERRUPT);
- _set_idt_entry(233, 8, _asm_isr233, 0, IDT_INTERRUPT);
- _set_idt_entry(234, 8, _asm_isr234, 0, IDT_INTERRUPT);
- _set_idt_entry(235, 8, _asm_isr235, 0, IDT_INTERRUPT);
- _set_idt_entry(236, 8, _asm_isr236, 0, IDT_INTERRUPT);
- _set_idt_entry(237, 8, _asm_isr237, 0, IDT_INTERRUPT);
- _set_idt_entry(238, 8, _asm_isr238, 0, IDT_INTERRUPT);
- _set_idt_entry(239, 8, _asm_isr239, 0, IDT_INTERRUPT);
- _set_idt_entry(240, 8, _asm_isr240, 0, IDT_INTERRUPT);
- _set_idt_entry(241, 8, _asm_isr241, 0, IDT_INTERRUPT);
- _set_idt_entry(242, 8, _asm_isr242, 0, IDT_INTERRUPT);
- _set_idt_entry(243, 8, _asm_isr243, 0, IDT_INTERRUPT);
- _set_idt_entry(244, 8, _asm_isr244, 0, IDT_INTERRUPT);
- _set_idt_entry(245, 8, _asm_isr245, 0, IDT_INTERRUPT);
- _set_idt_entry(246, 8, _asm_isr246, 0, IDT_INTERRUPT);
- _set_idt_entry(247, 8, _asm_isr247, 0, IDT_INTERRUPT);
- _set_idt_entry(248, 8, _asm_isr248, 0, IDT_INTERRUPT);
- _set_idt_entry(249, 8, _asm_isr249, 0, IDT_INTERRUPT);
- _set_idt_entry(250, 8, _asm_isr250, 0, IDT_INTERRUPT);
- _set_idt_entry(251, 8, _asm_isr251, 0, IDT_INTERRUPT);
- _set_idt_entry(252, 8, _asm_isr252, 0, IDT_INTERRUPT);
- _set_idt_entry(253, 8, _asm_isr253, 0, IDT_INTERRUPT);
- _set_idt_entry(254, 8, _asm_isr254, 0, IDT_INTERRUPT);
- _set_idt_entry(255, 8, _asm_isr255, 0, IDT_INTERRUPT);
-}
#include <lunaix/types.h>
#include <arch/abi.h>
+#include <arch/exception.h>
#include <arch/i386/boot/multiboot.h>
#include <arch/i386/interrupts.h>
_kernel_pre_init()
{
// interrupts
- _init_idt();
- isrm_init();
- intr_routine_init();
+ exception_init();
// memory
pmm_init(MEM_1MB + (_k_init_mb_info->mem_upper << 10));
void
panick(const char* msg)
-{
+{
cpu_trap_panic(msg);
DO_SPIN
}
--- /dev/null
+import jinja2
+import re
+import argparse
+import sys
+import json
+from pathlib import Path
+from abc import ABC, abstractmethod
+
+class ControlAction(ABC):
+ def __init__(self, record) -> None:
+ self.__record = record
+ self._parse(record)
+
+ @staticmethod
+ def create(field, value):
+ if field == "$range":
+ return RangeAction(value)
+ else:
+ return value
+
+ @abstractmethod
+ def _parse(self, record):
+ pass
+
+ @abstractmethod
+ def action(self, data, param):
+ pass
+
+ def get(self):
+ return self.__record
+
+class RangeAction(ControlAction):
+ def __init__(self, record) -> None:
+ self.__ranged_component = re.compile(r"^(?P<index>[0-9]+)$|^(?P<start>[0-9]+)..(?P<end>[0-9]+)$")
+ super().__init__(record)
+
+ def _parse(self, record):
+ if not (record.startswith('[') and record.endswith(']')):
+ raise Exception(f"'{record}' is not valid range expression")
+ record = record.strip('[]')
+
+ self.__value=[]
+ for component in record.split(','):
+ component = component.strip()
+ mo = self.__ranged_component.match(component)
+ if mo is None:
+ raise Exception(f"value '{component}' is not valid range component")
+
+ mo = mo.groupdict()
+ if mo["index"] is not None:
+ self.__value.append(int(mo['index']))
+ else:
+ start = int(mo['start'])
+ end = int(mo['end'])
+ self.__value += [x for x in range(start, end + 1)]
+
+ self.__value = sorted(self.__value)
+
+ def action(self, data, param):
+ return super().action(data, param)
+
+ def get(self):
+ return self.__value
+
+
+class DataObject(ABC):
+ def __init__(self, name, record):
+ self.key = name
+ self.user_field = {}
+ self.ctrl_field = {}
+ self._parse(record)
+
+ @staticmethod
+ def create(record):
+ return DataObject.create("", record)
+
+ @staticmethod
+ def create(key, record):
+ if not isinstance(record, dict):
+ return record
+
+ name = key
+ t = name if "$type" not in record else record['$type']
+
+ if "$name" in record:
+ name = record["$name"].strip()
+
+ if not key.startswith('@') and "$type" not in record:
+ return PlainOldObject(name, record)
+
+ t = t.strip("@")
+ if t == "list":
+ return RangedObject(name, record)
+ elif t == "foreach":
+ return ForEachIndexObject(name, record)
+ elif t == "case_range_index":
+ return Condition(record)
+ elif t == "data":
+ return PlainOldObject(name, record)
+ else:
+ return RawObject(name, record)
+
+ @abstractmethod
+ def _parse(self, record):
+ for k, v in record.items():
+ if k.startswith("$"):
+ self.ctrl_field[k.strip("$")] = ControlAction.create(k, v)
+ elif k.startswith("@"):
+ self.ctrl_field[k.strip("@")] = DataObject.create(k, v)
+ else:
+ self.user_field[k] = DataObject.create(k, v)
+
+ @abstractmethod
+ def expand(self, param={}):
+ obj = { **self.user_field }
+ for f in self.ctrl_field.values():
+ if not isinstance(f, DataObject):
+ continue
+ obj.update(**f.expand(param))
+ return obj
+
+class Condition(DataObject):
+ def __init__(self, record):
+ super().__init__("", record)
+
+ def _parse(self, record):
+ super()._parse(record)
+ if "range" not in self.ctrl_field:
+ raise Exception("condition body must contains valid range case")
+ if "true" not in self.ctrl_field:
+ raise Exception("condition body must contains 'True' handling case")
+
+ self.__range_lst = self.ctrl_field["range"].get()
+
+ def expand(self, param={}):
+ if param["index"] in self.__range_lst:
+ return self.ctrl_field["true"].expand(param)
+ elif "else" in self.ctrl_field:
+ return self.ctrl_field["else"].expand(param)
+ return {}
+
+class ForEachIndexObject(DataObject):
+ def __init__(self, name, record):
+ super().__init__(name, record)
+ self.conditions = []
+ for k, v in record.items():
+ self.conditions.append(DataObject.create(k, v))
+
+ def _parse(self, record):
+ super()._parse(record)
+
+ def expand(self, param={}):
+ if "index" not in param:
+ raise Exception(f"'{type(self).__name__}' require parameter 'index'.")
+ obj = {}
+ for cond in self.conditions:
+ obj.update(**cond.expand(param))
+ return obj
+
+class RawObject(DataObject):
+ def __init__(self, name, record):
+ super().__init__(name, record)
+
+ def _parse(self, record):
+ return super()._parse(record)
+
+ def expand(self, param={}):
+ return super().expand(param)
+
+class PlainOldObject(DataObject):
+ def __init__(self, name, record):
+ super().__init__(name, record)
+
+ def _parse(self, record):
+ return super()._parse(record)
+
+ def expand(self, param={}):
+ return {
+ self.key: super().expand(param)
+ }
+
+class RangedObject(DataObject):
+ def __init__(self, name, record):
+ super().__init__(name, record)
+
+ def _parse(self, record):
+ super()._parse(record)
+
+ def expand(self, param={}):
+ if "range" not in self.ctrl_field:
+ raise Exception("RangedObject with ranged type must have 'range' field defined")
+
+ out_lst = []
+ indices = self.ctrl_field["range"].get()
+ for i in indices:
+ param["index"] = i
+ self.user_field["index"] = i
+ out_lst.append(super().expand(param))
+
+ return {
+ self.key: out_lst
+ }
+
+class TemplateExpander:
+ def __init__(self, template_path, project_path, arch) -> None:
+ self.arch = arch
+ self.tbase_path = template_path.joinpath(arch)
+ self.pbase_path = project_path
+
+ self.__load_config()
+ self.__load_mappings()
+
+ def __load_config(self):
+ self.data = {}
+ cfg_file: Path = self.tbase_path.joinpath("config.json")
+ if not cfg_file.is_file():
+ raise Exception(f"config not found. ({cfg_file})")
+
+ obj = json.loads(cfg_file.read_text())
+ for k, v in obj.items():
+ o = DataObject.create(k, v).expand()
+ self.data.update(**o)
+
+ def __load_mappings(self):
+ self.mapping = {}
+ mapping_file: Path = self.tbase_path.joinpath("mappings")
+ if not mapping_file.is_file():
+ raise Exception(f"config not found. ({mapping_file})")
+
+ with mapping_file.open() as f:
+ for l in f:
+ src, dest = l.split("->")
+ src = src.strip()
+
+ if src in self.mapping:
+ raise Exception(f"repeating entry ({src})")
+
+ self.mapping[src] = dest.strip()
+
+ def render(self):
+ for k, v in self.mapping.items():
+ src: Path = self.tbase_path.joinpath(k)
+ dest: Path = self.pbase_path.joinpath(v)
+ if not src.is_file():
+ continue
+
+ template = jinja2.Template(src.read_text(), trim_blocks=True)
+ out = template.render(data=self.data)
+
+ dest.write_text(out)
+
+ print(f"rendered: {k} -> {v}")
+
+
+def main():
+ parser = argparse.ArgumentParser()
+ parser.add_argument("--arch", default='i386')
+ parser.add_argument("-twd", "--template_dir", default=str(Path.cwd()))
+ parser.add_argument("-pwd", "--project_dir", default=str(Path.cwd()))
+
+ args = parser.parse_args()
+
+ expander = TemplateExpander(Path(args.template_dir), Path(args.project_dir), args.arch)
+ expander.render()
+
+if __name__ == "__main__":
+ main()
\ No newline at end of file
--- /dev/null
+{
+ "exception": {
+ "$type": "list",
+ "$range": "[0..255]",
+
+ "@foreach": {
+ "@case_range_index": {
+ "$range": "[8,10..14,17]",
+
+ "@true": {
+ "has_errcode": true
+ },
+ "@else": {
+ "has_errcode": false
+ }
+ }
+ }
+ }
+}
\ No newline at end of file
--- /dev/null
+#define __ASM__
+.macro isr_template vector, no_error_code=1
+ .global _asm_isr\vector
+ .type _asm_isr\vector, @function
+ _asm_isr\vector:
+ .if \no_error_code
+ pushl $0x0
+ .endif
+ pushl $\vector
+ jmp interrupt_wrapper
+.endm
+.section .text
+{% for isrdef in data["exception"] %}
+{% if isrdef["has_errcode"] %}
+ isr_template {{ isrdef["index"] }}, no_error_code=0
+{% else %}
+ isr_template {{ isrdef["index"] }}, no_error_code=1
+{% endif %}
+{% endfor %}
--- /dev/null
+#include "i386_intr.h"
+#include <lunaix/types.h>
+
+#define IDT_INTERRUPT 0x70
+#define KERNEL_CS 0x8
+#define IDT_ATTR(dpl, type) (((type) << 5) | ((dpl & 3) << 13) | (1 << 15))
+#define IDT_ENTRY 256
+
+#define DECLARE_ISR(iv) extern void _asm_isr##iv();
+
+#define ISR_INSTALL(idt, iv, isr) \
+ _idt[iv] = ((ptr_t)isr & 0xffff0000) | IDT_ATTR(0, IDT_INTERRUPT); \
+ _idt[iv] <<= 32; \
+ _idt[iv] |= (KERNEL_CS << 16) | ((ptr_t)isr & 0x0000ffff); \
+
+u64_t _idt[IDT_ENTRY];
+u16_t _idt_limit = sizeof(_idt) - 1;
+
+{% for isrdef in data["exception"] -%}
+ DECLARE_ISR({{ isrdef["index"] }})
+{% endfor %}
+
+void
+exception_install_handler()
+{
+{% for isrdef in data["exception"] %}
+ ISR_INSTALL(_idt, {{ isrdef["index"] }}, _asm_isr{{ isrdef["index"] }})
+{% endfor %}
+}
\ No newline at end of file
--- /dev/null
+i386_isrdef.c.j2 -> arch/i386/exceptions/i386_isrdef.c
+i386_intrhnds.S.j2 -> arch/i386/exceptions/intrhnds.S
\ No newline at end of file
+++ /dev/null
-from pathlib import Path
-
-intr_handler_h = "arch/i386/intrhnds.h"
-intr_handler_c = "kernel/asm/x86/intrhnds.c"
-intr_handler_s = "kernel/asm/x86/intrhnds.S"
-
-
-# default value for each interrupt vector config
-
-config = {
- '8': {
- 'with_errno': True
- },
- '10': {
- 'with_errno': True
- },
- '11': {
- 'with_errno': True
- },
- '12': {
- 'with_errno': True
- },
- '13': {
- 'with_errno': True
- },
- '14': {
- 'with_errno': True
- },
- '17': {
- 'with_errno': True
- },
- '33': {
- 'dpl': 3
- },
- 'default': {
- 'seg': 0x8,
- 'dpl': 0,
- 'vtype': 'IDT_INTERRUPT',
- 'with_errno': False
- }
-}
-
-
-def get_workspace() -> Path:
- file = Path(__file__)
- return file.parent.parent.absolute()
-
-
-def export_h(src: Path):
- hfile = src.joinpath("includes", intr_handler_h)
- code = '\n'.join(["ISR(%s)" % x for x in range(0, 256)])
- with hfile.open(mode='w+') as f:
- f.write(f'''
-#ifndef __LUNAIX_INTRHNDS_H
-#define __LUNAIX_INTRHNDS_H
-#define ISR(iv) void _asm_isr##iv();
-{code}
-#endif
-''')
-
-
-def get_vector_config(vec_num, cfg_name):
- vn = str(vec_num)
- if vn not in config:
- return config['default'][cfg_name]
- attr = config[vn]
- if cfg_name not in attr:
- return config['default'][cfg_name]
- return attr[cfg_name]
-
-
-def export_c(src: Path):
- cfile = src.joinpath(intr_handler_c)
- expr_list = []
- for i in range(0, 256):
- seg = get_vector_config(i, "seg")
- dpl = get_vector_config(i, "dpl")
- vtype = get_vector_config(i, "vtype")
- expr_list.append(
- f' _set_idt_entry({i}, {seg}, _asm_isr{i}, {dpl}, {vtype});')
- code = '\n'.join(expr_list)
- with cfile.open(mode='w+') as f:
- f.write(f'''
-#include <arch/i386/idt.h>
-#include <stdint.h>
-#include <{intr_handler_h}>
-
-#define IDT_ENTRY 256
-
-u64_t _idt[IDT_ENTRY];
-u16_t _idt_limit = sizeof(_idt) - 1;
-static inline void
-_set_idt_entry(u32_t vector,
- u16_t seg_selector,
- void (*isr)(),
- u8_t dpl,
- u8_t type)
-{{
- ptr_t offset = (ptr_t)isr;
- _idt[vector] = (offset & 0xffff0000) | IDT_ATTR(dpl, type);
- _idt[vector] <<= 32;
- _idt[vector] |= (seg_selector << 16) | (offset & 0x0000ffff);
-}}
-
-void _init_idt() {{
-{code}
-}}
-''')
-
-
-def export_s(src: Path):
- sfile = src.joinpath(intr_handler_s)
- expr_list = []
- for i in range(0, 256):
- has_errno = get_vector_config(i, "with_errno")
- expr_list.append(
- f" isr_template {i}, no_error_code={'0' if has_errno else '1'}")
-
- code = '\n'.join(expr_list)
- marco = '''.macro isr_template vector, no_error_code=1
- .global _asm_isr\\vector
- .type _asm_isr\\vector, @function
- _asm_isr\\vector:
- .if \\no_error_code
- pushl $0x0
- .endif
- pushl $\\vector
- jmp interrupt_wrapper
-.endm'''
- with sfile.open(mode='w+') as f:
- f.write(f'''
-#define __ASM__
-{marco}
-.section .text
-{code}
-''')
-
-
-def main():
- src = get_workspace()
- export_h(src)
- export_c(src)
- export_s(src)
-
-
-if __name__ == "__main__":
- main()