462 lines
22 KiB
C
462 lines
22 KiB
C
|
|
#include "type.h"
|
|
#include "hal/cpu.h"
|
|
#include "hal/intr.h"
|
|
#include "hal/print.h"
|
|
#include "hal/mem.h"
|
|
#include "lib/sxtdlib.h"
|
|
|
|
static uint8_t _idts[HAL_CORE_COUNT][IDT_ENTRY_NUM*IDT_ENTRY_SIZE];
|
|
static hal_idt_ptr_t _idt_ptrs[HAL_CORE_COUNT];
|
|
static intr_handler_t _intr_handler_table[HAL_CORE_COUNT][IDT_ENTRY_NUM];
|
|
static void* _intr_handler_context_table[HAL_CORE_COUNT][IDT_ENTRY_NUM];
|
|
static exc_handler_t _exc_handler_table[HAL_CORE_COUNT][IDT_ENTRY_NUM];
|
|
|
|
irql_t KABI hal_set_irql(irql_t irql)
|
|
{
|
|
UNREFERENCED(irql)
|
|
hal_assert(false,"Unimplemented function called.");
|
|
return 0;
|
|
}
|
|
|
|
irql_t KABI hal_get_irql(void)
|
|
{
|
|
hal_assert(false,"Unimplemented function called.");
|
|
return 0;
|
|
}
|
|
|
|
|
|
void KABI hal_write_gate(void *const gate,
|
|
uint64_t const offset,
|
|
uint32_t const selector,
|
|
uint32_t const attr)
|
|
{
|
|
((uint8_t *) gate)[0] = (uint8_t) (offset & 0xFF);
|
|
((uint8_t *) gate)[1] = (uint8_t) ((offset >> 8) & 0xFF);
|
|
((uint8_t *) gate)[2] = (uint8_t) (selector & 0xFF);
|
|
((uint8_t *) gate)[3] = (uint8_t) ((selector >> 8) & 0xFF);
|
|
((uint8_t *) gate)[4] = (uint8_t) (attr & 0xFF);
|
|
((uint8_t *) gate)[5] = (uint8_t) ((attr >> 8) & 0xFF);
|
|
((uint8_t *) gate)[6] = (uint8_t) ((offset >> 16) & 0xFF);
|
|
((uint8_t *) gate)[7] = (uint8_t) ((offset >> 24) & 0xFF);
|
|
((uint8_t *) gate)[8] = (uint8_t) ((offset >> 32) & 0xFF);
|
|
((uint8_t *) gate)[9] = (uint8_t) ((offset >> 40) & 0xFF);
|
|
((uint8_t *) gate)[10] = (uint8_t) ((offset >> 48) & 0xFF);
|
|
((uint8_t *) gate)[11] = (uint8_t) ((offset >> 56) & 0xFF);
|
|
((uint8_t *) gate)[12] = 0;
|
|
((uint8_t *) gate)[13] = 0;
|
|
((uint8_t *) gate)[14] = 0;
|
|
((uint8_t *) gate)[15] = 0;
|
|
return;
|
|
}
|
|
|
|
void KABI hal_set_interrupt_handler(uint64_t index,
|
|
void (*handler)(void))
|
|
{
|
|
if (index < IDT_ENTRY_NUM)
|
|
{
|
|
hal_write_gate(_idts[hal_get_core_id()] + 16 * index, (uint64_t) handler, seg_selector(1, 0),
|
|
GATE_DPL_0 | GATE_PRESENT | GATE_TYPE_INTERRUPT);
|
|
}
|
|
return;
|
|
}
|
|
|
|
void KABI hal_issue_interrupt(uint32_t target_core, uint32_t vector)
|
|
{
|
|
UNREFERENCED(target_core);
|
|
UNREFERENCED(vector);
|
|
hal_assert(false,"Unimplemented function called.");
|
|
return;
|
|
}
|
|
|
|
void KABI hal_register_interrupt_handler(uint32_t coreid, uint32_t index, intr_handler_t handler, void* context)
|
|
{
|
|
if (index < IDT_ENTRY_NUM && coreid < HAL_CORE_COUNT)
|
|
{
|
|
_intr_handler_table[coreid][index] = handler;
|
|
_intr_handler_context_table[coreid][index] = context;
|
|
}
|
|
return;
|
|
}
|
|
|
|
void KABI hal_deregister_interrupt_handler(uint32_t coreid, uint32_t index)
|
|
{
|
|
if (index < IDT_ENTRY_NUM && coreid < HAL_CORE_COUNT)
|
|
{
|
|
_intr_handler_table[coreid][index] = NULL;
|
|
}
|
|
return;
|
|
}
|
|
|
|
void KABI hal_register_exception_handler(uint32_t coreid, uint32_t index, exc_handler_t handler)
|
|
{
|
|
if (index < IDT_ENTRY_NUM && coreid < HAL_CORE_COUNT)
|
|
{
|
|
_exc_handler_table[coreid][index] = handler;
|
|
}
|
|
return;
|
|
}
|
|
|
|
void KABI hal_deregister_exception_handler(uint32_t coreid, uint32_t index)
|
|
{
|
|
if (index < IDT_ENTRY_NUM && coreid < HAL_CORE_COUNT)
|
|
{
|
|
_exc_handler_table[coreid][index] = NULL;
|
|
}
|
|
return;
|
|
}
|
|
|
|
void KABI hal_interrupt_dispatcher(uint64_t int_vec, hal_interrupt_context_t *context)
|
|
{
|
|
uint32_t coreid = hal_get_core_id();
|
|
if (_intr_handler_table[int_vec] == NULL)
|
|
{
|
|
hal_printf("Unhandled interrupt %d at 0x%X.\n", int_vec, context->rip);
|
|
}
|
|
else
|
|
{
|
|
_intr_handler_table[coreid][int_vec](context, _intr_handler_context_table[coreid][int_vec]);
|
|
}
|
|
return;
|
|
}
|
|
|
|
void KABI hal_exception_dispatcher(uint64_t exc_vec, hal_interrupt_context_t* context, uint64_t errorcode)
|
|
{
|
|
uint32_t coreid = hal_get_core_id();
|
|
if (_exc_handler_table[exc_vec] == NULL)
|
|
{
|
|
hal_printf("Unhandled exception %d at 0x%X.\n", exc_vec, context->rip);
|
|
}
|
|
else
|
|
{
|
|
_exc_handler_table[coreid][exc_vec](context->rip, context->rsp, errorcode);
|
|
}
|
|
return;
|
|
}
|
|
|
|
static void KABI halp_populate_idt(void)
|
|
{
|
|
hal_set_interrupt_handler(0, hal_interrupt_handler_0);
|
|
hal_set_interrupt_handler(1, hal_interrupt_handler_1);
|
|
hal_set_interrupt_handler(2, hal_interrupt_handler_2);
|
|
hal_set_interrupt_handler(3, hal_interrupt_handler_3);
|
|
hal_set_interrupt_handler(4, hal_interrupt_handler_4);
|
|
hal_set_interrupt_handler(5, hal_interrupt_handler_5);
|
|
hal_set_interrupt_handler(6, hal_interrupt_handler_6);
|
|
hal_set_interrupt_handler(7, hal_interrupt_handler_7);
|
|
hal_set_interrupt_handler(8, hal_interrupt_handler_8);
|
|
hal_set_interrupt_handler(9, hal_interrupt_handler_9);
|
|
hal_set_interrupt_handler(10, hal_interrupt_handler_10);
|
|
hal_set_interrupt_handler(11, hal_interrupt_handler_11);
|
|
hal_set_interrupt_handler(12, hal_interrupt_handler_12);
|
|
hal_set_interrupt_handler(13, hal_interrupt_handler_13);
|
|
hal_set_interrupt_handler(14, hal_interrupt_handler_14);
|
|
hal_set_interrupt_handler(15, hal_interrupt_handler_15);
|
|
hal_set_interrupt_handler(16, hal_interrupt_handler_16);
|
|
hal_set_interrupt_handler(17, hal_interrupt_handler_17);
|
|
hal_set_interrupt_handler(18, hal_interrupt_handler_18);
|
|
hal_set_interrupt_handler(19, hal_interrupt_handler_19);
|
|
hal_set_interrupt_handler(20, hal_interrupt_handler_20);
|
|
hal_set_interrupt_handler(21, hal_interrupt_handler_21);
|
|
hal_set_interrupt_handler(22, hal_interrupt_handler_22);
|
|
hal_set_interrupt_handler(23, hal_interrupt_handler_23);
|
|
hal_set_interrupt_handler(24, hal_interrupt_handler_24);
|
|
hal_set_interrupt_handler(25, hal_interrupt_handler_25);
|
|
hal_set_interrupt_handler(26, hal_interrupt_handler_26);
|
|
hal_set_interrupt_handler(27, hal_interrupt_handler_27);
|
|
hal_set_interrupt_handler(28, hal_interrupt_handler_28);
|
|
hal_set_interrupt_handler(29, hal_interrupt_handler_29);
|
|
hal_set_interrupt_handler(30, hal_interrupt_handler_30);
|
|
hal_set_interrupt_handler(31, hal_interrupt_handler_31);
|
|
hal_set_interrupt_handler(32, hal_interrupt_handler_32);
|
|
hal_set_interrupt_handler(33, hal_interrupt_handler_33);
|
|
hal_set_interrupt_handler(34, hal_interrupt_handler_34);
|
|
hal_set_interrupt_handler(35, hal_interrupt_handler_35);
|
|
hal_set_interrupt_handler(36, hal_interrupt_handler_36);
|
|
hal_set_interrupt_handler(37, hal_interrupt_handler_37);
|
|
hal_set_interrupt_handler(38, hal_interrupt_handler_38);
|
|
hal_set_interrupt_handler(39, hal_interrupt_handler_39);
|
|
hal_set_interrupt_handler(40, hal_interrupt_handler_40);
|
|
hal_set_interrupt_handler(41, hal_interrupt_handler_41);
|
|
hal_set_interrupt_handler(42, hal_interrupt_handler_42);
|
|
hal_set_interrupt_handler(43, hal_interrupt_handler_43);
|
|
hal_set_interrupt_handler(44, hal_interrupt_handler_44);
|
|
hal_set_interrupt_handler(45, hal_interrupt_handler_45);
|
|
hal_set_interrupt_handler(46, hal_interrupt_handler_46);
|
|
hal_set_interrupt_handler(47, hal_interrupt_handler_47);
|
|
hal_set_interrupt_handler(48, hal_interrupt_handler_48);
|
|
hal_set_interrupt_handler(49, hal_interrupt_handler_49);
|
|
hal_set_interrupt_handler(50, hal_interrupt_handler_50);
|
|
hal_set_interrupt_handler(51, hal_interrupt_handler_51);
|
|
hal_set_interrupt_handler(52, hal_interrupt_handler_52);
|
|
hal_set_interrupt_handler(53, hal_interrupt_handler_53);
|
|
hal_set_interrupt_handler(54, hal_interrupt_handler_54);
|
|
hal_set_interrupt_handler(55, hal_interrupt_handler_55);
|
|
hal_set_interrupt_handler(56, hal_interrupt_handler_56);
|
|
hal_set_interrupt_handler(57, hal_interrupt_handler_57);
|
|
hal_set_interrupt_handler(58, hal_interrupt_handler_58);
|
|
hal_set_interrupt_handler(59, hal_interrupt_handler_59);
|
|
hal_set_interrupt_handler(60, hal_interrupt_handler_60);
|
|
hal_set_interrupt_handler(61, hal_interrupt_handler_61);
|
|
hal_set_interrupt_handler(62, hal_interrupt_handler_62);
|
|
hal_set_interrupt_handler(63, hal_interrupt_handler_63);
|
|
hal_set_interrupt_handler(64, hal_interrupt_handler_64);
|
|
hal_set_interrupt_handler(65, hal_interrupt_handler_65);
|
|
hal_set_interrupt_handler(66, hal_interrupt_handler_66);
|
|
hal_set_interrupt_handler(67, hal_interrupt_handler_67);
|
|
hal_set_interrupt_handler(68, hal_interrupt_handler_68);
|
|
hal_set_interrupt_handler(69, hal_interrupt_handler_69);
|
|
hal_set_interrupt_handler(70, hal_interrupt_handler_70);
|
|
hal_set_interrupt_handler(71, hal_interrupt_handler_71);
|
|
hal_set_interrupt_handler(72, hal_interrupt_handler_72);
|
|
hal_set_interrupt_handler(73, hal_interrupt_handler_73);
|
|
hal_set_interrupt_handler(74, hal_interrupt_handler_74);
|
|
hal_set_interrupt_handler(75, hal_interrupt_handler_75);
|
|
hal_set_interrupt_handler(76, hal_interrupt_handler_76);
|
|
hal_set_interrupt_handler(77, hal_interrupt_handler_77);
|
|
hal_set_interrupt_handler(78, hal_interrupt_handler_78);
|
|
hal_set_interrupt_handler(79, hal_interrupt_handler_79);
|
|
hal_set_interrupt_handler(80, hal_interrupt_handler_80);
|
|
hal_set_interrupt_handler(81, hal_interrupt_handler_81);
|
|
hal_set_interrupt_handler(82, hal_interrupt_handler_82);
|
|
hal_set_interrupt_handler(83, hal_interrupt_handler_83);
|
|
hal_set_interrupt_handler(84, hal_interrupt_handler_84);
|
|
hal_set_interrupt_handler(85, hal_interrupt_handler_85);
|
|
hal_set_interrupt_handler(86, hal_interrupt_handler_86);
|
|
hal_set_interrupt_handler(87, hal_interrupt_handler_87);
|
|
hal_set_interrupt_handler(88, hal_interrupt_handler_88);
|
|
hal_set_interrupt_handler(89, hal_interrupt_handler_89);
|
|
hal_set_interrupt_handler(90, hal_interrupt_handler_90);
|
|
hal_set_interrupt_handler(91, hal_interrupt_handler_91);
|
|
hal_set_interrupt_handler(92, hal_interrupt_handler_92);
|
|
hal_set_interrupt_handler(93, hal_interrupt_handler_93);
|
|
hal_set_interrupt_handler(94, hal_interrupt_handler_94);
|
|
hal_set_interrupt_handler(95, hal_interrupt_handler_95);
|
|
hal_set_interrupt_handler(96, hal_interrupt_handler_96);
|
|
hal_set_interrupt_handler(97, hal_interrupt_handler_97);
|
|
hal_set_interrupt_handler(98, hal_interrupt_handler_98);
|
|
hal_set_interrupt_handler(99, hal_interrupt_handler_99);
|
|
hal_set_interrupt_handler(100, hal_interrupt_handler_100);
|
|
hal_set_interrupt_handler(101, hal_interrupt_handler_101);
|
|
hal_set_interrupt_handler(102, hal_interrupt_handler_102);
|
|
hal_set_interrupt_handler(103, hal_interrupt_handler_103);
|
|
hal_set_interrupt_handler(104, hal_interrupt_handler_104);
|
|
hal_set_interrupt_handler(105, hal_interrupt_handler_105);
|
|
hal_set_interrupt_handler(106, hal_interrupt_handler_106);
|
|
hal_set_interrupt_handler(107, hal_interrupt_handler_107);
|
|
hal_set_interrupt_handler(108, hal_interrupt_handler_108);
|
|
hal_set_interrupt_handler(109, hal_interrupt_handler_109);
|
|
hal_set_interrupt_handler(110, hal_interrupt_handler_110);
|
|
hal_set_interrupt_handler(111, hal_interrupt_handler_111);
|
|
hal_set_interrupt_handler(112, hal_interrupt_handler_112);
|
|
hal_set_interrupt_handler(113, hal_interrupt_handler_113);
|
|
hal_set_interrupt_handler(114, hal_interrupt_handler_114);
|
|
hal_set_interrupt_handler(115, hal_interrupt_handler_115);
|
|
hal_set_interrupt_handler(116, hal_interrupt_handler_116);
|
|
hal_set_interrupt_handler(117, hal_interrupt_handler_117);
|
|
hal_set_interrupt_handler(118, hal_interrupt_handler_118);
|
|
hal_set_interrupt_handler(119, hal_interrupt_handler_119);
|
|
hal_set_interrupt_handler(120, hal_interrupt_handler_120);
|
|
hal_set_interrupt_handler(121, hal_interrupt_handler_121);
|
|
hal_set_interrupt_handler(122, hal_interrupt_handler_122);
|
|
hal_set_interrupt_handler(123, hal_interrupt_handler_123);
|
|
hal_set_interrupt_handler(124, hal_interrupt_handler_124);
|
|
hal_set_interrupt_handler(125, hal_interrupt_handler_125);
|
|
hal_set_interrupt_handler(126, hal_interrupt_handler_126);
|
|
hal_set_interrupt_handler(127, hal_interrupt_handler_127);
|
|
hal_set_interrupt_handler(128, hal_interrupt_handler_128);
|
|
hal_set_interrupt_handler(129, hal_interrupt_handler_129);
|
|
hal_set_interrupt_handler(130, hal_interrupt_handler_130);
|
|
hal_set_interrupt_handler(131, hal_interrupt_handler_131);
|
|
hal_set_interrupt_handler(132, hal_interrupt_handler_132);
|
|
hal_set_interrupt_handler(133, hal_interrupt_handler_133);
|
|
hal_set_interrupt_handler(134, hal_interrupt_handler_134);
|
|
hal_set_interrupt_handler(135, hal_interrupt_handler_135);
|
|
hal_set_interrupt_handler(136, hal_interrupt_handler_136);
|
|
hal_set_interrupt_handler(137, hal_interrupt_handler_137);
|
|
hal_set_interrupt_handler(138, hal_interrupt_handler_138);
|
|
hal_set_interrupt_handler(139, hal_interrupt_handler_139);
|
|
hal_set_interrupt_handler(140, hal_interrupt_handler_140);
|
|
hal_set_interrupt_handler(141, hal_interrupt_handler_141);
|
|
hal_set_interrupt_handler(142, hal_interrupt_handler_142);
|
|
hal_set_interrupt_handler(143, hal_interrupt_handler_143);
|
|
hal_set_interrupt_handler(144, hal_interrupt_handler_144);
|
|
hal_set_interrupt_handler(145, hal_interrupt_handler_145);
|
|
hal_set_interrupt_handler(146, hal_interrupt_handler_146);
|
|
hal_set_interrupt_handler(147, hal_interrupt_handler_147);
|
|
hal_set_interrupt_handler(148, hal_interrupt_handler_148);
|
|
hal_set_interrupt_handler(149, hal_interrupt_handler_149);
|
|
hal_set_interrupt_handler(150, hal_interrupt_handler_150);
|
|
hal_set_interrupt_handler(151, hal_interrupt_handler_151);
|
|
hal_set_interrupt_handler(152, hal_interrupt_handler_152);
|
|
hal_set_interrupt_handler(153, hal_interrupt_handler_153);
|
|
hal_set_interrupt_handler(154, hal_interrupt_handler_154);
|
|
hal_set_interrupt_handler(155, hal_interrupt_handler_155);
|
|
hal_set_interrupt_handler(156, hal_interrupt_handler_156);
|
|
hal_set_interrupt_handler(157, hal_interrupt_handler_157);
|
|
hal_set_interrupt_handler(158, hal_interrupt_handler_158);
|
|
hal_set_interrupt_handler(159, hal_interrupt_handler_159);
|
|
hal_set_interrupt_handler(160, hal_interrupt_handler_160);
|
|
hal_set_interrupt_handler(161, hal_interrupt_handler_161);
|
|
hal_set_interrupt_handler(162, hal_interrupt_handler_162);
|
|
hal_set_interrupt_handler(163, hal_interrupt_handler_163);
|
|
hal_set_interrupt_handler(164, hal_interrupt_handler_164);
|
|
hal_set_interrupt_handler(165, hal_interrupt_handler_165);
|
|
hal_set_interrupt_handler(166, hal_interrupt_handler_166);
|
|
hal_set_interrupt_handler(167, hal_interrupt_handler_167);
|
|
hal_set_interrupt_handler(168, hal_interrupt_handler_168);
|
|
hal_set_interrupt_handler(169, hal_interrupt_handler_169);
|
|
hal_set_interrupt_handler(170, hal_interrupt_handler_170);
|
|
hal_set_interrupt_handler(171, hal_interrupt_handler_171);
|
|
hal_set_interrupt_handler(172, hal_interrupt_handler_172);
|
|
hal_set_interrupt_handler(173, hal_interrupt_handler_173);
|
|
hal_set_interrupt_handler(174, hal_interrupt_handler_174);
|
|
hal_set_interrupt_handler(175, hal_interrupt_handler_175);
|
|
hal_set_interrupt_handler(176, hal_interrupt_handler_176);
|
|
hal_set_interrupt_handler(177, hal_interrupt_handler_177);
|
|
hal_set_interrupt_handler(178, hal_interrupt_handler_178);
|
|
hal_set_interrupt_handler(179, hal_interrupt_handler_179);
|
|
hal_set_interrupt_handler(180, hal_interrupt_handler_180);
|
|
hal_set_interrupt_handler(181, hal_interrupt_handler_181);
|
|
hal_set_interrupt_handler(182, hal_interrupt_handler_182);
|
|
hal_set_interrupt_handler(183, hal_interrupt_handler_183);
|
|
hal_set_interrupt_handler(184, hal_interrupt_handler_184);
|
|
hal_set_interrupt_handler(185, hal_interrupt_handler_185);
|
|
hal_set_interrupt_handler(186, hal_interrupt_handler_186);
|
|
hal_set_interrupt_handler(187, hal_interrupt_handler_187);
|
|
hal_set_interrupt_handler(188, hal_interrupt_handler_188);
|
|
hal_set_interrupt_handler(189, hal_interrupt_handler_189);
|
|
hal_set_interrupt_handler(190, hal_interrupt_handler_190);
|
|
hal_set_interrupt_handler(191, hal_interrupt_handler_191);
|
|
hal_set_interrupt_handler(192, hal_interrupt_handler_192);
|
|
hal_set_interrupt_handler(193, hal_interrupt_handler_193);
|
|
hal_set_interrupt_handler(194, hal_interrupt_handler_194);
|
|
hal_set_interrupt_handler(195, hal_interrupt_handler_195);
|
|
hal_set_interrupt_handler(196, hal_interrupt_handler_196);
|
|
hal_set_interrupt_handler(197, hal_interrupt_handler_197);
|
|
hal_set_interrupt_handler(198, hal_interrupt_handler_198);
|
|
hal_set_interrupt_handler(199, hal_interrupt_handler_199);
|
|
hal_set_interrupt_handler(200, hal_interrupt_handler_200);
|
|
hal_set_interrupt_handler(201, hal_interrupt_handler_201);
|
|
hal_set_interrupt_handler(202, hal_interrupt_handler_202);
|
|
hal_set_interrupt_handler(203, hal_interrupt_handler_203);
|
|
hal_set_interrupt_handler(204, hal_interrupt_handler_204);
|
|
hal_set_interrupt_handler(205, hal_interrupt_handler_205);
|
|
hal_set_interrupt_handler(206, hal_interrupt_handler_206);
|
|
hal_set_interrupt_handler(207, hal_interrupt_handler_207);
|
|
hal_set_interrupt_handler(208, hal_interrupt_handler_208);
|
|
hal_set_interrupt_handler(209, hal_interrupt_handler_209);
|
|
hal_set_interrupt_handler(210, hal_interrupt_handler_210);
|
|
hal_set_interrupt_handler(211, hal_interrupt_handler_211);
|
|
hal_set_interrupt_handler(212, hal_interrupt_handler_212);
|
|
hal_set_interrupt_handler(213, hal_interrupt_handler_213);
|
|
hal_set_interrupt_handler(214, hal_interrupt_handler_214);
|
|
hal_set_interrupt_handler(215, hal_interrupt_handler_215);
|
|
hal_set_interrupt_handler(216, hal_interrupt_handler_216);
|
|
hal_set_interrupt_handler(217, hal_interrupt_handler_217);
|
|
hal_set_interrupt_handler(218, hal_interrupt_handler_218);
|
|
hal_set_interrupt_handler(219, hal_interrupt_handler_219);
|
|
hal_set_interrupt_handler(220, hal_interrupt_handler_220);
|
|
hal_set_interrupt_handler(221, hal_interrupt_handler_221);
|
|
hal_set_interrupt_handler(222, hal_interrupt_handler_222);
|
|
hal_set_interrupt_handler(223, hal_interrupt_handler_223);
|
|
hal_set_interrupt_handler(224, hal_interrupt_handler_224);
|
|
hal_set_interrupt_handler(225, hal_interrupt_handler_225);
|
|
hal_set_interrupt_handler(226, hal_interrupt_handler_226);
|
|
hal_set_interrupt_handler(227, hal_interrupt_handler_227);
|
|
hal_set_interrupt_handler(228, hal_interrupt_handler_228);
|
|
hal_set_interrupt_handler(229, hal_interrupt_handler_229);
|
|
hal_set_interrupt_handler(230, hal_interrupt_handler_230);
|
|
hal_set_interrupt_handler(231, hal_interrupt_handler_231);
|
|
hal_set_interrupt_handler(232, hal_interrupt_handler_232);
|
|
hal_set_interrupt_handler(233, hal_interrupt_handler_233);
|
|
hal_set_interrupt_handler(234, hal_interrupt_handler_234);
|
|
hal_set_interrupt_handler(235, hal_interrupt_handler_235);
|
|
hal_set_interrupt_handler(236, hal_interrupt_handler_236);
|
|
hal_set_interrupt_handler(237, hal_interrupt_handler_237);
|
|
hal_set_interrupt_handler(238, hal_interrupt_handler_238);
|
|
hal_set_interrupt_handler(239, hal_interrupt_handler_239);
|
|
hal_set_interrupt_handler(240, hal_interrupt_handler_240);
|
|
hal_set_interrupt_handler(241, hal_interrupt_handler_241);
|
|
hal_set_interrupt_handler(242, hal_interrupt_handler_242);
|
|
hal_set_interrupt_handler(243, hal_interrupt_handler_243);
|
|
hal_set_interrupt_handler(244, hal_interrupt_handler_244);
|
|
hal_set_interrupt_handler(245, hal_interrupt_handler_245);
|
|
hal_set_interrupt_handler(246, hal_interrupt_handler_246);
|
|
hal_set_interrupt_handler(247, hal_interrupt_handler_247);
|
|
hal_set_interrupt_handler(248, hal_interrupt_handler_248);
|
|
hal_set_interrupt_handler(249, hal_interrupt_handler_249);
|
|
hal_set_interrupt_handler(250, hal_interrupt_handler_250);
|
|
hal_set_interrupt_handler(251, hal_interrupt_handler_251);
|
|
hal_set_interrupt_handler(252, hal_interrupt_handler_252);
|
|
hal_set_interrupt_handler(253, hal_interrupt_handler_253);
|
|
hal_set_interrupt_handler(254, hal_interrupt_handler_254);
|
|
hal_set_interrupt_handler(255, hal_interrupt_handler_255);
|
|
return;
|
|
}
|
|
|
|
uint32_t KABI hal_get_core_id(void)
|
|
{
|
|
// TODO
|
|
return 0;
|
|
}
|
|
|
|
int32_t KABI hal_interrupt_init(void)
|
|
{
|
|
uint32_t coreid = hal_get_core_id();
|
|
uint32_t eax = 0, ebx = 0, ecx = 0, edx = 0;
|
|
eax = 1;
|
|
hal_cpuid(&eax, &ebx, &ecx, &edx);
|
|
if (!(edx & lb_bit_mask(9)))
|
|
{
|
|
hal_printf("ERROR: APIC not supported by CPU.\n");
|
|
return 1;
|
|
}
|
|
|
|
// get idt ptr ready
|
|
_idt_ptrs[coreid].base = (uint64_t) &_idts[coreid];
|
|
_idt_ptrs[coreid].limit = IDT_ENTRY_NUM * IDT_ENTRY_SIZE - 1;
|
|
|
|
// clear dispatch table
|
|
for (uint64_t i = 0; i < IDT_ENTRY_NUM; i++)
|
|
{
|
|
_intr_handler_table[coreid][i] = NULL;
|
|
_exc_handler_table[coreid][i] = NULL;
|
|
_intr_handler_context_table[coreid][i] = NULL;
|
|
}
|
|
|
|
// hook asm interrupt handlers
|
|
halp_populate_idt();
|
|
|
|
hal_flush_idt(&_idt_ptrs[coreid]);
|
|
|
|
// disable PIC
|
|
hal_write_port_8(0xa1, 0xff);
|
|
hal_write_port_8(0x21, 0xff);
|
|
|
|
uint64_t apic_base_reg = 0;
|
|
uint64_t apic_base = 0;
|
|
ecx = MSR_IA32_APIC_BASE;
|
|
hal_read_msr(&ecx, &edx, &eax);
|
|
apic_base_reg = ((uint64_t) edx << 32) + (uint64_t) eax;
|
|
apic_base = apic_base_reg & lb_bit_field_mask(12, 35);
|
|
UNREFERENCED(apic_base);
|
|
|
|
//hal_printf("APIC Base: 0x%X\n", apic_base);
|
|
//hal_printf("APIC Enabled: %s\n", apic_base_reg & bit_mask_64(11) ? "Yes" : "No");
|
|
//hal_printf("BSP: %s\n", apic_base_reg & bit_mask_64(8) ? "Yes" : "No");
|
|
//hal_printf("APIC Spour: 0x%X\n", *(uint32_t *) ((char *) apic_base + APIC_SPURIOUS_INT_VEC_REG_OFFSET));
|
|
|
|
// hardware enable APIC
|
|
ecx = MSR_IA32_APIC_BASE;
|
|
eax = (uint32_t) ((apic_base_reg & lb_bit_field_mask(0, 31)) | lb_bit_mask(11));
|
|
hal_write_msr(&ecx, &edx, &eax);
|
|
|
|
// software enable APIC
|
|
// hal_write_mem_32((char *) apic_base + APIC_SPURIOUS_INT_VEC_REG_OFFSET, *(uint32_t *) (apic_base + APIC_SPURIOUS_INT_VEC_REG_OFFSET) | (uint32_t)lb_bit_mask(8));
|
|
|
|
// hal_issue_interrupt(1, 255);
|
|
// hal_enable_interrupt();
|
|
|
|
return 0;
|
|
} |