Skip to content

Commit 2cb1ea6

Browse files
committed
feat: add riscv_pmu test
refactor: remove serde_dervier Signed-off-by: Woshiluo Luo <[email protected]>
1 parent aff691e commit 2cb1ea6

File tree

13 files changed

+77
-32
lines changed

13 files changed

+77
-32
lines changed

Cargo.toml

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,7 @@ edition = "2024"
1414
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
1515

1616
[dependencies]
17-
serde = { version = "1.0", default-features = false }
18-
serde_derive = "1.0"
17+
serde = { version = "1.0", default-features = false, features = ["derive"] }
1918
erased-serde = { version = "0.4", optional = true }
2019

2120
[features]

examples/hifive-unmatched-a00.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
extern crate alloc;
22

33
use alloc::collections::BTreeMap;
4-
use serde_derive::Deserialize;
4+
use serde::Deserialize;
55
use serde_device_tree::Compatible;
66

77
#[derive(Debug, Deserialize)]

examples/qemu-virt.rs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,7 @@
11
//! 这是一个 `from_raw_mut` 反序列化设备树的示例。不需要 `alloc`。
22
// extern crate alloc;
33

4-
// 在实际使用中,将这里的 `serde_derive::Deserialize` 改为 `serde::Deserialize`。
5-
use serde_derive::Deserialize;
4+
use serde::Deserialize;
65

76
// - `DtbPtr`: 验证设备树首部正确性,后续也可借助这个类型传递设备树,多次解析不必重复验证。
87
// - `Dtb`: 管理反序列化出的类型生命周期。

examples/serialize.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
use serde_derive::Serialize;
1+
use serde::Serialize;
22
use std::io::prelude::*;
33

44
const MAX_SIZE: usize = 256 + 32;

src/de.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ use serde::de;
4242
/// # });
4343
/// # aligned_data.data[..BUFFER_SIZE].clone_from_slice(RAW_DEVICE_TREE);
4444
/// # let fdt_ptr = aligned_data.data.as_ptr();
45-
/// use serde_derive::Deserialize;
45+
/// use serde::Deserialize;
4646
///
4747
/// #[derive(Debug, Deserialize)]
4848
/// struct Tree<'a> {
@@ -516,7 +516,7 @@ mod tests {
516516
#[cfg(feature = "alloc")]
517517
use alloc::format;
518518
#[cfg(any(feature = "std", feature = "alloc"))]
519-
use serde_derive::Deserialize;
519+
use serde::Deserialize;
520520
#[cfg(feature = "std")]
521521
use std::format;
522522

src/de_mut/matrix.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ impl<'de, const T: usize> Iterator for MatrixItem<'de, T> {
5555
}
5656
}
5757

58-
impl<'de, const T: usize> Deserialize<'de> for Matrix<'de, T> {
58+
impl<'de, const T: usize> Deserialize<'de> for Matrix<'_, T> {
5959
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
6060
where
6161
D: serde::Deserializer<'de>,
@@ -95,7 +95,7 @@ impl<const T: usize> Serialize for Matrix<'_, T> {
9595
mod tests {
9696
use super::Matrix;
9797
use crate::{Dtb, DtbPtr, buildin::Node, from_raw_mut};
98-
use serde_derive::Serialize;
98+
use serde::Serialize;
9999

100100
const MAX_SIZE: usize = 256;
101101
#[test]

src/de_mut/node_seq.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -178,7 +178,7 @@ impl<'de> NodeSeqItem<'de> {
178178
mod tests {
179179
use crate::buildin::{NodeSeq, Reg};
180180
use crate::{Dtb, DtbPtr, from_raw_mut};
181-
use serde_derive::Deserialize;
181+
use serde::Deserialize;
182182

183183
const RAW_DEVICE_TREE: &[u8] = include_bytes!("../../examples/bl808.dtb");
184184
const BUFFER_SIZE: usize = RAW_DEVICE_TREE.len();

src/ser/mod.rs

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -39,17 +39,16 @@ where
3939
let writer_len = writer.len();
4040
let (data_block, string_block) = writer.split_at_mut(writer.len() - offset);
4141
let (header, data_block) = data_block.split_at_mut(HEADER_LEN as usize + RSVMAP_LEN);
42-
let struct_len;
43-
{
42+
let struct_len = {
4443
let mut patch_list = crate::ser::patch::PatchList::new(list);
4544
let mut block = crate::ser::string_block::StringBlock::new(string_block, &mut offset);
4645
let mut dst = crate::ser::pointer::Pointer::new(Some(data_block));
4746
let mut ser =
4847
crate::ser::serializer::Serializer::new(&mut dst, &mut block, &mut patch_list);
4948
data.serialize(&mut ser)?;
5049
ser.dst.step_by_u32(FDT_END);
51-
struct_len = ser.dst.get_offset();
52-
}
50+
ser.dst.get_offset()
51+
};
5352
// Make header
5453
{
5554
let header = unsafe { &mut *(header.as_mut_ptr() as *mut Header) };

src/ser/serializer.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -450,7 +450,7 @@ impl<'se> serde::ser::Serializer for &mut Serializer<'se> {
450450

451451
#[cfg(test)]
452452
mod tests {
453-
use serde_derive::Serialize;
453+
use serde::Serialize;
454454
const MAX_SIZE: usize = 256 + 32;
455455
#[test]
456456
fn base_ser_test() {

src/value/riscv_pmu.rs

Lines changed: 61 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,29 +1,33 @@
1-
use crate::buildin::Matrix;
1+
use crate::buildin::*;
22

3-
use serde_derive::Serialize;
3+
use serde::{Deserialize, Serialize};
44

55
use core::ops::RangeInclusive;
66

77
#[repr(transparent)]
8-
#[derive(Serialize)]
8+
#[derive(Deserialize, Serialize)]
99
#[serde(transparent)]
10-
pub struct EventToMhpmevent<'de>(Matrix<'de, 3>);
10+
pub struct EventToMhpmevent<'a>(Matrix<'a, 3>);
1111

1212
#[repr(transparent)]
13-
#[derive(Serialize)]
13+
#[derive(Deserialize, Serialize)]
1414
#[serde(transparent)]
15-
pub struct EventToMhpmcounters<'de>(Matrix<'de, 3>);
15+
pub struct EventToMhpmcounters<'a>(Matrix<'a, 3>);
1616

1717
#[repr(transparent)]
18-
#[derive(Serialize)]
18+
#[derive(Deserialize, Serialize)]
1919
#[serde(transparent)]
20-
pub struct RawEventToMhpcounters<'de>(Matrix<'de, 5>);
20+
pub struct RawEventToMhpcounters<'a>(Matrix<'a, 5>);
2121

2222
impl EventToMhpmevent<'_> {
23-
pub fn get_len(&self) -> usize {
23+
pub fn len(&self) -> usize {
2424
self.0.len()
2525
}
2626

27+
pub fn is_empty(&self) -> bool {
28+
self.0.is_empty()
29+
}
30+
2731
pub fn get_event_id(&self, i: usize) -> u32 {
2832
u32::from_be(self.0.get(i)[0])
2933
}
@@ -35,10 +39,14 @@ impl EventToMhpmevent<'_> {
3539
}
3640

3741
impl EventToMhpmcounters<'_> {
38-
pub fn get_len(&self) -> usize {
42+
pub fn len(&self) -> usize {
3943
self.0.len()
4044
}
4145

46+
pub fn is_empty(&self) -> bool {
47+
self.0.is_empty()
48+
}
49+
4250
pub fn get_event_idx_range(&self, i: usize) -> RangeInclusive<u32> {
4351
let current = self.0.get(i);
4452
u32::from_be(current[0])..=u32::from_be(current[1])
@@ -51,10 +59,14 @@ impl EventToMhpmcounters<'_> {
5159
}
5260

5361
impl RawEventToMhpcounters<'_> {
54-
pub fn get_len(&self) -> usize {
62+
pub fn len(&self) -> usize {
5563
self.0.len()
5664
}
5765

66+
pub fn is_empty(&self) -> bool {
67+
self.0.is_empty()
68+
}
69+
5870
pub fn get_event_idx_base(&self, i: usize) -> u64 {
5971
let current = self.0.get(i);
6072
((u32::from_be(current[0]) as u64) << 32) | (u32::from_be(current[1]) as u64)
@@ -70,3 +82,41 @@ impl RawEventToMhpcounters<'_> {
7082
u32::from_be(current[4])
7183
}
7284
}
85+
86+
#[cfg(test)]
87+
mod tests {
88+
use super::EventToMhpmcounters;
89+
use crate::{Dtb, DtbPtr, buildin::Node, from_raw_mut};
90+
91+
const RAW_DEVICE_TREE: &[u8] = include_bytes!("../../examples/qemu-virt.dtb");
92+
const BUFFER_SIZE: usize = RAW_DEVICE_TREE.len();
93+
#[test]
94+
fn test_chosen_stdout() {
95+
#[repr(align(8))]
96+
struct AlignedBuffer {
97+
pub data: [u8; RAW_DEVICE_TREE.len()],
98+
}
99+
let mut aligned_data: Box<AlignedBuffer> = Box::new(AlignedBuffer {
100+
data: [0; BUFFER_SIZE],
101+
});
102+
aligned_data.data[..BUFFER_SIZE].clone_from_slice(RAW_DEVICE_TREE);
103+
let mut slice = aligned_data.data.to_vec();
104+
let ptr = DtbPtr::from_raw(slice.as_mut_ptr()).unwrap();
105+
let dtb = Dtb::from(ptr).share();
106+
107+
let node: Node = from_raw_mut(&dtb).unwrap();
108+
let result = node
109+
.find("/pmu")
110+
.unwrap()
111+
.get_prop("riscv,event-to-mhpmcounters")
112+
.unwrap()
113+
.deserialize::<EventToMhpmcounters>();
114+
assert_eq!(result.len(), 5);
115+
assert_eq!(result.get_event_idx_range(0), 1..=1);
116+
assert_eq!(result.get_counter_bitmap(0), 0x7fff9);
117+
assert_eq!(result.get_event_idx_range(1), 2..=2);
118+
assert_eq!(result.get_counter_bitmap(1), 0x7fffc);
119+
assert_eq!(result.get_event_idx_range(2), 0x10019..=0x10019);
120+
assert_eq!(result.get_counter_bitmap(2), 0x7fff8);
121+
}
122+
}

0 commit comments

Comments
 (0)