refactor: organize all arch related files together.
authorMinep <lunaixsky@qq.com>
Thu, 10 Aug 2023 18:46:04 +0000 (19:46 +0100)
committerMinep <lunaixsky@qq.com>
Thu, 10 Aug 2023 18:47:46 +0000 (19:47 +0100)
refactor: better code templating

29 files changed:
lunaix-os/arch/i386/exceptions/gdt.c [moved from lunaix-os/kernel/asm/i386/gdt.c with 100% similarity]
lunaix-os/arch/i386/exceptions/i386_intr.h [new file with mode: 0644]
lunaix-os/arch/i386/exceptions/i386_isrdef.c [new file with mode: 0644]
lunaix-os/arch/i386/exceptions/i386_isrm.c [moved from lunaix-os/kernel/asm/i386/i386_isrm.c with 100% similarity]
lunaix-os/arch/i386/exceptions/interrupt.S [moved from lunaix-os/kernel/asm/i386/interrupt.S with 100% similarity]
lunaix-os/arch/i386/exceptions/interrupts.c [moved from lunaix-os/kernel/asm/i386/interrupts.c with 87% similarity]
lunaix-os/arch/i386/exceptions/intr_routines.c [moved from lunaix-os/kernel/asm/i386/intr_routines.c with 98% similarity]
lunaix-os/arch/i386/exceptions/intrhnds.S [moved from lunaix-os/kernel/asm/i386/intrhnds.S with 99% similarity]
lunaix-os/arch/i386/hal/cpu.c [moved from lunaix-os/arch/i386/cpu.c with 100% similarity]
lunaix-os/arch/i386/pfault.c [moved from lunaix-os/kernel/asm/i386/pfault.c with 100% similarity]
lunaix-os/arch/i386/proc.c [moved from lunaix-os/kernel/asm/i386/proc.c with 100% similarity]
lunaix-os/arch/i386/prologue.S [moved from lunaix-os/kernel/asm/i386/prologue.S with 100% similarity]
lunaix-os/arch/i386/syscall.S [moved from lunaix-os/kernel/asm/i386/syscall.S with 100% similarity]
lunaix-os/arch/i386/tss.c [moved from lunaix-os/kernel/asm/i386/tss.c with 100% similarity]
lunaix-os/debug/bg_lsdbg.c [deleted file]
lunaix-os/includes/arch/exception.h [new file with mode: 0644]
lunaix-os/includes/arch/i386/interrupts.h
lunaix-os/includes/arch/i386/intrhnds.h [deleted file]
lunaix-os/kernel/asm/i386/intrhnds.c [deleted file]
lunaix-os/kernel/debug/gdbstub.c [moved from lunaix-os/debug/gdbstub.c with 100% similarity]
lunaix-os/kernel/debug/sdbg.c [moved from lunaix-os/debug/sdbg.c with 100% similarity]
lunaix-os/kernel/kinit.c
lunaix-os/kernel/spike.c
lunaix-os/scripts/expand.py [new file with mode: 0644]
lunaix-os/scripts/templates/i386/config.json [new file with mode: 0644]
lunaix-os/scripts/templates/i386/i386_intrhnds.S.j2 [new file with mode: 0644]
lunaix-os/scripts/templates/i386/i386_isrdef.c.j2 [new file with mode: 0644]
lunaix-os/scripts/templates/i386/mappings [new file with mode: 0644]
lunaix-os/scripts/x86_idt_generator.py [deleted file]

diff --git a/lunaix-os/arch/i386/exceptions/i386_intr.h b/lunaix-os/arch/i386/exceptions/i386_intr.h
new file mode 100644 (file)
index 0000000..bf78c35
--- /dev/null
@@ -0,0 +1,10 @@
+#ifndef __LUNAIX_I386_INTR_H
+#define __LUNAIX_I386_INTR_H
+
+void
+exception_install_handler();
+
+void
+intr_routine_init();
+
+#endif /* __LUNAIX_I386_INTR_H */
diff --git a/lunaix-os/arch/i386/exceptions/i386_isrdef.c b/lunaix-os/arch/i386/exceptions/i386_isrdef.c
new file mode 100644 (file)
index 0000000..f0ca965
--- /dev/null
@@ -0,0 +1,535 @@
+#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
similarity index 87%
rename from lunaix-os/kernel/asm/i386/interrupts.c
rename to lunaix-os/arch/i386/exceptions/interrupts.c
index 17bde71ec85d4b2d0187131c469a4be05a98d57e..d63628b3803296d8f8118ddf9765ff0d28f798fc 100644 (file)
@@ -4,6 +4,8 @@
 #include <hal/apic.h>
 #include <hal/cpu.h>
 
 #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/isrm.h>
 #include <lunaix/mm/page.h>
 #include <lunaix/mm/vmm.h>
 #include <lunaix/syslog.h>
 #include <lunaix/tty/tty.h>
 
 #include <lunaix/syslog.h>
 #include <lunaix/tty/tty.h>
 
+#include "i386_intr.h"
+
 LOG_MODULE("INTR")
 
 extern x86_page_table* __kernel_ptd;
 
 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)
 {
 void
 intr_handler(isr_param* param)
 {
similarity index 98%
rename from lunaix-os/kernel/asm/i386/intr_routines.c
rename to lunaix-os/arch/i386/exceptions/intr_routines.c
index 678998da9073092466ce5a5aec369b2209917cb0..6aae249a7da9471e593d227b8c74d0e7783dbeea 100644 (file)
@@ -12,6 +12,8 @@
 
 #include <hal/apic.h>
 
 
 #include <hal/apic.h>
 
+#include "i386_intr.h"
+
 LOG_MODULE("INTR")
 
 extern void
 LOG_MODULE("INTR")
 
 extern void
similarity index 99%
rename from lunaix-os/kernel/asm/i386/intrhnds.S
rename to lunaix-os/arch/i386/exceptions/intrhnds.S
index d8127ec945568ed6236f2920fc75df7953998b2f..272c951f8149eda98e6168d28bb34a808456e696 100644 (file)
@@ -1,4 +1,3 @@
-
 #define __ASM__
 .macro isr_template vector, no_error_code=1
     .global _asm_isr\vector
 #define __ASM__
 .macro isr_template vector, no_error_code=1
     .global _asm_isr\vector
diff --git a/lunaix-os/debug/bg_lsdbg.c b/lunaix-os/debug/bg_lsdbg.c
deleted file mode 100644 (file)
index c5072d7..0000000
+++ /dev/null
@@ -1,81 +0,0 @@
-#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
diff --git a/lunaix-os/includes/arch/exception.h b/lunaix-os/includes/arch/exception.h
new file mode 100644 (file)
index 0000000..31c3792
--- /dev/null
@@ -0,0 +1,7 @@
+#ifndef __LUNAIX_EXCEPTION_H
+#define __LUNAIX_EXCEPTION_H
+
+void
+exception_init();
+
+#endif /* __LUNAIX_EXCEPTION_H */
index 632e60d89dd36bcc4c31f886b5e145f04578341c..329b0ed9252f1cf616e1631052a47e2d4f9b7525 100644 (file)
@@ -51,9 +51,6 @@ struct exec_param
 void
 intr_handler(isr_param* param);
 
 void
 intr_handler(isr_param* param);
 
-void
-intr_routine_init();
-
 #endif
 
 #endif /* __LUNAIX_INTERRUPTS_H */
 #endif
 
 #endif /* __LUNAIX_INTERRUPTS_H */
diff --git a/lunaix-os/includes/arch/i386/intrhnds.h b/lunaix-os/includes/arch/i386/intrhnds.h
deleted file mode 100644 (file)
index 266bfa8..0000000
+++ /dev/null
@@ -1,261 +0,0 @@
-
-#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
diff --git a/lunaix-os/kernel/asm/i386/intrhnds.c b/lunaix-os/kernel/asm/i386/intrhnds.c
deleted file mode 100644 (file)
index b323271..0000000
+++ /dev/null
@@ -1,282 +0,0 @@
-
-#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);
-}
index 726295c5c827942ea8fc09256c6dc4e31f8c6148..5ace096f994e941123dd53b14d46aaceba1331c6 100644 (file)
@@ -18,6 +18,7 @@
 #include <lunaix/types.h>
 
 #include <arch/abi.h>
 #include <lunaix/types.h>
 
 #include <arch/abi.h>
+#include <arch/exception.h>
 #include <arch/i386/boot/multiboot.h>
 #include <arch/i386/interrupts.h>
 
 #include <arch/i386/boot/multiboot.h>
 #include <arch/i386/interrupts.h>
 
@@ -48,9 +49,7 @@ void
 _kernel_pre_init()
 {
     // interrupts
 _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));
 
     // memory
     pmm_init(MEM_1MB + (_k_init_mb_info->mem_upper << 10));
index 09f82b31911661c0ad1fd2f19faff30aea4191a5..8d55b58d46ffec89ff9783388290c9825e6b2344 100644 (file)
@@ -20,7 +20,7 @@ __assert_fail(const char* expr, const char* file, unsigned int line)
 
 void
 panick(const char* msg)
 
 void
 panick(const char* msg)
-{
+{       
     cpu_trap_panic(msg);
     DO_SPIN
 }
     cpu_trap_panic(msg);
     DO_SPIN
 }
diff --git a/lunaix-os/scripts/expand.py b/lunaix-os/scripts/expand.py
new file mode 100644 (file)
index 0000000..eac983f
--- /dev/null
@@ -0,0 +1,267 @@
+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
diff --git a/lunaix-os/scripts/templates/i386/config.json b/lunaix-os/scripts/templates/i386/config.json
new file mode 100644 (file)
index 0000000..97089c8
--- /dev/null
@@ -0,0 +1,19 @@
+{
+    "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
diff --git a/lunaix-os/scripts/templates/i386/i386_intrhnds.S.j2 b/lunaix-os/scripts/templates/i386/i386_intrhnds.S.j2
new file mode 100644 (file)
index 0000000..3f9b585
--- /dev/null
@@ -0,0 +1,19 @@
+#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 %}
diff --git a/lunaix-os/scripts/templates/i386/i386_isrdef.c.j2 b/lunaix-os/scripts/templates/i386/i386_isrdef.c.j2
new file mode 100644 (file)
index 0000000..01ab639
--- /dev/null
@@ -0,0 +1,29 @@
+#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
diff --git a/lunaix-os/scripts/templates/i386/mappings b/lunaix-os/scripts/templates/i386/mappings
new file mode 100644 (file)
index 0000000..9c2c9d5
--- /dev/null
@@ -0,0 +1,2 @@
+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
diff --git a/lunaix-os/scripts/x86_idt_generator.py b/lunaix-os/scripts/x86_idt_generator.py
deleted file mode 100644 (file)
index 38fab80..0000000
+++ /dev/null
@@ -1,147 +0,0 @@
-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()