From: Minep Date: Thu, 10 Aug 2023 18:46:04 +0000 (+0100) Subject: refactor: organize all arch related files together. X-Git-Url: https://scm.lunaixsky.com/lunaix-os.git/commitdiff_plain/7804c2dae30700296c3205aaf7f546f491999bf4?ds=sidebyside;hp=b91be0033265b5b6bd716bd39cb0971da41906c4 refactor: organize all arch related files together. refactor: better code templating --- diff --git a/lunaix-os/kernel/asm/i386/gdt.c b/lunaix-os/arch/i386/exceptions/gdt.c similarity index 100% rename from lunaix-os/kernel/asm/i386/gdt.c rename to lunaix-os/arch/i386/exceptions/gdt.c diff --git a/lunaix-os/arch/i386/exceptions/i386_intr.h b/lunaix-os/arch/i386/exceptions/i386_intr.h new file mode 100644 index 0000000..bf78c35 --- /dev/null +++ b/lunaix-os/arch/i386/exceptions/i386_intr.h @@ -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 index 0000000..f0ca965 --- /dev/null +++ b/lunaix-os/arch/i386/exceptions/i386_isrdef.c @@ -0,0 +1,535 @@ +#include "i386_intr.h" +#include + +#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 diff --git a/lunaix-os/kernel/asm/i386/i386_isrm.c b/lunaix-os/arch/i386/exceptions/i386_isrm.c similarity index 100% rename from lunaix-os/kernel/asm/i386/i386_isrm.c rename to lunaix-os/arch/i386/exceptions/i386_isrm.c diff --git a/lunaix-os/kernel/asm/i386/interrupt.S b/lunaix-os/arch/i386/exceptions/interrupt.S similarity index 100% rename from lunaix-os/kernel/asm/i386/interrupt.S rename to lunaix-os/arch/i386/exceptions/interrupt.S diff --git a/lunaix-os/kernel/asm/i386/interrupts.c b/lunaix-os/arch/i386/exceptions/interrupts.c similarity index 87% rename from lunaix-os/kernel/asm/i386/interrupts.c rename to lunaix-os/arch/i386/exceptions/interrupts.c index 17bde71..d63628b 100644 --- a/lunaix-os/kernel/asm/i386/interrupts.c +++ b/lunaix-os/arch/i386/exceptions/interrupts.c @@ -4,6 +4,8 @@ #include #include +#include + #include #include #include @@ -12,10 +14,20 @@ #include #include +#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) { diff --git a/lunaix-os/kernel/asm/i386/intr_routines.c b/lunaix-os/arch/i386/exceptions/intr_routines.c similarity index 98% rename from lunaix-os/kernel/asm/i386/intr_routines.c rename to lunaix-os/arch/i386/exceptions/intr_routines.c index 678998d..6aae249 100644 --- a/lunaix-os/kernel/asm/i386/intr_routines.c +++ b/lunaix-os/arch/i386/exceptions/intr_routines.c @@ -12,6 +12,8 @@ #include +#include "i386_intr.h" + LOG_MODULE("INTR") extern void diff --git a/lunaix-os/kernel/asm/i386/intrhnds.S b/lunaix-os/arch/i386/exceptions/intrhnds.S similarity index 99% rename from lunaix-os/kernel/asm/i386/intrhnds.S rename to lunaix-os/arch/i386/exceptions/intrhnds.S index d8127ec..272c951 100644 --- a/lunaix-os/kernel/asm/i386/intrhnds.S +++ b/lunaix-os/arch/i386/exceptions/intrhnds.S @@ -1,4 +1,3 @@ - #define __ASM__ .macro isr_template vector, no_error_code=1 .global _asm_isr\vector diff --git a/lunaix-os/arch/i386/cpu.c b/lunaix-os/arch/i386/hal/cpu.c similarity index 100% rename from lunaix-os/arch/i386/cpu.c rename to lunaix-os/arch/i386/hal/cpu.c diff --git a/lunaix-os/kernel/asm/i386/pfault.c b/lunaix-os/arch/i386/pfault.c similarity index 100% rename from lunaix-os/kernel/asm/i386/pfault.c rename to lunaix-os/arch/i386/pfault.c diff --git a/lunaix-os/kernel/asm/i386/proc.c b/lunaix-os/arch/i386/proc.c similarity index 100% rename from lunaix-os/kernel/asm/i386/proc.c rename to lunaix-os/arch/i386/proc.c diff --git a/lunaix-os/kernel/asm/i386/prologue.S b/lunaix-os/arch/i386/prologue.S similarity index 100% rename from lunaix-os/kernel/asm/i386/prologue.S rename to lunaix-os/arch/i386/prologue.S diff --git a/lunaix-os/kernel/asm/i386/syscall.S b/lunaix-os/arch/i386/syscall.S similarity index 100% rename from lunaix-os/kernel/asm/i386/syscall.S rename to lunaix-os/arch/i386/syscall.S diff --git a/lunaix-os/kernel/asm/i386/tss.c b/lunaix-os/arch/i386/tss.c similarity index 100% rename from lunaix-os/kernel/asm/i386/tss.c rename to lunaix-os/arch/i386/tss.c diff --git a/lunaix-os/debug/bg_lsdbg.c b/lunaix-os/debug/bg_lsdbg.c deleted file mode 100644 index c5072d7..0000000 --- a/lunaix-os/debug/bg_lsdbg.c +++ /dev/null @@ -1,81 +0,0 @@ -#include -#include -#include -#include - -#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 index 0000000..31c3792 --- /dev/null +++ b/lunaix-os/includes/arch/exception.h @@ -0,0 +1,7 @@ +#ifndef __LUNAIX_EXCEPTION_H +#define __LUNAIX_EXCEPTION_H + +void +exception_init(); + +#endif /* __LUNAIX_EXCEPTION_H */ diff --git a/lunaix-os/includes/arch/i386/interrupts.h b/lunaix-os/includes/arch/i386/interrupts.h index 632e60d..329b0ed 100644 --- a/lunaix-os/includes/arch/i386/interrupts.h +++ b/lunaix-os/includes/arch/i386/interrupts.h @@ -51,9 +51,6 @@ struct exec_param void intr_handler(isr_param* param); -void -intr_routine_init(); - #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 index 266bfa8..0000000 --- a/lunaix-os/includes/arch/i386/intrhnds.h +++ /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 index b323271..0000000 --- a/lunaix-os/kernel/asm/i386/intrhnds.c +++ /dev/null @@ -1,282 +0,0 @@ - -#include -#include -#include - -#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); -} diff --git a/lunaix-os/debug/gdbstub.c b/lunaix-os/kernel/debug/gdbstub.c similarity index 100% rename from lunaix-os/debug/gdbstub.c rename to lunaix-os/kernel/debug/gdbstub.c diff --git a/lunaix-os/debug/sdbg.c b/lunaix-os/kernel/debug/sdbg.c similarity index 100% rename from lunaix-os/debug/sdbg.c rename to lunaix-os/kernel/debug/sdbg.c diff --git a/lunaix-os/kernel/kinit.c b/lunaix-os/kernel/kinit.c index 726295c..5ace096 100644 --- a/lunaix-os/kernel/kinit.c +++ b/lunaix-os/kernel/kinit.c @@ -18,6 +18,7 @@ #include #include +#include #include #include @@ -48,9 +49,7 @@ void _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)); diff --git a/lunaix-os/kernel/spike.c b/lunaix-os/kernel/spike.c index 09f82b3..8d55b58 100644 --- a/lunaix-os/kernel/spike.c +++ b/lunaix-os/kernel/spike.c @@ -20,7 +20,7 @@ __assert_fail(const char* expr, const char* file, unsigned int line) void panick(const char* msg) -{ +{ cpu_trap_panic(msg); DO_SPIN } diff --git a/lunaix-os/scripts/expand.py b/lunaix-os/scripts/expand.py new file mode 100644 index 0000000..eac983f --- /dev/null +++ b/lunaix-os/scripts/expand.py @@ -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[0-9]+)$|^(?P[0-9]+)..(?P[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 index 0000000..97089c8 --- /dev/null +++ b/lunaix-os/scripts/templates/i386/config.json @@ -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 index 0000000..3f9b585 --- /dev/null +++ b/lunaix-os/scripts/templates/i386/i386_intrhnds.S.j2 @@ -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 index 0000000..01ab639 --- /dev/null +++ b/lunaix-os/scripts/templates/i386/i386_isrdef.c.j2 @@ -0,0 +1,29 @@ +#include "i386_intr.h" +#include + +#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 index 0000000..9c2c9d5 --- /dev/null +++ b/lunaix-os/scripts/templates/i386/mappings @@ -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 index 38fab80..0000000 --- a/lunaix-os/scripts/x86_idt_generator.py +++ /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 -#include -#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()