arm_sysregs_json/
lib.rs

1// Copyright 2025 Google LLC
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7//     https://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
15//! Types to parse the Arm system register JSON format.
16
17use serde::{Deserialize, Serialize};
18use std::collections::BTreeMap;
19
20#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
21#[serde(tag = "_type")]
22pub enum RegisterEntry {
23    Register(Register),
24    RegisterArray(RegisterArray),
25    RegisterBlock(RegisterBlock),
26}
27
28#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
29pub struct Register {
30    #[serde(rename = "_meta")]
31    pub meta: Option<Meta>,
32    pub access_text: Option<String>,
33    pub accessors: Vec<Accessor>,
34    pub condition: Condition,
35    pub configuration: Option<String>,
36    pub fieldsets: Vec<Fieldset>,
37    pub groups: Option<()>,
38    pub instances: Instances,
39    pub mapset: Vec<()>,
40    pub name: String,
41    pub purpose: Option<String>,
42    #[serde(skip_serializing_if = "Option::is_none")]
43    pub state: Option<ExecutionState>,
44    pub title: Option<String>,
45}
46
47#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
48pub struct Meta {
49    pub license: License,
50    pub version: Version,
51}
52
53#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
54pub struct License {
55    pub copyright: String,
56    pub info: String,
57}
58
59#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
60pub struct Version {
61    pub architecture: String,
62    pub build: String,
63    #[serde(rename = "ref")]
64    pub ref_: String,
65    pub schema: String,
66    pub timestamp: String,
67}
68
69#[derive(Clone, Copy, Debug, Deserialize, Eq, PartialEq, Serialize)]
70pub enum ExecutionState {
71    AArch32,
72    AArch64,
73    #[serde(rename = "ext")]
74    External,
75}
76
77#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
78pub struct Accessor {}
79
80#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
81pub struct Condition {}
82
83#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
84pub struct Fieldset {
85    pub condition: Condition,
86    pub description: Description,
87    pub display: Option<String>,
88    pub name: Option<String>,
89    pub values: Vec<Fields>,
90    pub width: u32,
91}
92
93#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
94pub struct Fields {
95    pub description: Description,
96    pub name: Option<String>,
97    pub rangeset: Vec<Range>,
98    pub resets: Option<FieldResets>,
99    pub values: Option<Values>,
100    pub volatile: Option<bool>,
101}
102
103#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
104pub struct Description {
105    pub after: Option<String>,
106    pub before: Option<String>,
107}
108
109#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
110pub struct Range {
111    pub start: u32,
112    pub width: u32,
113}
114
115#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
116pub struct FieldResets {}
117
118#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
119pub struct Values {
120    pub values: Vec<ValueEntry>,
121}
122
123#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
124#[serde(tag = "_type")]
125pub enum ValueEntry {
126    #[serde(rename = "Values.ConditionalValue")]
127    ConditionalValue(ConditionalValue),
128    #[serde(rename = "Values.EquationValue")]
129    EquationValue(EquationValue),
130    #[serde(rename = "Values.Group")]
131    Group(Group),
132    #[serde(rename = "Values.Link")]
133    Link(Link),
134    #[serde(rename = "Values.NamedValue")]
135    NamedValue(NamedValue),
136    #[serde(rename = "Values.Value")]
137    Value(Value),
138    #[serde(rename = "Values.ValueRange")]
139    ValueRange(ValueRange),
140}
141
142#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
143pub struct ConditionalValue {
144    pub condition: Condition,
145    pub meaning: Option<String>,
146    pub values: Values,
147}
148
149#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
150pub struct EquationValue {
151    pub meaning: Option<String>,
152    pub slice: Vec<Range>,
153    pub value: String,
154}
155
156#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
157pub struct Group {
158    pub meaning: Option<String>,
159    pub value: String,
160    pub values: Values,
161}
162
163#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
164pub struct Link {
165    pub links: BTreeMap<String, String>,
166    pub meaning: Option<String>,
167    pub value: String,
168}
169
170#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
171pub struct NamedValue {
172    pub meaning: Option<String>,
173    pub name: String,
174    pub value: String,
175}
176
177#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
178pub struct Value {
179    pub meaning: Option<String>,
180    pub value: String,
181}
182
183#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
184pub struct ValueRange {
185    pub end: Value,
186    pub meaning: Option<String>,
187    pub start: Value,
188}
189
190#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
191pub struct RegisterArray {
192    #[serde(rename = "_meta")]
193    pub meta: Option<Meta>,
194    pub access_text: Option<String>,
195    pub accessors: Vec<Accessor>,
196    pub condition: Condition,
197    pub configuration: Option<String>,
198    pub fieldsets: Vec<Fieldset>,
199    pub groups: Option<()>,
200    pub index_variable: String,
201    pub indexes: Vec<Range>,
202    pub instances: Instances,
203    pub mapset: Vec<()>,
204    pub name: String,
205    pub purpose: Option<String>,
206    #[serde(skip_serializing_if = "Option::is_none")]
207    pub state: Option<ExecutionState>,
208    pub title: Option<String>,
209}
210
211#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
212#[serde(untagged)]
213pub enum Instances {
214    InstanceSet(InstanceSet),
215    Bool(bool),
216}
217
218#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
219pub struct InstanceSet {
220    pub values: Vec<Instance>,
221}
222
223#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
224pub struct Instance {
225    pub condition: Condition,
226    pub instance: String,
227}
228
229#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
230pub struct RegisterBlock {
231    #[serde(rename = "_meta")]
232    pub meta: Meta,
233    pub accessors: Vec<Accessor>,
234    pub blocks: Vec<RegisterEntry>,
235    pub condition: Condition,
236    pub default_access: ReadWriteAccess,
237    pub mapset: Vec<()>,
238    pub name: String,
239    pub purpose: Option<String>,
240    pub references: References,
241    pub size: String,
242    pub title: Option<String>,
243}
244
245#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
246pub struct ReadWriteAccess {
247    pub read: String,
248    pub write: String,
249}
250
251#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
252pub struct References {}