// NEW modeled adapter method, inserted into the exact frozen Device fixture. // It calls real Table.reap before successful binding release and can expose // controlled hardware context drift after the actual resources are returned. fn release(&mut self, p: Self::Binding) -> Result<(), (Error, Self::Binding)> { if self.inner.hardware.borrow().release_fail { return Err((Error::Backend, p)); } if self.inner.table.borrow_mut().reap(p.id).is_err() { return Err((Error::Backend, p)); } let id = p.id; let result = self.inner.release(p); if result.is_ok() { match self.cpu.borrow().release_drift { 1 => self.inner.hardware.borrow_mut().cpu = 1, 2 => self.inner.hardware.borrow_mut().daif = 0, 3 => self.inner.hardware.borrow_mut().current = Some(id), 4 => self.root.set(0xdead_0000), 5 => self.inner.hardware.borrow_mut().sp += 16, 6 => self.inner.hardware.borrow_mut().fp = false, 7 => self.inner.hardware.borrow_mut().critical = 1, 8 => self.inner.hardware.borrow_mut().safe = false, 9 => self.inner.hardware.borrow_mut().in_irq = true, _ => {} } } result }