11use crate :: {
22 sdt:: { ExtendedField , SdtHeader , Signature } ,
3+ AcpiError ,
34 AcpiTable ,
45} ;
56use bit_field:: BitField ;
@@ -21,6 +22,7 @@ pub enum MadtError {
2122 InvalidLocalNmiLine ,
2223 MpsIntiInvalidPolarity ,
2324 MpsIntiInvalidTriggerMode ,
25+ WakeupApsTimeout ,
2426}
2527
2628/// Represents the MADT - this contains the MADT header fields. You can then iterate over a `Madt`
@@ -49,6 +51,18 @@ unsafe impl AcpiTable for Madt {
4951}
5052
5153impl Madt {
54+ pub fn get_mpwk_mailbox_addr ( & self ) -> Result < u64 , AcpiError > {
55+ for entry in self . entries ( ) {
56+ match entry {
57+ MadtEntry :: MultiprocessorWakeup ( entry) => {
58+ return Ok ( entry. mailbox_address ) ;
59+ }
60+ _ => { }
61+ }
62+ }
63+ Err ( AcpiError :: InvalidMadt ( MadtError :: UnexpectedEntry ) )
64+ }
65+
5266 #[ cfg( feature = "allocator_api" ) ]
5367 pub fn parse_interrupt_model_in < ' a , A > (
5468 & self ,
@@ -102,21 +116,18 @@ impl Madt {
102116 where
103117 A : core:: alloc:: Allocator + Clone ,
104118 {
105- use crate :: {
106- platform:: {
107- interrupt:: {
108- Apic ,
109- InterruptSourceOverride ,
110- IoApic ,
111- LocalInterruptLine ,
112- NmiLine ,
113- NmiProcessor ,
114- NmiSource ,
115- } ,
116- Processor ,
117- ProcessorState ,
119+ use crate :: platform:: {
120+ interrupt:: {
121+ Apic ,
122+ InterruptSourceOverride ,
123+ IoApic ,
124+ LocalInterruptLine ,
125+ NmiLine ,
126+ NmiProcessor ,
127+ NmiSource ,
118128 } ,
119- AcpiError ,
129+ Processor ,
130+ ProcessorState ,
120131 } ;
121132
122133 let mut local_apic_address = self . local_apic_address as u64 ;
@@ -630,6 +641,36 @@ pub struct MultiprocessorWakeupEntry {
630641 pub mailbox_address : u64 ,
631642}
632643
644+ #[ derive( Debug , PartialEq , Eq ) ]
645+ pub enum MpProtectedModeWakeupCommand {
646+ Noop = 0 ,
647+ Wakeup = 1 ,
648+ Sleep = 2 ,
649+ AcceptPages = 3 ,
650+ }
651+
652+ impl From < u16 > for MpProtectedModeWakeupCommand {
653+ fn from ( value : u16 ) -> Self {
654+ match value {
655+ 0 => MpProtectedModeWakeupCommand :: Noop ,
656+ 1 => MpProtectedModeWakeupCommand :: Wakeup ,
657+ 2 => MpProtectedModeWakeupCommand :: Sleep ,
658+ 3 => MpProtectedModeWakeupCommand :: AcceptPages ,
659+ _ => panic ! ( "Invalid value for MpProtectedModeWakeupCommand" ) ,
660+ }
661+ }
662+ }
663+
664+ #[ repr( C ) ]
665+ pub struct MultiprocessorWakeupMailbox {
666+ pub command : u16 ,
667+ _reserved : u16 ,
668+ pub apic_id : u32 ,
669+ pub wakeup_vector : u64 ,
670+ pub reserved_for_os : [ u64 ; 254 ] ,
671+ reserved_for_firmware : [ u64 ; 256 ] ,
672+ }
673+
633674#[ cfg( feature = "allocator_api" ) ]
634675fn parse_mps_inti_flags ( flags : u16 ) -> crate :: AcpiResult < ( Polarity , TriggerMode ) > {
635676 let polarity = match flags. get_bits ( 0 ..2 ) {
0 commit comments