From cddf7664912b43b54e034ca33cbfb269c597a9c5 Mon Sep 17 00:00:00 2001 From: Andrew Walbran Date: Thu, 6 Apr 2023 15:55:29 +0100 Subject: [PATCH] WFI --- src/exercises/bare-metal/rtc/src/gicv3.rs | 8 ++++++++ src/exercises/bare-metal/rtc/src/main.rs | 4 ++-- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/src/exercises/bare-metal/rtc/src/gicv3.rs b/src/exercises/bare-metal/rtc/src/gicv3.rs index 366d6320..f773c64f 100644 --- a/src/exercises/bare-metal/rtc/src/gicv3.rs +++ b/src/exercises/bare-metal/rtc/src/gicv3.rs @@ -553,3 +553,11 @@ pub fn irq_enable() { asm!("msr DAIFClr, #0xf", options(nomem, nostack)); } } + +/// Waits for an interrupt. +pub fn wfi() { + // Safe because this doesn't access memory in any way. + unsafe { + asm!("wfi", options(nomem, nostack)); + } +} diff --git a/src/exercises/bare-metal/rtc/src/main.rs b/src/exercises/bare-metal/rtc/src/main.rs index 0049f3ba..a45fe9aa 100644 --- a/src/exercises/bare-metal/rtc/src/main.rs +++ b/src/exercises/bare-metal/rtc/src/main.rs @@ -23,7 +23,7 @@ mod pl011; // ANCHOR_END: top mod pl031; -use crate::gicv3::{irq_enable, GicV3, Trigger, SPI_START}; +use crate::gicv3::{irq_enable, wfi, GicV3, Trigger, SPI_START}; use crate::pl031::Rtc; use chrono::{TimeZone, Utc}; use core::hint::spin_loop; @@ -113,7 +113,7 @@ extern "C" fn main(x0: u64, x1: u64, x2: u64, x3: u64) { rtc.interrupt_pending() ); while !rtc.interrupt_pending() { - spin_loop(); + wfi(); } trace!( "matched={}, interrupt_pending={}",