blob: fe2fba5a6643cc49a203f8a28500127bd925f816 [file]
// Copyright 2026 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
use bitrs::multilayout;
multilayout!({
#[bitrs(m, rv32)]
pub struct Mstatus32(u32);
#[bitrs(m, rv64)]
pub struct Mstatus64(u64);
#[bitrs(rv32)]
pub struct Sstatus32(u32);
#[bitrs(rv64)]
pub struct Sstatus64(u64);
// SD sits at XLEN-1.
#[rv32]
{
let sd @ 31;
}
#[rv64]
{
let sd @ 63;
}
// RV64 high half. MBE/SBE/SXL are M-mode only; UXL is visible to both.
#[all(m, rv64)]
{
let mbe @ 37;
let sbe @ 36;
let sxl @ 35..34;
}
#[rv64]
{
let uxl @ 33..32;
}
// M-mode-only low-half fields.
#[m]
{
let tsr @ 22;
let tw @ 21;
let tvm @ 20;
let mprv @ 17;
let mpp @ 12..11;
let mpie @ 7;
let mie @ 3;
}
// Shared low-half fields.
{
let mxr @ 19;
let sum @ 18;
let xs @ 16..15;
let fs @ 14..13;
let vs @ 10..9;
let spp @ 8;
let ube @ 6;
let spie @ 5;
let sie @ 1;
}
});
fn main() {
let m32 = *Mstatus32::new().set_sd(true).set_mpp(0b11).set_mxr(true).set_mie(true);
println!("Mstatus32: {m32:#?}");
let m64 = *Mstatus64::new()
.set_sd(true)
.set_sxl(0b10)
.set_uxl(0b10)
.set_mpp(0b11)
.set_mxr(true)
.set_mie(true);
println!("Mstatus64: {m64:#?}");
let s32 =
*Sstatus32::new().set_sd(true).set_mxr(true).set_sum(true).set_spp(true).set_sie(true);
println!("Sstatus32: {s32:#?}");
let s64 = *Sstatus64::new()
.set_sd(true)
.set_uxl(0b10)
.set_mxr(true)
.set_sum(true)
.set_spp(true)
.set_sie(true);
println!("Sstatus64: {s64:#?}");
}