From 4e0a9fe3199e15ce39cbd45c1bff3862a4cc3d70 Mon Sep 17 00:00:00 2001 From: Kun Qin Date: Fri, 18 Jul 2025 17:12:00 -0700 Subject: [PATCH 1/2] initial change --- src/gicv3.rs | 28 +++++++++++++++++++++------- 1 file changed, 21 insertions(+), 7 deletions(-) diff --git a/src/gicv3.rs b/src/gicv3.rs index f440890..3319bd1 100644 --- a/src/gicv3.rs +++ b/src/gicv3.rs @@ -162,8 +162,14 @@ impl GicV3<'_> { } } // Put all SPIs into non-secure group 1. - for i in 1..32 { - field!(self.gicd, igroupr).get(i).unwrap().write(0xffffffff); + let max_reg = self.typer().num_spis() as usize + 32; + for i in (32..max_reg).step_by(32) { + let bits = if max_reg - i >= 32 { + 0xffffffff + } else { + (1 << (max_reg - i)) - 1 + }; + field!(self.gicd, igroupr).get(i).unwrap().write(bits); } // Enable group 1 for the current security state. @@ -203,17 +209,25 @@ impl GicV3<'_> { /// Enables or disables all interrupts on all CPU cores. pub fn enable_all_interrupts(&mut self, enable: bool) { - for i in 1..32 { + // Calculate the maximum register index for all indices. + // The first 32 registers are for SGIs and PPIs. + let max_reg = self.typer().num_spis() as usize + 32; + for i in (32..max_reg).step_by(32) { + let bits = if max_reg - i >= 32 { + 0xffffffff + } else { + (1 << (max_reg - i)) - 1 + }; if enable { field!(self.gicd, isenabler) - .get(i) + .get(i / 32) .unwrap() - .write(0xffffffff); + .write(bits); } else { field!(self.gicd, icenabler) - .get(i) + .get(i / 32) .unwrap() - .write(0xffffffff); + .write(bits); } } for cpu in 0..self.cpu_count { From 7afdf73075c9d9a7c4360043fc8206aacbea6c2d Mon Sep 17 00:00:00 2001 From: Kun Qin Date: Mon, 21 Jul 2025 09:05:28 -0700 Subject: [PATCH 2/2] fixing a mis --- src/gicv3.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/gicv3.rs b/src/gicv3.rs index 3319bd1..7fd45ea 100644 --- a/src/gicv3.rs +++ b/src/gicv3.rs @@ -169,7 +169,7 @@ impl GicV3<'_> { } else { (1 << (max_reg - i)) - 1 }; - field!(self.gicd, igroupr).get(i).unwrap().write(bits); + field!(self.gicd, igroupr).get(i / 32).unwrap().write(bits); } // Enable group 1 for the current security state.