Skip to content

Commit

Permalink
Merge branch 'main' of github.com:betrusted-io/xous-core into main
Browse files Browse the repository at this point in the history
  • Loading branch information
bunnie committed Dec 24, 2023
2 parents 65310d4 + dbc13e7 commit 2b521a7
Show file tree
Hide file tree
Showing 2 changed files with 25 additions and 21 deletions.
10 changes: 7 additions & 3 deletions emulation/peripherals/BetrustedWatchdog.cs
Original file line number Diff line number Diff line change
Expand Up @@ -52,10 +52,13 @@ public BetrustedWatchdog(Machine machine) : base(machine)
private void OnTick()
{
Interlocked.Increment(ref counter);
if (((uint)counter) >= this.reset_target)
if ((((uint)counter) >= reset_target) && RebootOnExpiry)
{
this.Log(LogLevel.Error, "Watchdog timer expired -- requesting system reset");
this.machine.RequestReset();
machine.RequestReset();
} else if (((uint)counter) == reset_target)
{
this.Log(LogLevel.Error, "Watchdog timer expired -- not rebooting because RebootOnExpiry is false");
}
}

Expand All @@ -79,7 +82,7 @@ public override void Reset()
// Convert "approximately 65MHz" ticks to milliseconds
private uint XilinxClockToMs(ulong xilinx_clocks)
{
uint adjusted = (uint)((xilinx_clocks * 100) / 65000000);
uint adjusted = (uint)(xilinx_clocks * 100 / 65000000);
this.Log(LogLevel.Debug, "Watchdog timer set for {0}. Will expire after {1} msec", xilinx_clocks, adjusted * 10);
return adjusted;
}
Expand All @@ -96,6 +99,7 @@ public long Size
private uint reset_target;
private bool enabled;
private readonly DoubleWordRegisterCollection registers;
public bool RebootOnExpiry = true;
private enum Registers
{
Watchdog = 0x0,
Expand Down
36 changes: 18 additions & 18 deletions kernel/src/arch/riscv/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -6,28 +6,28 @@ use riscv::register::{satp, sie, sstatus};
pub mod exception;
pub mod irq;
pub mod mem;
pub mod panic;
pub mod process;
pub mod syscall;
pub mod panic;

pub use process::Thread;

#[cfg(any(feature="precursor", feature="renode"))]
use utralib::generated::*;
#[cfg(any(feature="precursor", feature="renode"))]
use xous_kernel::{MemoryFlags, MemoryType, PID};
#[cfg(any(feature="precursor", feature="renode"))]
#[cfg(any(feature = "precursor", feature = "renode"))]
use crate::mem::MemoryManager;
#[cfg(any(feature="cramium-soc", feature="cramium-fpga"))]
#[cfg(any(feature = "precursor", feature = "renode"))]
use utralib::generated::*;
#[cfg(any(feature = "cramium-soc", feature = "cramium-fpga"))]
use xous_kernel::PID;
#[cfg(any(feature = "precursor", feature = "renode"))]
use xous_kernel::{MemoryFlags, MemoryType, PID};

#[cfg(any(feature="precursor", feature="renode"))]
#[cfg(any(feature = "precursor", feature = "renode"))]
pub const WFI_KERNEL: Wfi = Wfi {
// the manually chosen virtual address has to be in the top 4MiB as it is the only page shared among all processes
base: 0xffcd_0000 as *mut usize, // see https://github.com/betrusted-io/xous-core/blob/master/docs/memory.md
};

#[cfg(any(feature="precursor", feature="renode"))]
#[cfg(any(feature = "precursor", feature = "renode"))]
pub struct Wfi {
pub base: *mut usize,
}
Expand All @@ -37,7 +37,7 @@ pub fn current_pid() -> PID {
}

pub fn init() {
#[cfg(any(feature="precursor", feature="renode"))]
#[cfg(any(feature = "precursor", feature = "renode"))]
MemoryManager::with_mut(|memory_manager| {
memory_manager
.map_range(
Expand All @@ -50,9 +50,9 @@ pub fn init() {
)
.expect("unable to map WFI")
});
#[cfg(any(feature="precursor", feature="renode"))]
#[cfg(any(feature = "precursor", feature = "renode"))]
let mut wfi_kernel_csr = CSR::new(WFI_KERNEL.base as *mut u32);
#[cfg(any(feature="precursor", feature="renode"))]
#[cfg(any(feature = "precursor", feature = "renode"))]
wfi_kernel_csr.wfo(utra::wfi::IGNORE_LOCKED_IGNORE_LOCKED, 1);

unsafe {
Expand All @@ -64,17 +64,17 @@ pub fn init() {
/// Put the core to sleep until an interrupt hits. Returns `true`
/// to indicate the kernel should not exit.
pub fn idle() -> bool {
#[cfg(any(feature="precursor", feature="renode"))]
let mut wfi_kernel_csr = CSR::new(WFI_KERNEL.base as *mut u32);

// Issue `wfi`. This will return as soon as an external interrupt
// is available.
#[cfg(any(feature="cramium-fpga", feature="cramium-soc"))]
#[cfg(any(feature = "cramium-fpga", feature = "cramium-soc", feature = "renode"))]
// "traditional" path for stopping a clock
unsafe { riscv::asm::wfi() };
unsafe {
riscv::asm::wfi()
};

#[cfg(any(feature="precursor", feature="renode"))]
#[cfg(any(feature = "precursor"))]
{
let mut wfi_kernel_csr = CSR::new(WFI_KERNEL.base as *mut u32);
// this invokes Precusor-SoC specific path to gate clocks:
// 1. ignore_locked prevents the chip from going into reset if the PLL goes unlocked
wfi_kernel_csr.wfo(utra::wfi::IGNORE_LOCKED_IGNORE_LOCKED, 1);
Expand Down

0 comments on commit 2b521a7

Please sign in to comment.