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<FieldEntry>,
90    pub width: u32,
91}
92
93#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
94#[serde(tag = "_type")]
95pub enum FieldEntry {
96    #[serde(rename = "Fields.Field")]
97    Field(Field),
98    #[serde(rename = "Fields.Reserved")]
99    Reserved(ReservedField),
100    #[serde(rename = "Fields.ImplementationDefined")]
101    ImplementationDefined(ImplementationDefinedField),
102    #[serde(rename = "Fields.Array")]
103    Array(ArrayField),
104    #[serde(rename = "Fields.Vector")]
105    Vector(VectorField),
106    #[serde(rename = "Fields.ConditionalField")]
107    ConditionalField(ConditionalField),
108    #[serde(rename = "Fields.ConstantField")]
109    ConstantField(ConstantField),
110    #[serde(rename = "Fields.Dynamic")]
111    Dynamic(DynamicField),
112}
113
114#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
115pub struct Field {
116    pub description: Description,
117    pub name: Option<String>,
118    pub rangeset: Vec<Range>,
119    pub resets: Option<FieldResets>,
120    pub values: Option<Values>,
121    pub volatile: Option<bool>,
122}
123
124#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
125pub struct ReservedField {
126    pub description: Description,
127    pub rangeset: Vec<Range>,
128    pub value: String,
129}
130
131#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
132pub struct ImplementationDefinedField {
133    pub constraints: Option<Vec<()>>,
134    pub description: Description,
135    pub display: Option<String>,
136    pub name: Option<String>,
137    pub rangeset: Vec<Range>,
138    pub resets: Option<FieldResets>,
139    pub volatile: Option<bool>,
140}
141
142#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
143pub struct ArrayField {
144    pub access: Option<()>,
145    pub description: Description,
146    pub display: Option<String>,
147    pub index_variable: String,
148    pub indexes: Vec<Range>,
149    pub name: Option<String>,
150    pub rangeset: Vec<Range>,
151    pub resets: Option<FieldResets>,
152    pub values: Option<Values>,
153    pub volatile: Option<bool>,
154}
155
156#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
157pub struct VectorField {
158    pub access: Option<()>,
159    pub description: Description,
160    pub display: Option<String>,
161    pub index_variable: String,
162    pub indexes: Vec<Range>,
163    pub name: Option<String>,
164    pub rangeset: Vec<Range>,
165    pub reserved_type: Option<String>,
166    pub resets: Option<FieldResets>,
167    pub size: Vec<ConditionValue>,
168    pub values: Option<Values>,
169    pub volatile: Option<bool>,
170}
171
172#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
173pub struct ConditionValue {
174    pub condition: Condition,
175    pub value: AstValue,
176}
177
178#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
179pub struct AstValue {}
180
181#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
182pub struct ConditionalField {
183    pub description: Description,
184    pub display: Option<String>,
185    pub fields: Vec<FieldCondition>,
186    pub name: Option<String>,
187    pub rangeset: Vec<Range>,
188    pub reservedtype: String,
189    pub resets: Option<FieldResets>,
190    pub volatile: Option<bool>,
191}
192
193#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
194pub struct FieldCondition {
195    pub condition: Condition,
196    pub field: FieldEntry,
197}
198
199#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
200pub struct ConstantField {
201    pub access: Option<()>,
202    pub description: Description,
203    pub name: Option<String>,
204    pub rangeset: Vec<Range>,
205    pub resets: Option<FieldResets>,
206    pub value: ValueEntry,
207}
208
209#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
210pub struct DynamicField {
211    pub description: Description,
212    pub display: Option<String>,
213    pub instances: Vec<Fieldset>,
214    pub name: Option<String>,
215    pub rangeset: Vec<Range>,
216    pub resets: Option<FieldResets>,
217    pub volatile: Option<bool>,
218}
219
220#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
221pub struct Description {
222    pub after: Option<String>,
223    pub before: Option<String>,
224}
225
226#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
227pub struct Range {
228    pub start: u32,
229    pub width: u32,
230}
231
232#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
233pub struct FieldResets {}
234
235#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
236pub struct Values {
237    pub values: Vec<ValueEntry>,
238}
239
240#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
241#[serde(tag = "_type")]
242pub enum ValueEntry {
243    #[serde(rename = "Values.ConditionalValue")]
244    ConditionalValue(ConditionalValue),
245    #[serde(rename = "Values.EquationValue")]
246    EquationValue(EquationValue),
247    #[serde(rename = "Values.Group")]
248    Group(Group),
249    #[serde(rename = "Values.ImplementationDefined")]
250    ImplementationDefined(ImplementationDefinedValue),
251    #[serde(rename = "Values.Link")]
252    Link(Link),
253    #[serde(rename = "Values.NamedValue")]
254    NamedValue(NamedValue),
255    #[serde(rename = "Values.Value")]
256    Value(Value),
257    #[serde(rename = "Values.ValueRange")]
258    ValueRange(ValueRange),
259}
260
261#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
262pub struct ConditionalValue {
263    pub condition: Condition,
264    pub meaning: Option<String>,
265    pub values: Values,
266}
267
268#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
269pub struct EquationValue {
270    pub meaning: Option<String>,
271    pub slice: Vec<Range>,
272    pub value: String,
273}
274
275#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
276pub struct Group {
277    pub meaning: Option<String>,
278    pub value: String,
279    pub values: Values,
280}
281
282#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
283pub struct Link {
284    pub links: BTreeMap<String, String>,
285    pub meaning: Option<String>,
286    pub value: String,
287}
288
289#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
290pub struct NamedValue {
291    pub meaning: Option<String>,
292    pub name: String,
293    pub value: String,
294}
295
296#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
297pub struct Value {
298    pub meaning: Option<String>,
299    pub value: String,
300}
301
302#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
303pub struct ImplementationDefinedValue {
304    pub constraints: Option<Values>,
305    pub meaning: Option<String>,
306}
307
308#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
309pub struct ValueRange {
310    pub end: Value,
311    pub meaning: Option<String>,
312    pub start: Value,
313}
314
315#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
316pub struct RegisterArray {
317    #[serde(rename = "_meta")]
318    pub meta: Option<Meta>,
319    pub access_text: Option<String>,
320    pub accessors: Vec<Accessor>,
321    pub condition: Condition,
322    pub configuration: Option<String>,
323    pub fieldsets: Vec<Fieldset>,
324    pub groups: Option<()>,
325    pub index_variable: String,
326    pub indexes: Vec<Range>,
327    pub instances: Instances,
328    pub mapset: Vec<()>,
329    pub name: String,
330    pub purpose: Option<String>,
331    #[serde(skip_serializing_if = "Option::is_none")]
332    pub state: Option<ExecutionState>,
333    pub title: Option<String>,
334}
335
336#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
337#[serde(untagged)]
338pub enum Instances {
339    InstanceSet(InstanceSet),
340    Bool(bool),
341}
342
343#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
344pub struct InstanceSet {
345    pub values: Vec<Instance>,
346}
347
348#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
349pub struct Instance {
350    pub condition: Condition,
351    pub instance: String,
352}
353
354#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
355pub struct RegisterBlock {
356    #[serde(rename = "_meta")]
357    pub meta: Meta,
358    pub accessors: Vec<Accessor>,
359    pub blocks: Vec<RegisterEntry>,
360    pub condition: Condition,
361    pub default_access: ReadWriteAccess,
362    pub mapset: Vec<()>,
363    pub name: String,
364    pub purpose: Option<String>,
365    pub references: References,
366    pub size: String,
367    pub title: Option<String>,
368}
369
370#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
371pub struct ReadWriteAccess {
372    pub read: String,
373    pub write: String,
374}
375
376#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
377pub struct References {}