aboutsummaryrefslogtreecommitdiff
path: root/src/arch
diff options
context:
space:
mode:
Diffstat (limited to 'src/arch')
-rw-r--r--src/arch/x86_64/interrupt/mod.rs23
-rw-r--r--src/arch/x86_64/interrupt/pic_8259.rs46
-rw-r--r--src/arch/x86_64/interrupt/pit.rs (renamed from src/arch/x86_64/pit.rs)0
-rw-r--r--src/arch/x86_64/mod.rs4
-rw-r--r--src/arch/x86_64/pic.rs1
-rw-r--r--src/arch/x86_64/plugbox.rs1
6 files changed, 70 insertions, 5 deletions
diff --git a/src/arch/x86_64/interrupt/mod.rs b/src/arch/x86_64/interrupt/mod.rs
new file mode 100644
index 0000000..3a617e8
--- /dev/null
+++ b/src/arch/x86_64/interrupt/mod.rs
@@ -0,0 +1,23 @@
+pub mod pic_8259;
+pub mod pit;
+use crate::io::*;
+use core::arch::asm;
+
+#[no_mangle]
+extern "C" fn guardian(slot: u16) {
+ println!("interrupt received {:x}", slot);
+}
+
+#[inline(always)]
+pub fn interrupt_enable() {
+ unsafe {
+ asm!("sti");
+ }
+}
+
+#[inline(always)]
+pub fn interrupt_disable() {
+ unsafe {
+ asm!("cli");
+ }
+}
diff --git a/src/arch/x86_64/interrupt/pic_8259.rs b/src/arch/x86_64/interrupt/pic_8259.rs
new file mode 100644
index 0000000..43a102c
--- /dev/null
+++ b/src/arch/x86_64/interrupt/pic_8259.rs
@@ -0,0 +1,46 @@
+// For now, the PIC is stateless, i.e. we don'e need a struct for it.
+// Perhaps I need a Mutex handle later...
+use crate::arch::x86_64::io_port::*;
+
+const IMR1: u16 = 0x21;
+const IMR2: u16 = 0xa1;
+const CTRL1: u16 = 0x20;
+const CTRL2: u16 = 0xa0;
+
+pub struct PicDeviceInt;
+impl PicDeviceInt {
+ pub const TIMER: u8 = 0;
+ pub const KEYBOARD: u8 = 1;
+}
+
+// 8-bit registers IMR1 and IMR2 registers hold interrupt masking bit 0~7 and
+// 8~15; if an interrupt is masked(set 1) on the respective bit, it's disabled
+pub fn allow(interrupt: u8) {
+ if interrupt < 8 {
+ let old = inb(IMR1);
+ outb(IMR1, old & !(1 << interrupt));
+ } else {
+ let old = inb(IMR2);
+ outb(IMR2, old & !(1 << (interrupt - 8)));
+ }
+}
+
+pub fn forbid(interrupt: u8) {
+ if interrupt < 8 {
+ let old = inb(IMR1);
+ outb(IMR1, old | (1 << interrupt));
+ } else {
+ let old = inb(IMR2);
+ outb(IMR2, old | (1 << (interrupt - 8)));
+ }
+}
+
+pub fn is_masked(interrupt: u8) -> bool {
+ if interrupt < 8 {
+ let val = inb(IMR1);
+ return val & (interrupt) != 0;
+ } else {
+ let val = inb(IMR2);
+ return val & (interrupt - 8) != 0;
+ }
+}
diff --git a/src/arch/x86_64/pit.rs b/src/arch/x86_64/interrupt/pit.rs
index 8b13789..8b13789 100644
--- a/src/arch/x86_64/pit.rs
+++ b/src/arch/x86_64/interrupt/pit.rs
diff --git a/src/arch/x86_64/mod.rs b/src/arch/x86_64/mod.rs
index a7f9e89..9429c8f 100644
--- a/src/arch/x86_64/mod.rs
+++ b/src/arch/x86_64/mod.rs
@@ -1,6 +1,4 @@
pub mod cpu;
+pub mod interrupt;
pub mod io_port;
pub mod misc;
-pub mod pic;
-pub mod pit;
-pub mod plugbox;
diff --git a/src/arch/x86_64/pic.rs b/src/arch/x86_64/pic.rs
deleted file mode 100644
index 8b13789..0000000
--- a/src/arch/x86_64/pic.rs
+++ /dev/null
@@ -1 +0,0 @@
-
diff --git a/src/arch/x86_64/plugbox.rs b/src/arch/x86_64/plugbox.rs
deleted file mode 100644
index 8b13789..0000000
--- a/src/arch/x86_64/plugbox.rs
+++ /dev/null
@@ -1 +0,0 @@
-