Remove stable #![feature] and most x86_64 static mut.
This commit is contained in:
@@ -1,4 +1,4 @@
|
||||
use core::{fmt, ptr};
|
||||
use core::{cell::SyncUnsafeCell, fmt, ptr};
|
||||
|
||||
use alloc::vec::Vec;
|
||||
use spin::Mutex;
|
||||
@@ -83,6 +83,8 @@ pub struct IoApic {
|
||||
gsi_start: u32,
|
||||
count: u8,
|
||||
}
|
||||
unsafe impl Send for IoApic {}
|
||||
unsafe impl Sync for IoApic {}
|
||||
impl IoApic {
|
||||
#[allow(dead_code)]
|
||||
pub fn new(regs_base: *const u32, gsi_start: u32) -> Self {
|
||||
@@ -217,16 +219,20 @@ pub struct Override {
|
||||
|
||||
// static mut because only the AP initializes the I/O Apic, and when that is done, it's solely
|
||||
// accessed immutably.
|
||||
static mut IOAPICS: Option<Vec<IoApic>> = None;
|
||||
static IOAPICS: SyncUnsafeCell<Option<Vec<IoApic>>> = SyncUnsafeCell::new(None);
|
||||
|
||||
// static mut for the same reason as above
|
||||
static mut SRC_OVERRIDES: Option<Vec<Override>> = None;
|
||||
static SRC_OVERRIDES: SyncUnsafeCell<Option<Vec<Override>>> = SyncUnsafeCell::new(None);
|
||||
|
||||
pub fn ioapics() -> &'static [IoApic] {
|
||||
unsafe { IOAPICS.as_ref().map_or(&[], |vector| &vector[..]) }
|
||||
unsafe { &*IOAPICS.get() }
|
||||
.as_ref()
|
||||
.map_or(&[], |vector| &vector[..])
|
||||
}
|
||||
pub fn src_overrides() -> &'static [Override] {
|
||||
unsafe { SRC_OVERRIDES.as_ref().map_or(&[], |vector| &vector[..]) }
|
||||
unsafe { &*SRC_OVERRIDES.get() }
|
||||
.as_ref()
|
||||
.map_or(&[], |vector| &vector[..])
|
||||
}
|
||||
|
||||
#[cfg(feature = "acpi")]
|
||||
@@ -263,7 +269,7 @@ pub unsafe fn handle_ioapic(mapper: &mut KernelMapper, madt_ioapic: &'static Mad
|
||||
"mismatched ACPI MADT I/O APIC ID, and the ID reported by the I/O APIC"
|
||||
);
|
||||
|
||||
IOAPICS.get_or_insert_with(Vec::new).push(ioapic);
|
||||
(*IOAPICS.get()).get_or_insert_with(Vec::new).push(ioapic);
|
||||
}
|
||||
#[cfg(feature = "acpi")]
|
||||
pub unsafe fn handle_src_override(src_override: &'static MadtIntSrcOverride) {
|
||||
@@ -295,7 +301,9 @@ pub unsafe fn handle_src_override(src_override: &'static MadtIntSrcOverride) {
|
||||
polarity,
|
||||
trigger_mode,
|
||||
};
|
||||
SRC_OVERRIDES.get_or_insert_with(Vec::new).push(over);
|
||||
(*SRC_OVERRIDES.get())
|
||||
.get_or_insert_with(Vec::new)
|
||||
.push(over);
|
||||
}
|
||||
|
||||
#[allow(dead_code)]
|
||||
@@ -305,7 +313,7 @@ pub unsafe fn init(active_table: &mut KernelMapper) {
|
||||
// search the madt for all IOAPICs.
|
||||
#[cfg(feature = "acpi")]
|
||||
{
|
||||
let madt: &'static Madt = match madt::MADT.as_ref() {
|
||||
let madt: &'static Madt = match madt::madt() {
|
||||
Some(m) => m,
|
||||
// TODO: Parse MP tables too.
|
||||
None => return,
|
||||
|
||||
@@ -1,43 +1,57 @@
|
||||
use core::cell::SyncUnsafeCell;
|
||||
|
||||
use crate::{
|
||||
arch::interrupt::irq,
|
||||
syscall::io::{Io, Pio},
|
||||
};
|
||||
|
||||
pub static mut MASTER: Pic = Pic::new(0x20);
|
||||
pub static mut SLAVE: Pic = Pic::new(0xA0);
|
||||
static MASTER: SyncUnsafeCell<Pic> = SyncUnsafeCell::new(Pic::new(0x20));
|
||||
static SLAVE: SyncUnsafeCell<Pic> = SyncUnsafeCell::new(Pic::new(0xA0));
|
||||
|
||||
// SAFETY: must be main thread
|
||||
pub unsafe fn master<'a>() -> &'a mut Pic {
|
||||
&mut *MASTER.get()
|
||||
}
|
||||
// SAFETY: must be main thread
|
||||
pub unsafe fn slave<'a>() -> &'a mut Pic {
|
||||
&mut *SLAVE.get()
|
||||
}
|
||||
|
||||
pub unsafe fn init() {
|
||||
let master = master();
|
||||
let slave = slave();
|
||||
|
||||
// Start initialization
|
||||
MASTER.cmd.write(0x11);
|
||||
SLAVE.cmd.write(0x11);
|
||||
master.cmd.write(0x11);
|
||||
slave.cmd.write(0x11);
|
||||
|
||||
// Set offsets
|
||||
MASTER.data.write(0x20);
|
||||
SLAVE.data.write(0x28);
|
||||
master.data.write(0x20);
|
||||
slave.data.write(0x28);
|
||||
|
||||
// Set up cascade
|
||||
MASTER.data.write(4);
|
||||
SLAVE.data.write(2);
|
||||
master.data.write(4);
|
||||
slave.data.write(2);
|
||||
|
||||
// Set up interrupt mode (1 is 8086/88 mode, 2 is auto EOI)
|
||||
MASTER.data.write(1);
|
||||
SLAVE.data.write(1);
|
||||
master.data.write(1);
|
||||
slave.data.write(1);
|
||||
|
||||
// Unmask interrupts
|
||||
MASTER.data.write(0);
|
||||
SLAVE.data.write(0);
|
||||
master.data.write(0);
|
||||
slave.data.write(0);
|
||||
|
||||
// Ack remaining interrupts
|
||||
MASTER.ack();
|
||||
SLAVE.ack();
|
||||
master.ack();
|
||||
slave.ack();
|
||||
|
||||
// probably already set to PIC, but double-check
|
||||
irq::set_irq_method(irq::IrqMethod::Pic);
|
||||
}
|
||||
|
||||
pub unsafe fn disable() {
|
||||
MASTER.data.write(0xFF);
|
||||
SLAVE.data.write(0xFF);
|
||||
master().data.write(0xFF);
|
||||
slave().data.write(0xFF);
|
||||
}
|
||||
|
||||
pub struct Pic {
|
||||
|
||||
@@ -1,9 +1,20 @@
|
||||
use core::cell::SyncUnsafeCell;
|
||||
|
||||
use crate::syscall::io::{Io, Pio};
|
||||
|
||||
pub static mut CHAN0: Pio<u8> = Pio::new(0x40);
|
||||
static CHAN0: SyncUnsafeCell<Pio<u8>> = SyncUnsafeCell::new(Pio::new(0x40));
|
||||
//pub static mut CHAN1: Pio<u8> = Pio::new(0x41);
|
||||
//pub static mut CHAN2: Pio<u8> = Pio::new(0x42);
|
||||
pub static mut COMMAND: Pio<u8> = Pio::new(0x43);
|
||||
static COMMAND: SyncUnsafeCell<Pio<u8>> = SyncUnsafeCell::new(Pio::new(0x43));
|
||||
|
||||
// SAFETY: must be externally syncd
|
||||
pub unsafe fn chan0<'a>() -> &'a mut Pio<u8> {
|
||||
&mut *CHAN0.get()
|
||||
}
|
||||
// SAFETY: must be externally syncd
|
||||
pub unsafe fn command<'a>() -> &'a mut Pio<u8> {
|
||||
&mut *COMMAND.get()
|
||||
}
|
||||
|
||||
const SELECT_CHAN0: u8 = 0b00 << 6;
|
||||
const ACCESS_LATCH: u8 = 0b00 << 4;
|
||||
@@ -20,15 +31,15 @@ pub const CHAN0_DIVISOR: u16 = 4847;
|
||||
pub const RATE: u128 = (CHAN0_DIVISOR as u128 * PERIOD_FS) / 1_000_000;
|
||||
|
||||
pub unsafe fn init() {
|
||||
COMMAND.write(SELECT_CHAN0 | ACCESS_LOHI | MODE_2);
|
||||
CHAN0.write(CHAN0_DIVISOR as u8);
|
||||
CHAN0.write((CHAN0_DIVISOR >> 8) as u8);
|
||||
command().write(SELECT_CHAN0 | ACCESS_LOHI | MODE_2);
|
||||
chan0().write(CHAN0_DIVISOR as u8);
|
||||
chan0().write((CHAN0_DIVISOR >> 8) as u8);
|
||||
}
|
||||
|
||||
pub unsafe fn read() -> u16 {
|
||||
COMMAND.write(SELECT_CHAN0 | ACCESS_LATCH);
|
||||
let low = CHAN0.read();
|
||||
let high = CHAN0.read();
|
||||
command().write(SELECT_CHAN0 | ACCESS_LATCH);
|
||||
let low = chan0().read();
|
||||
let high = chan0().read();
|
||||
let counter = ((high as u16) << 8) | (low as u16);
|
||||
// Counter is inverted, subtract from CHAN0_DIVISOR
|
||||
CHAN0_DIVISOR.saturating_sub(counter)
|
||||
|
||||
Reference in New Issue
Block a user