123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604 |
- use crate::{
- arch::MMArch,
- mm::{MemoryManagementArch, PhysAddr, VirtAddr},
- };
- extern "C" {
- static mut IDT_Table: [usize; 0usize];
- }
- macro_rules! save_all_regs {
- () => {
- "
- cld
- push rax
- push rax
- mov rax, es
- push rax
- mov rax, ds
- push rax
- xor rax, rax
- push rbp
- push rdi
- push rsi
- push rdx
- push rcx
- push rbx
- push r8
- push r9
- push r10
- push r11
- push r12
- push r13
- push r14
- push r15
- mov rdx, 0x10
- mov ds, rdx
- mov es, rdx
- "
- };
- }
- macro_rules! interrupt_handler {
- ($name:expr) => {
- paste::paste! {
- #[naked]
- #[no_mangle]
- unsafe extern "C" fn [<irq_handler $name>]() {
- core::arch::asm!(
- concat!(
- "
- push 0x0
- ",
- save_all_regs!(),
- "\n",
- "
- mov rdi, rsp
- lea rax, ret_from_intr[rip]
- push rax
- mov rsi, {irqnum}
- jmp x86_64_do_irq
- "
- ),
- irqnum = const($name),
- options(noreturn)
- );
- }
- }
- };
- }
- interrupt_handler!(32);
- interrupt_handler!(33);
- interrupt_handler!(34);
- interrupt_handler!(35);
- interrupt_handler!(36);
- interrupt_handler!(37);
- interrupt_handler!(38);
- interrupt_handler!(39);
- interrupt_handler!(40);
- interrupt_handler!(41);
- interrupt_handler!(42);
- interrupt_handler!(43);
- interrupt_handler!(44);
- interrupt_handler!(45);
- interrupt_handler!(46);
- interrupt_handler!(47);
- interrupt_handler!(48);
- interrupt_handler!(49);
- interrupt_handler!(50);
- interrupt_handler!(51);
- interrupt_handler!(52);
- interrupt_handler!(53);
- interrupt_handler!(54);
- interrupt_handler!(55);
- interrupt_handler!(56);
- interrupt_handler!(57);
- interrupt_handler!(58);
- interrupt_handler!(59);
- interrupt_handler!(60);
- interrupt_handler!(61);
- interrupt_handler!(62);
- interrupt_handler!(63);
- interrupt_handler!(64);
- interrupt_handler!(65);
- interrupt_handler!(66);
- interrupt_handler!(67);
- interrupt_handler!(68);
- interrupt_handler!(69);
- interrupt_handler!(70);
- interrupt_handler!(71);
- interrupt_handler!(72);
- interrupt_handler!(73);
- interrupt_handler!(74);
- interrupt_handler!(75);
- interrupt_handler!(76);
- interrupt_handler!(77);
- interrupt_handler!(78);
- interrupt_handler!(79);
- interrupt_handler!(80);
- interrupt_handler!(81);
- interrupt_handler!(82);
- interrupt_handler!(83);
- interrupt_handler!(84);
- interrupt_handler!(85);
- interrupt_handler!(86);
- interrupt_handler!(87);
- interrupt_handler!(88);
- interrupt_handler!(89);
- interrupt_handler!(90);
- interrupt_handler!(91);
- interrupt_handler!(92);
- interrupt_handler!(93);
- interrupt_handler!(94);
- interrupt_handler!(95);
- interrupt_handler!(96);
- interrupt_handler!(97);
- interrupt_handler!(98);
- interrupt_handler!(99);
- interrupt_handler!(100);
- interrupt_handler!(101);
- interrupt_handler!(102);
- interrupt_handler!(103);
- interrupt_handler!(104);
- interrupt_handler!(105);
- interrupt_handler!(106);
- interrupt_handler!(107);
- interrupt_handler!(108);
- interrupt_handler!(109);
- interrupt_handler!(110);
- interrupt_handler!(111);
- interrupt_handler!(112);
- interrupt_handler!(113);
- interrupt_handler!(114);
- interrupt_handler!(115);
- interrupt_handler!(116);
- interrupt_handler!(117);
- interrupt_handler!(118);
- interrupt_handler!(119);
- interrupt_handler!(120);
- interrupt_handler!(121);
- interrupt_handler!(122);
- interrupt_handler!(123);
- interrupt_handler!(124);
- interrupt_handler!(125);
- interrupt_handler!(126);
- interrupt_handler!(127);
- // 128号为系统调用,因此不需要设置中断处理函数
- interrupt_handler!(129);
- interrupt_handler!(130);
- interrupt_handler!(131);
- interrupt_handler!(132);
- interrupt_handler!(133);
- interrupt_handler!(134);
- interrupt_handler!(135);
- interrupt_handler!(136);
- interrupt_handler!(137);
- interrupt_handler!(138);
- interrupt_handler!(139);
- interrupt_handler!(140);
- interrupt_handler!(141);
- interrupt_handler!(142);
- interrupt_handler!(143);
- interrupt_handler!(144);
- interrupt_handler!(145);
- interrupt_handler!(146);
- interrupt_handler!(147);
- interrupt_handler!(148);
- interrupt_handler!(149);
- interrupt_handler!(150);
- interrupt_handler!(151);
- interrupt_handler!(152);
- interrupt_handler!(153);
- interrupt_handler!(154);
- interrupt_handler!(155);
- interrupt_handler!(156);
- interrupt_handler!(157);
- interrupt_handler!(158);
- interrupt_handler!(159);
- interrupt_handler!(160);
- interrupt_handler!(161);
- interrupt_handler!(162);
- interrupt_handler!(163);
- interrupt_handler!(164);
- interrupt_handler!(165);
- interrupt_handler!(166);
- interrupt_handler!(167);
- interrupt_handler!(168);
- interrupt_handler!(169);
- interrupt_handler!(170);
- interrupt_handler!(171);
- interrupt_handler!(172);
- interrupt_handler!(173);
- interrupt_handler!(174);
- interrupt_handler!(175);
- interrupt_handler!(176);
- interrupt_handler!(177);
- interrupt_handler!(178);
- interrupt_handler!(179);
- interrupt_handler!(180);
- interrupt_handler!(181);
- interrupt_handler!(182);
- interrupt_handler!(183);
- interrupt_handler!(184);
- interrupt_handler!(185);
- interrupt_handler!(186);
- interrupt_handler!(187);
- interrupt_handler!(188);
- interrupt_handler!(189);
- interrupt_handler!(190);
- interrupt_handler!(191);
- interrupt_handler!(192);
- interrupt_handler!(193);
- interrupt_handler!(194);
- interrupt_handler!(195);
- interrupt_handler!(196);
- interrupt_handler!(197);
- interrupt_handler!(198);
- interrupt_handler!(199);
- interrupt_handler!(200);
- interrupt_handler!(201);
- interrupt_handler!(202);
- interrupt_handler!(203);
- interrupt_handler!(204);
- interrupt_handler!(205);
- interrupt_handler!(206);
- interrupt_handler!(207);
- interrupt_handler!(208);
- interrupt_handler!(209);
- interrupt_handler!(210);
- interrupt_handler!(211);
- interrupt_handler!(212);
- interrupt_handler!(213);
- interrupt_handler!(214);
- interrupt_handler!(215);
- interrupt_handler!(216);
- interrupt_handler!(217);
- interrupt_handler!(218);
- interrupt_handler!(219);
- interrupt_handler!(220);
- interrupt_handler!(221);
- interrupt_handler!(222);
- interrupt_handler!(223);
- interrupt_handler!(224);
- interrupt_handler!(225);
- interrupt_handler!(226);
- interrupt_handler!(227);
- interrupt_handler!(228);
- interrupt_handler!(229);
- interrupt_handler!(230);
- interrupt_handler!(231);
- interrupt_handler!(232);
- interrupt_handler!(233);
- interrupt_handler!(234);
- interrupt_handler!(235);
- interrupt_handler!(236);
- interrupt_handler!(237);
- interrupt_handler!(238);
- interrupt_handler!(239);
- interrupt_handler!(240);
- interrupt_handler!(241);
- interrupt_handler!(242);
- interrupt_handler!(243);
- interrupt_handler!(244);
- interrupt_handler!(245);
- interrupt_handler!(246);
- interrupt_handler!(247);
- interrupt_handler!(248);
- interrupt_handler!(249);
- interrupt_handler!(250);
- interrupt_handler!(251);
- interrupt_handler!(252);
- interrupt_handler!(253);
- interrupt_handler!(254);
- interrupt_handler!(255);
- #[inline(never)]
- pub unsafe fn arch_setup_interrupt_gate() {
- set_intr_gate(32, 0, VirtAddr::new(irq_handler32 as usize));
- set_intr_gate(33, 0, VirtAddr::new(irq_handler33 as usize));
- set_intr_gate(34, 0, VirtAddr::new(irq_handler34 as usize));
- set_intr_gate(35, 0, VirtAddr::new(irq_handler35 as usize));
- set_intr_gate(36, 0, VirtAddr::new(irq_handler36 as usize));
- set_intr_gate(37, 0, VirtAddr::new(irq_handler37 as usize));
- set_intr_gate(38, 0, VirtAddr::new(irq_handler38 as usize));
- set_intr_gate(39, 0, VirtAddr::new(irq_handler39 as usize));
- set_intr_gate(40, 0, VirtAddr::new(irq_handler40 as usize));
- set_intr_gate(41, 0, VirtAddr::new(irq_handler41 as usize));
- set_intr_gate(42, 0, VirtAddr::new(irq_handler42 as usize));
- set_intr_gate(43, 0, VirtAddr::new(irq_handler43 as usize));
- set_intr_gate(44, 0, VirtAddr::new(irq_handler44 as usize));
- set_intr_gate(45, 0, VirtAddr::new(irq_handler45 as usize));
- set_intr_gate(46, 0, VirtAddr::new(irq_handler46 as usize));
- set_intr_gate(47, 0, VirtAddr::new(irq_handler47 as usize));
- set_intr_gate(48, 0, VirtAddr::new(irq_handler48 as usize));
- set_intr_gate(49, 0, VirtAddr::new(irq_handler49 as usize));
- set_intr_gate(50, 0, VirtAddr::new(irq_handler50 as usize));
- set_intr_gate(51, 0, VirtAddr::new(irq_handler51 as usize));
- set_intr_gate(52, 0, VirtAddr::new(irq_handler52 as usize));
- set_intr_gate(53, 0, VirtAddr::new(irq_handler53 as usize));
- set_intr_gate(54, 0, VirtAddr::new(irq_handler54 as usize));
- set_intr_gate(55, 0, VirtAddr::new(irq_handler55 as usize));
- set_intr_gate(56, 0, VirtAddr::new(irq_handler56 as usize));
- set_intr_gate(57, 0, VirtAddr::new(irq_handler57 as usize));
- set_intr_gate(58, 0, VirtAddr::new(irq_handler58 as usize));
- set_intr_gate(59, 0, VirtAddr::new(irq_handler59 as usize));
- set_intr_gate(60, 0, VirtAddr::new(irq_handler60 as usize));
- set_intr_gate(61, 0, VirtAddr::new(irq_handler61 as usize));
- set_intr_gate(62, 0, VirtAddr::new(irq_handler62 as usize));
- set_intr_gate(63, 0, VirtAddr::new(irq_handler63 as usize));
- set_intr_gate(64, 0, VirtAddr::new(irq_handler64 as usize));
- set_intr_gate(65, 0, VirtAddr::new(irq_handler65 as usize));
- set_intr_gate(66, 0, VirtAddr::new(irq_handler66 as usize));
- set_intr_gate(67, 0, VirtAddr::new(irq_handler67 as usize));
- set_intr_gate(68, 0, VirtAddr::new(irq_handler68 as usize));
- set_intr_gate(69, 0, VirtAddr::new(irq_handler69 as usize));
- set_intr_gate(70, 0, VirtAddr::new(irq_handler70 as usize));
- set_intr_gate(71, 0, VirtAddr::new(irq_handler71 as usize));
- set_intr_gate(72, 0, VirtAddr::new(irq_handler72 as usize));
- set_intr_gate(73, 0, VirtAddr::new(irq_handler73 as usize));
- set_intr_gate(74, 0, VirtAddr::new(irq_handler74 as usize));
- set_intr_gate(75, 0, VirtAddr::new(irq_handler75 as usize));
- set_intr_gate(76, 0, VirtAddr::new(irq_handler76 as usize));
- set_intr_gate(77, 0, VirtAddr::new(irq_handler77 as usize));
- set_intr_gate(78, 0, VirtAddr::new(irq_handler78 as usize));
- set_intr_gate(79, 0, VirtAddr::new(irq_handler79 as usize));
- set_intr_gate(80, 0, VirtAddr::new(irq_handler80 as usize));
- set_intr_gate(81, 0, VirtAddr::new(irq_handler81 as usize));
- set_intr_gate(82, 0, VirtAddr::new(irq_handler82 as usize));
- set_intr_gate(83, 0, VirtAddr::new(irq_handler83 as usize));
- set_intr_gate(84, 0, VirtAddr::new(irq_handler84 as usize));
- set_intr_gate(85, 0, VirtAddr::new(irq_handler85 as usize));
- set_intr_gate(86, 0, VirtAddr::new(irq_handler86 as usize));
- set_intr_gate(87, 0, VirtAddr::new(irq_handler87 as usize));
- set_intr_gate(88, 0, VirtAddr::new(irq_handler88 as usize));
- set_intr_gate(89, 0, VirtAddr::new(irq_handler89 as usize));
- set_intr_gate(90, 0, VirtAddr::new(irq_handler90 as usize));
- set_intr_gate(91, 0, VirtAddr::new(irq_handler91 as usize));
- set_intr_gate(92, 0, VirtAddr::new(irq_handler92 as usize));
- set_intr_gate(93, 0, VirtAddr::new(irq_handler93 as usize));
- set_intr_gate(94, 0, VirtAddr::new(irq_handler94 as usize));
- set_intr_gate(95, 0, VirtAddr::new(irq_handler95 as usize));
- set_intr_gate(96, 0, VirtAddr::new(irq_handler96 as usize));
- set_intr_gate(97, 0, VirtAddr::new(irq_handler97 as usize));
- set_intr_gate(98, 0, VirtAddr::new(irq_handler98 as usize));
- set_intr_gate(99, 0, VirtAddr::new(irq_handler99 as usize));
- set_intr_gate(100, 0, VirtAddr::new(irq_handler100 as usize));
- set_intr_gate(101, 0, VirtAddr::new(irq_handler101 as usize));
- set_intr_gate(102, 0, VirtAddr::new(irq_handler102 as usize));
- set_intr_gate(103, 0, VirtAddr::new(irq_handler103 as usize));
- set_intr_gate(104, 0, VirtAddr::new(irq_handler104 as usize));
- set_intr_gate(105, 0, VirtAddr::new(irq_handler105 as usize));
- set_intr_gate(106, 0, VirtAddr::new(irq_handler106 as usize));
- set_intr_gate(107, 0, VirtAddr::new(irq_handler107 as usize));
- set_intr_gate(108, 0, VirtAddr::new(irq_handler108 as usize));
- set_intr_gate(109, 0, VirtAddr::new(irq_handler109 as usize));
- set_intr_gate(110, 0, VirtAddr::new(irq_handler110 as usize));
- set_intr_gate(111, 0, VirtAddr::new(irq_handler111 as usize));
- set_intr_gate(112, 0, VirtAddr::new(irq_handler112 as usize));
- set_intr_gate(113, 0, VirtAddr::new(irq_handler113 as usize));
- set_intr_gate(114, 0, VirtAddr::new(irq_handler114 as usize));
- set_intr_gate(115, 0, VirtAddr::new(irq_handler115 as usize));
- set_intr_gate(116, 0, VirtAddr::new(irq_handler116 as usize));
- set_intr_gate(117, 0, VirtAddr::new(irq_handler117 as usize));
- set_intr_gate(118, 0, VirtAddr::new(irq_handler118 as usize));
- set_intr_gate(119, 0, VirtAddr::new(irq_handler119 as usize));
- set_intr_gate(120, 0, VirtAddr::new(irq_handler120 as usize));
- set_intr_gate(121, 0, VirtAddr::new(irq_handler121 as usize));
- set_intr_gate(122, 0, VirtAddr::new(irq_handler122 as usize));
- set_intr_gate(123, 0, VirtAddr::new(irq_handler123 as usize));
- set_intr_gate(124, 0, VirtAddr::new(irq_handler124 as usize));
- set_intr_gate(125, 0, VirtAddr::new(irq_handler125 as usize));
- set_intr_gate(126, 0, VirtAddr::new(irq_handler126 as usize));
- set_intr_gate(127, 0, VirtAddr::new(irq_handler127 as usize));
- set_intr_gate(129, 0, VirtAddr::new(irq_handler129 as usize));
- set_intr_gate(130, 0, VirtAddr::new(irq_handler130 as usize));
- set_intr_gate(131, 0, VirtAddr::new(irq_handler131 as usize));
- set_intr_gate(132, 0, VirtAddr::new(irq_handler132 as usize));
- set_intr_gate(133, 0, VirtAddr::new(irq_handler133 as usize));
- set_intr_gate(134, 0, VirtAddr::new(irq_handler134 as usize));
- set_intr_gate(135, 0, VirtAddr::new(irq_handler135 as usize));
- set_intr_gate(136, 0, VirtAddr::new(irq_handler136 as usize));
- set_intr_gate(137, 0, VirtAddr::new(irq_handler137 as usize));
- set_intr_gate(138, 0, VirtAddr::new(irq_handler138 as usize));
- set_intr_gate(139, 0, VirtAddr::new(irq_handler139 as usize));
- set_intr_gate(140, 0, VirtAddr::new(irq_handler140 as usize));
- set_intr_gate(141, 0, VirtAddr::new(irq_handler141 as usize));
- set_intr_gate(142, 0, VirtAddr::new(irq_handler142 as usize));
- set_intr_gate(143, 0, VirtAddr::new(irq_handler143 as usize));
- set_intr_gate(144, 0, VirtAddr::new(irq_handler144 as usize));
- set_intr_gate(145, 0, VirtAddr::new(irq_handler145 as usize));
- set_intr_gate(146, 0, VirtAddr::new(irq_handler146 as usize));
- set_intr_gate(147, 0, VirtAddr::new(irq_handler147 as usize));
- set_intr_gate(148, 0, VirtAddr::new(irq_handler148 as usize));
- set_intr_gate(149, 0, VirtAddr::new(irq_handler149 as usize));
- set_intr_gate(150, 0, VirtAddr::new(irq_handler150 as usize));
- set_intr_gate(151, 0, VirtAddr::new(irq_handler151 as usize));
- set_intr_gate(152, 0, VirtAddr::new(irq_handler152 as usize));
- set_intr_gate(153, 0, VirtAddr::new(irq_handler153 as usize));
- set_intr_gate(154, 0, VirtAddr::new(irq_handler154 as usize));
- set_intr_gate(155, 0, VirtAddr::new(irq_handler155 as usize));
- set_intr_gate(156, 0, VirtAddr::new(irq_handler156 as usize));
- set_intr_gate(157, 0, VirtAddr::new(irq_handler157 as usize));
- set_intr_gate(158, 0, VirtAddr::new(irq_handler158 as usize));
- set_intr_gate(159, 0, VirtAddr::new(irq_handler159 as usize));
- set_intr_gate(160, 0, VirtAddr::new(irq_handler160 as usize));
- set_intr_gate(161, 0, VirtAddr::new(irq_handler161 as usize));
- set_intr_gate(162, 0, VirtAddr::new(irq_handler162 as usize));
- set_intr_gate(163, 0, VirtAddr::new(irq_handler163 as usize));
- set_intr_gate(164, 0, VirtAddr::new(irq_handler164 as usize));
- set_intr_gate(165, 0, VirtAddr::new(irq_handler165 as usize));
- set_intr_gate(166, 0, VirtAddr::new(irq_handler166 as usize));
- set_intr_gate(167, 0, VirtAddr::new(irq_handler167 as usize));
- set_intr_gate(168, 0, VirtAddr::new(irq_handler168 as usize));
- set_intr_gate(169, 0, VirtAddr::new(irq_handler169 as usize));
- set_intr_gate(170, 0, VirtAddr::new(irq_handler170 as usize));
- set_intr_gate(171, 0, VirtAddr::new(irq_handler171 as usize));
- set_intr_gate(172, 0, VirtAddr::new(irq_handler172 as usize));
- set_intr_gate(173, 0, VirtAddr::new(irq_handler173 as usize));
- set_intr_gate(174, 0, VirtAddr::new(irq_handler174 as usize));
- set_intr_gate(175, 0, VirtAddr::new(irq_handler175 as usize));
- set_intr_gate(176, 0, VirtAddr::new(irq_handler176 as usize));
- set_intr_gate(177, 0, VirtAddr::new(irq_handler177 as usize));
- set_intr_gate(178, 0, VirtAddr::new(irq_handler178 as usize));
- set_intr_gate(179, 0, VirtAddr::new(irq_handler179 as usize));
- set_intr_gate(180, 0, VirtAddr::new(irq_handler180 as usize));
- set_intr_gate(181, 0, VirtAddr::new(irq_handler181 as usize));
- set_intr_gate(182, 0, VirtAddr::new(irq_handler182 as usize));
- set_intr_gate(183, 0, VirtAddr::new(irq_handler183 as usize));
- set_intr_gate(184, 0, VirtAddr::new(irq_handler184 as usize));
- set_intr_gate(185, 0, VirtAddr::new(irq_handler185 as usize));
- set_intr_gate(186, 0, VirtAddr::new(irq_handler186 as usize));
- set_intr_gate(187, 0, VirtAddr::new(irq_handler187 as usize));
- set_intr_gate(188, 0, VirtAddr::new(irq_handler188 as usize));
- set_intr_gate(189, 0, VirtAddr::new(irq_handler189 as usize));
- set_intr_gate(190, 0, VirtAddr::new(irq_handler190 as usize));
- set_intr_gate(191, 0, VirtAddr::new(irq_handler191 as usize));
- set_intr_gate(192, 0, VirtAddr::new(irq_handler192 as usize));
- set_intr_gate(193, 0, VirtAddr::new(irq_handler193 as usize));
- set_intr_gate(194, 0, VirtAddr::new(irq_handler194 as usize));
- set_intr_gate(195, 0, VirtAddr::new(irq_handler195 as usize));
- set_intr_gate(196, 0, VirtAddr::new(irq_handler196 as usize));
- set_intr_gate(197, 0, VirtAddr::new(irq_handler197 as usize));
- set_intr_gate(198, 0, VirtAddr::new(irq_handler198 as usize));
- set_intr_gate(199, 0, VirtAddr::new(irq_handler199 as usize));
- set_intr_gate(200, 0, VirtAddr::new(irq_handler200 as usize));
- set_intr_gate(201, 0, VirtAddr::new(irq_handler201 as usize));
- set_intr_gate(202, 0, VirtAddr::new(irq_handler202 as usize));
- set_intr_gate(203, 0, VirtAddr::new(irq_handler203 as usize));
- set_intr_gate(204, 0, VirtAddr::new(irq_handler204 as usize));
- set_intr_gate(205, 0, VirtAddr::new(irq_handler205 as usize));
- set_intr_gate(206, 0, VirtAddr::new(irq_handler206 as usize));
- set_intr_gate(207, 0, VirtAddr::new(irq_handler207 as usize));
- set_intr_gate(208, 0, VirtAddr::new(irq_handler208 as usize));
- set_intr_gate(209, 0, VirtAddr::new(irq_handler209 as usize));
- set_intr_gate(210, 0, VirtAddr::new(irq_handler210 as usize));
- set_intr_gate(211, 0, VirtAddr::new(irq_handler211 as usize));
- set_intr_gate(212, 0, VirtAddr::new(irq_handler212 as usize));
- set_intr_gate(213, 0, VirtAddr::new(irq_handler213 as usize));
- set_intr_gate(214, 0, VirtAddr::new(irq_handler214 as usize));
- set_intr_gate(215, 0, VirtAddr::new(irq_handler215 as usize));
- set_intr_gate(216, 0, VirtAddr::new(irq_handler216 as usize));
- set_intr_gate(217, 0, VirtAddr::new(irq_handler217 as usize));
- set_intr_gate(218, 0, VirtAddr::new(irq_handler218 as usize));
- set_intr_gate(219, 0, VirtAddr::new(irq_handler219 as usize));
- set_intr_gate(220, 0, VirtAddr::new(irq_handler220 as usize));
- set_intr_gate(221, 0, VirtAddr::new(irq_handler221 as usize));
- set_intr_gate(222, 0, VirtAddr::new(irq_handler222 as usize));
- set_intr_gate(223, 0, VirtAddr::new(irq_handler223 as usize));
- set_intr_gate(224, 0, VirtAddr::new(irq_handler224 as usize));
- set_intr_gate(225, 0, VirtAddr::new(irq_handler225 as usize));
- set_intr_gate(226, 0, VirtAddr::new(irq_handler226 as usize));
- set_intr_gate(227, 0, VirtAddr::new(irq_handler227 as usize));
- set_intr_gate(228, 0, VirtAddr::new(irq_handler228 as usize));
- set_intr_gate(229, 0, VirtAddr::new(irq_handler229 as usize));
- set_intr_gate(230, 0, VirtAddr::new(irq_handler230 as usize));
- set_intr_gate(231, 0, VirtAddr::new(irq_handler231 as usize));
- set_intr_gate(232, 0, VirtAddr::new(irq_handler232 as usize));
- set_intr_gate(233, 0, VirtAddr::new(irq_handler233 as usize));
- set_intr_gate(234, 0, VirtAddr::new(irq_handler234 as usize));
- set_intr_gate(235, 0, VirtAddr::new(irq_handler235 as usize));
- set_intr_gate(236, 0, VirtAddr::new(irq_handler236 as usize));
- set_intr_gate(237, 0, VirtAddr::new(irq_handler237 as usize));
- set_intr_gate(238, 0, VirtAddr::new(irq_handler238 as usize));
- set_intr_gate(239, 0, VirtAddr::new(irq_handler239 as usize));
- set_intr_gate(240, 0, VirtAddr::new(irq_handler240 as usize));
- set_intr_gate(241, 0, VirtAddr::new(irq_handler241 as usize));
- set_intr_gate(242, 0, VirtAddr::new(irq_handler242 as usize));
- set_intr_gate(243, 0, VirtAddr::new(irq_handler243 as usize));
- set_intr_gate(244, 0, VirtAddr::new(irq_handler244 as usize));
- set_intr_gate(245, 0, VirtAddr::new(irq_handler245 as usize));
- set_intr_gate(246, 0, VirtAddr::new(irq_handler246 as usize));
- set_intr_gate(247, 0, VirtAddr::new(irq_handler247 as usize));
- set_intr_gate(248, 0, VirtAddr::new(irq_handler248 as usize));
- set_intr_gate(249, 0, VirtAddr::new(irq_handler249 as usize));
- set_intr_gate(250, 0, VirtAddr::new(irq_handler250 as usize));
- set_intr_gate(251, 0, VirtAddr::new(irq_handler251 as usize));
- set_intr_gate(252, 0, VirtAddr::new(irq_handler252 as usize));
- set_intr_gate(253, 0, VirtAddr::new(irq_handler253 as usize));
- set_intr_gate(254, 0, VirtAddr::new(irq_handler254 as usize));
- set_intr_gate(255, 0, VirtAddr::new(irq_handler255 as usize));
- }
- /// 设置中断门(DPL=0)
- #[allow(dead_code)]
- pub unsafe fn set_intr_gate(irq: u32, ist: u8, vaddr: VirtAddr) {
- let idt_entry = get_idt_entry(irq);
- set_gate(idt_entry, 0x8E, ist, vaddr);
- }
- /// 设置陷阱门(DPL=0)
- #[allow(dead_code)]
- pub unsafe fn set_trap_gate(irq: u32, ist: u8, vaddr: VirtAddr) {
- let idt_entry = get_idt_entry(irq);
- set_gate(idt_entry, 0x8F, ist, vaddr);
- }
- /// 设置系统调用门(DPL=3)
- #[allow(dead_code)]
- pub unsafe fn set_system_trap_gate(irq: u32, ist: u8, vaddr: VirtAddr) {
- let idt_entry = get_idt_entry(irq);
- set_gate(idt_entry, 0xEF, ist, vaddr);
- }
- #[allow(static_mut_refs)]
- unsafe fn get_idt_entry(irq: u32) -> &'static mut [u64] {
- assert!(irq < 256);
- let mut idt_vaddr =
- MMArch::phys_2_virt(PhysAddr::new(&IDT_Table as *const usize as usize)).unwrap();
- idt_vaddr += irq as usize * 16;
- let idt_entry = core::slice::from_raw_parts_mut(idt_vaddr.data() as *mut u64, 2);
- idt_entry
- }
- unsafe fn set_gate(gate: &mut [u64], attr: u8, ist: u8, handler: VirtAddr) {
- assert_eq!(gate.len(), 2);
- let mut d0: u64 = 0;
- let mut d1: u64 = 0;
- // 设置P、DPL、GateType
- d0 |= (attr as u64) << 40;
- // 设置IST
- d0 |= ((ist & 0x7) as u64) << 32;
- // 设置段选择子为0x10 ????
- d0 |= 0x8 << 16;
- let mut handler = handler.data() as u64;
- // 设置偏移地址[0:15]
- d0 |= handler & 0xFFFF;
- // 设置偏移地址[16:31]
- handler >>= 16;
- d0 |= (0xffff & handler) << 48;
- // 设置偏移地址[32:63]
- handler >>= 16;
- d1 |= handler & 0xFFFFFFFF;
- gate[0] = d0;
- gate[1] = d1;
- }
|