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)]
78#[serde(tag = "_type")]
79pub enum Accessor {
80    #[serde(rename = "Accessors.SystemAccessor")]
81    SystemAccessor(SystemAccessor),
82    #[serde(rename = "Accessors.SystemAccessorArray")]
83    SystemAccessorArray(SystemAccessorArray),
84    #[serde(rename = "Accessors.BlockAccess")]
85    BlockAccess(BlockAccess),
86    #[serde(rename = "Accessors.BlockAccessArray")]
87    BlockAccessArray(BlockAccessArray),
88    #[serde(rename = "Accessors.ExternalDebug")]
89    ExternalDebug(ExternalDebug),
90    #[serde(rename = "Accessors.MemoryMapped")]
91    MemoryMapped(MemoryMapped),
92}
93
94#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
95pub struct SystemAccessor {
96    pub access: Option<SystemAccess>,
97    pub condition: Condition,
98    pub encoding: Vec<Encoding>,
99    pub name: String,
100}
101
102#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
103pub struct SystemAccessorArray {
104    pub access: Option<SystemAccess>,
105    pub condition: Condition,
106    pub encoding: Vec<Encoding>,
107    pub index_variable: String,
108    pub indexes: Vec<Range>,
109    pub name: String,
110}
111
112#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
113pub struct BlockAccess {
114    pub access: MemoryAccess,
115    pub condition: Condition,
116    pub offset: Vec<Offset>,
117    pub references: References,
118}
119
120#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
121pub struct BlockAccessArray {
122    pub access: MemoryAccess,
123    pub condition: Condition,
124    pub index_variable: String,
125    pub indexes: Vec<Range>,
126    pub offset: Vec<Offset>,
127    pub references: References,
128}
129
130#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
131pub struct ExternalDebug {
132    pub access: MemoryAccess,
133    pub component: String,
134    pub condition: Condition,
135    pub instance: Option<String>,
136    pub offset: Offset,
137    pub power_domain: Option<String>,
138    pub range: Option<Range>,
139}
140
141#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
142pub struct MemoryMapped {
143    pub access: MemoryAccess,
144    pub component: String,
145    pub condition: Condition,
146    pub frame: Option<String>,
147    pub instance: Option<String>,
148    pub offset: Offset,
149    pub power_domain: Option<String>,
150    pub range: Option<Range>,
151}
152
153#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
154pub struct MemoryAccess {}
155
156#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
157pub struct Offset {}
158
159#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
160pub struct SystemAccess {
161    pub access: Vec<Access>,
162    pub condition: Condition,
163}
164
165#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
166pub struct Access {}
167
168#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
169pub struct Encoding {
170    pub asmvalue: Option<String>,
171    pub encodings: BTreeMap<String, Value>,
172}
173
174#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
175pub struct Condition {}
176
177#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
178pub struct Fieldset {
179    pub condition: Condition,
180    pub description: Description,
181    pub display: Option<String>,
182    pub name: Option<String>,
183    pub values: Vec<FieldEntry>,
184    pub width: u32,
185}
186
187#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
188#[serde(tag = "_type")]
189pub enum FieldEntry {
190    #[serde(rename = "Fields.Field")]
191    Field(Field),
192    #[serde(rename = "Fields.Reserved")]
193    Reserved(ReservedField),
194    #[serde(rename = "Fields.ImplementationDefined")]
195    ImplementationDefined(ImplementationDefinedField),
196    #[serde(rename = "Fields.Array")]
197    Array(ArrayField),
198    #[serde(rename = "Fields.Vector")]
199    Vector(VectorField),
200    #[serde(rename = "Fields.ConditionalField")]
201    ConditionalField(ConditionalField),
202    #[serde(rename = "Fields.ConstantField")]
203    ConstantField(ConstantField),
204    #[serde(rename = "Fields.Dynamic")]
205    Dynamic(DynamicField),
206}
207
208#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
209pub struct Field {
210    pub description: Description,
211    pub name: Option<String>,
212    pub rangeset: Vec<Range>,
213    pub resets: Option<FieldResets>,
214    pub values: Option<Values>,
215    pub volatile: Option<bool>,
216}
217
218#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
219pub struct ReservedField {
220    pub description: Description,
221    pub rangeset: Vec<Range>,
222    pub value: String,
223}
224
225#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
226pub struct ImplementationDefinedField {
227    pub constraints: Option<Vec<()>>,
228    pub description: Description,
229    pub display: Option<String>,
230    pub name: Option<String>,
231    pub rangeset: Vec<Range>,
232    pub resets: Option<FieldResets>,
233    pub volatile: Option<bool>,
234}
235
236#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
237pub struct ArrayField {
238    pub access: Option<()>,
239    pub description: Description,
240    pub display: Option<String>,
241    pub index_variable: String,
242    pub indexes: Vec<Range>,
243    pub name: Option<String>,
244    pub rangeset: Vec<Range>,
245    pub resets: Option<FieldResets>,
246    pub values: Option<Values>,
247    pub volatile: Option<bool>,
248}
249
250#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
251pub struct VectorField {
252    pub access: Option<()>,
253    pub description: Description,
254    pub display: Option<String>,
255    pub index_variable: String,
256    pub indexes: Vec<Range>,
257    pub name: Option<String>,
258    pub rangeset: Vec<Range>,
259    pub reserved_type: Option<String>,
260    pub resets: Option<FieldResets>,
261    pub size: Vec<ConditionValue>,
262    pub values: Option<Values>,
263    pub volatile: Option<bool>,
264}
265
266#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
267pub struct ConditionValue {
268    pub condition: Condition,
269    pub value: AstValue,
270}
271
272#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
273pub struct AstValue {}
274
275#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
276pub struct ConditionalField {
277    pub description: Description,
278    pub display: Option<String>,
279    pub fields: Vec<FieldCondition>,
280    pub name: Option<String>,
281    pub rangeset: Vec<Range>,
282    pub reservedtype: String,
283    pub resets: Option<FieldResets>,
284    pub volatile: Option<bool>,
285}
286
287#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
288pub struct FieldCondition {
289    pub condition: Condition,
290    pub field: FieldEntry,
291}
292
293#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
294pub struct ConstantField {
295    pub access: Option<()>,
296    pub description: Description,
297    pub name: Option<String>,
298    pub rangeset: Vec<Range>,
299    pub resets: Option<FieldResets>,
300    pub value: ValueEntry,
301}
302
303#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
304pub struct DynamicField {
305    pub description: Description,
306    pub display: Option<String>,
307    pub instances: Vec<Fieldset>,
308    pub name: Option<String>,
309    pub rangeset: Vec<Range>,
310    pub resets: Option<FieldResets>,
311    pub volatile: Option<bool>,
312}
313
314#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
315pub struct Description {
316    pub after: Option<String>,
317    pub before: Option<String>,
318}
319
320#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
321pub struct Range {
322    pub start: u32,
323    pub width: u32,
324}
325
326#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
327pub struct FieldResets {}
328
329#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
330pub struct Values {
331    pub values: Vec<ValueEntry>,
332}
333
334#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
335#[serde(tag = "_type")]
336pub enum ValueEntry {
337    #[serde(rename = "Values.ConditionalValue")]
338    ConditionalValue(ConditionalValue),
339    #[serde(rename = "Values.EquationValue")]
340    EquationValue(EquationValue),
341    #[serde(rename = "Values.Group")]
342    Group(Group),
343    #[serde(rename = "Values.ImplementationDefined")]
344    ImplementationDefined(ImplementationDefinedValue),
345    #[serde(rename = "Values.Link")]
346    Link(Link),
347    #[serde(rename = "Values.NamedValue")]
348    NamedValue(NamedValue),
349    #[serde(rename = "Values.Value")]
350    Value(Value),
351    #[serde(rename = "Values.ValueRange")]
352    ValueRange(ValueRange),
353}
354
355#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
356pub struct ConditionalValue {
357    pub condition: Condition,
358    pub meaning: Option<String>,
359    pub values: Values,
360}
361
362#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
363pub struct EquationValue {
364    pub meaning: Option<String>,
365    pub slice: Vec<Range>,
366    pub value: String,
367}
368
369#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
370pub struct Group {
371    pub meaning: Option<String>,
372    pub value: String,
373    pub values: Values,
374}
375
376#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
377pub struct Link {
378    pub links: BTreeMap<String, String>,
379    pub meaning: Option<String>,
380    pub value: String,
381}
382
383#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
384pub struct NamedValue {
385    pub meaning: Option<String>,
386    pub name: String,
387    pub value: String,
388}
389
390#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
391pub struct Value {
392    pub meaning: Option<String>,
393    pub value: String,
394}
395
396#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
397pub struct ImplementationDefinedValue {
398    pub constraints: Option<Values>,
399    pub meaning: Option<String>,
400}
401
402#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
403pub struct ValueRange {
404    pub end: Value,
405    pub meaning: Option<String>,
406    pub start: Value,
407}
408
409#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
410pub struct RegisterArray {
411    #[serde(rename = "_meta")]
412    pub meta: Option<Meta>,
413    pub access_text: Option<String>,
414    pub accessors: Vec<Accessor>,
415    pub condition: Condition,
416    pub configuration: Option<String>,
417    pub fieldsets: Vec<Fieldset>,
418    pub groups: Option<()>,
419    pub index_variable: String,
420    pub indexes: Vec<Range>,
421    pub instances: Instances,
422    pub mapset: Vec<()>,
423    pub name: String,
424    pub purpose: Option<String>,
425    #[serde(skip_serializing_if = "Option::is_none")]
426    pub state: Option<ExecutionState>,
427    pub title: Option<String>,
428}
429
430#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
431#[serde(untagged)]
432pub enum Instances {
433    InstanceSet(InstanceSet),
434    Bool(bool),
435}
436
437#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
438pub struct InstanceSet {
439    pub values: Vec<Instance>,
440}
441
442#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
443pub struct Instance {
444    pub condition: Condition,
445    pub instance: String,
446}
447
448#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
449pub struct RegisterBlock {
450    #[serde(rename = "_meta")]
451    pub meta: Meta,
452    pub accessors: Vec<Accessor>,
453    pub blocks: Vec<RegisterEntry>,
454    pub condition: Condition,
455    pub default_access: ReadWriteAccess,
456    pub mapset: Vec<()>,
457    pub name: String,
458    pub purpose: Option<String>,
459    pub references: References,
460    pub size: String,
461    pub title: Option<String>,
462}
463
464#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
465pub struct ReadWriteAccess {
466    pub read: String,
467    pub write: String,
468}
469
470#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
471pub struct References {}