Skip to content

Commit

Permalink
restore-state: extend bit size for RestoreState
Browse files Browse the repository at this point in the history
Extends the type alias bit size for `RestoreState` types.

Adds the following states:

- `restore-state-u64x2`: 128-bits
- `restore-state-u64x4`: 256-bits
- `restore-state-u64x8`: 512-bits
- `restore-state-u64x16`: 1024-bits

These extensions are necessary for platforms like multicore RISC-V SoCs.

For example, StarFive JH7110 SoCs have five HARTs with 136 interrupts
each (680 total). Further extensions will be necessary for truly large
SoCs like the 64-core SOPHGO SG2042.
  • Loading branch information
rmsyn committed Dec 5, 2023
1 parent 6325940 commit 15dc719
Show file tree
Hide file tree
Showing 2 changed files with 68 additions and 3 deletions.
4 changes: 4 additions & 0 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -29,3 +29,7 @@ restore-state-u16 = []
restore-state-u32 = []
restore-state-u64 = []
restore-state-usize = []
restore-state-u64x2 = []
restore-state-u64x4 = []
restore-state-u64x8 = []
restore-state-u64x16 = []
67 changes: 64 additions & 3 deletions src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -50,31 +50,60 @@ impl<'cs> CriticalSection<'cs> {
all(feature = "restore-state-none", feature = "restore-state-u16"),
all(feature = "restore-state-none", feature = "restore-state-u32"),
all(feature = "restore-state-none", feature = "restore-state-u64"),
all(feature = "restore-state-none", feature = "restore-state-u64x2"),
all(feature = "restore-state-none", feature = "restore-state-u64x4"),
all(feature = "restore-state-none", feature = "restore-state-u64x8"),
all(feature = "restore-state-none", feature = "restore-state-u64x16"),
all(feature = "restore-state-none", feature = "restore-state-usize"),
all(feature = "restore-state-bool", feature = "restore-state-u8"),
all(feature = "restore-state-bool", feature = "restore-state-u16"),
all(feature = "restore-state-bool", feature = "restore-state-u32"),
all(feature = "restore-state-bool", feature = "restore-state-u64"),
all(feature = "restore-state-bool", feature = "restore-state-u64x2"),
all(feature = "restore-state-bool", feature = "restore-state-u64x4"),
all(feature = "restore-state-bool", feature = "restore-state-u64x8"),
all(feature = "restore-state-bool", feature = "restore-state-u64x16"),
all(feature = "restore-state-bool", feature = "restore-state-usize"),
all(feature = "restore-state-u8", feature = "restore-state-u16"),
all(feature = "restore-state-u8", feature = "restore-state-u32"),
all(feature = "restore-state-u8", feature = "restore-state-u64"),
all(feature = "restore-state-u8", feature = "restore-state-u64x2"),
all(feature = "restore-state-u8", feature = "restore-state-u64x4"),
all(feature = "restore-state-u8", feature = "restore-state-u64x8"),
all(feature = "restore-state-u8", feature = "restore-state-u64x16"),
all(feature = "restore-state-u8", feature = "restore-state-usize"),
all(feature = "restore-state-u16", feature = "restore-state-u32"),
all(feature = "restore-state-u16", feature = "restore-state-u64"),
all(feature = "restore-state-u16", feature = "restore-state-u64x2"),
all(feature = "restore-state-u16", feature = "restore-state-u64x4"),
all(feature = "restore-state-u16", feature = "restore-state-u64x8"),
all(feature = "restore-state-u16", feature = "restore-state-u64x16"),
all(feature = "restore-state-u16", feature = "restore-state-usize"),
all(feature = "restore-state-u32", feature = "restore-state-u64"),
all(feature = "restore-state-u32", feature = "restore-state-u64x2"),
all(feature = "restore-state-u32", feature = "restore-state-u64x4"),
all(feature = "restore-state-u32", feature = "restore-state-u64x8"),
all(feature = "restore-state-u32", feature = "restore-state-u64x16"),
all(feature = "restore-state-u32", feature = "restore-state-usize"),
all(feature = "restore-state-u64", feature = "restore-state-usize"),
all(feature = "restore-state-u64x2", feature = "restore-state-usize"),
all(feature = "restore-state-u64x4", feature = "restore-state-usize"),
all(feature = "restore-state-u64x8", feature = "restore-state-usize"),
all(feature = "restore-state-u64x16", feature = "restore-state-usize"),
))]
compile_error!("You must set at most one of these Cargo features: restore-state-none, restore-state-bool, restore-state-u8, restore-state-u16, restore-state-u32, restore-state-u64, restore-state-usize");
compile_error!("You must set at most one of these Cargo features: restore-state-none, restore-state-bool, restore-state-u8, restore-state-u16, restore-state-u32, restore-state-u64, restore-state-u64x2, restore-state-u64x4, restore-state-u64x8, restore-state-u64x16, restore-state-usize");

#[cfg(not(any(
feature = "restore-state-bool",
feature = "restore-state-u8",
feature = "restore-state-u16",
feature = "restore-state-u32",
feature = "restore-state-u64",
feature = "restore-state-usize"
feature = "restore-state-usize",
feature = "restore-state-u64x2",
feature = "restore-state-u64x4",
feature = "restore-state-u64x8",
feature = "restore-state-u64x16"
)))]
type RawRestoreStateInner = ();

Expand All @@ -96,6 +125,18 @@ type RawRestoreStateInner = u64;
#[cfg(feature = "restore-state-usize")]
type RawRestoreStateInner = usize;

#[cfg(feature = "restore-state-u64x2")]
type RawRestoreStateInner = [u64; 2];

#[cfg(feature = "restore-state-u64x4")]
type RawRestoreStateInner = [u64; 4];

#[cfg(feature = "restore-state-u64x8")]
type RawRestoreStateInner = [u64; 8];

#[cfg(feature = "restore-state-u64x16")]
type RawRestoreStateInner = [u64; 16];

// We have RawRestoreStateInner and RawRestoreState so that we don't have to copypaste the docs 5 times.
// In the docs this shows as `pub type RawRestoreState = u8` or whatever the selected type is, because
// the "inner" type alias is private.
Expand All @@ -110,6 +151,10 @@ type RawRestoreStateInner = usize;
/// - `restore-state-u32`
/// - `restore-state-u64`
/// - `restore-state-usize`
/// - `restore-state-u64x2`
/// - `restore-state-u64x4`
/// - `restore-state-u64x8`
/// - `restore-state-u64x16`
///
/// See [`RestoreState`].
///
Expand Down Expand Up @@ -145,7 +190,11 @@ impl RestoreState {
feature = "restore-state-u8",
feature = "restore-state-u16",
feature = "restore-state-u32",
feature = "restore-state-u64"
feature = "restore-state-u64",
feature = "restore-state-u64x2",
feature = "restore-state-u64x4",
feature = "restore-state-u64x8",
feature = "restore-state-u64x16",
)))]
return Self(());

Expand All @@ -163,6 +212,18 @@ impl RestoreState {

#[cfg(feature = "restore-state-u64")]
return Self(0);

#[cfg(feature = "restore-state-u64x2")]
return Self([0; 2]);

#[cfg(feature = "restore-state-u64x4")]
return Self([0; 4]);

#[cfg(feature = "restore-state-u64x8")]
return Self([0; 8]);

#[cfg(feature = "restore-state-u64x16")]
return Self([0; 16]);
}
}

Expand Down

0 comments on commit 15dc719

Please sign in to comment.