浏览代码

Address review

Pierre Krieger 5 年之前
父节点
当前提交
4c29c95466
共有 2 个文件被更改,包括 25 次插入6 次删除
  1. 13 1
      acpi/src/interrupt.rs
  2. 12 5
      acpi/src/madt.rs

+ 13 - 1
acpi/src/interrupt.rs

@@ -7,12 +7,24 @@ pub struct IoApic {
     pub global_system_interrupt_base: u32,
 }
 
+#[derive(Debug)]
+pub struct NmiLine {
+    pub processor: NmiProcessor,
+    pub line: LocalInterruptLine,
+}
+
 #[derive(Debug)]
 pub enum LocalInterruptLine {
     Lint0,
     Lint1,
 }
 
+#[derive(Debug)]
+pub enum NmiProcessor {
+    All,
+    ProcessorUid(u8),
+}
+
 #[derive(Debug)]
 pub enum Polarity {
     SameAsBus,
@@ -52,7 +64,7 @@ pub struct NmiSource {
 pub struct Apic {
     pub local_apic_address: u64,
     pub io_apics: Vec<IoApic>,
-    pub local_apic_nmi_lines: Vec<LocalInterruptLine>,
+    pub local_apic_nmi_lines: Vec<NmiLine>,
     pub interrupt_source_overrides: Vec<InterruptSourceOverride>,
     pub nmi_sources: Vec<NmiSource>,
 

+ 12 - 5
acpi/src/madt.rs

@@ -1,5 +1,5 @@
 use crate::{
-    interrupt::{Apic, InterruptModel, InterruptSourceOverride, IoApic, NmiSource, Polarity, TriggerMode},
+    interrupt::{Apic, InterruptModel, InterruptSourceOverride, IoApic, NmiLine, NmiProcessor, NmiSource, Polarity, TriggerMode},
     sdt::SdtHeader,
     Acpi,
     AcpiError,
@@ -477,10 +477,17 @@ fn parse_apic_model(acpi: &mut Acpi, mapping: &PhysicalMapping<Madt>) -> Result<
             }
 
             MadtEntry::LocalApicNmi(ref entry) => {
-                local_apic_nmi_lines.push(match entry.nmi_line {
-                    0 => LocalInterruptLine::Lint0,
-                    1 => LocalInterruptLine::Lint1,
-                    _ => return Err(AcpiError::InvalidMadt(MadtError::InvalidLocalNmiLine)),
+                local_apic_nmi_lines.push(NmiLine {
+                    processor: if entry.processor_id == 0xff {
+                        NmiProcessor::All
+                    } else {
+                        NmiProcessor::ProcessorUid(entry.processor_id)
+                    },
+                    line: match entry.nmi_line {
+                        0 => LocalInterruptLine::Lint0,
+                        1 => LocalInterruptLine::Lint1,
+                        _ => return Err(AcpiError::InvalidMadt(MadtError::InvalidLocalNmiLine)),
+                    },
                 })
             }