flash/nor/at91samd: Use 32-bit register writes for ST-Link compat
[fw/openocd] / src / target / register.h
1 /* SPDX-License-Identifier: GPL-2.0-or-later */
2
3 /***************************************************************************
4  *   Copyright (C) 2005 by Dominic Rath                                    *
5  *   Dominic.Rath@gmx.de                                                   *
6  *                                                                         *
7  *   Copyright (C) 2007,2008 Ã˜yvind Harboe                                 *
8  *   oyvind.harboe@zylin.com                                               *
9  ***************************************************************************/
10
11 #ifndef OPENOCD_TARGET_REGISTER_H
12 #define OPENOCD_TARGET_REGISTER_H
13
14 #include "helper/replacements.h"
15 #include "helper/types.h"
16
17 struct target;
18
19 enum reg_type {
20         REG_TYPE_BOOL,
21         REG_TYPE_INT,
22         REG_TYPE_INT8,
23         REG_TYPE_INT16,
24         REG_TYPE_INT32,
25         REG_TYPE_INT64,
26         REG_TYPE_INT128,
27         REG_TYPE_UINT,
28         REG_TYPE_UINT8,
29         REG_TYPE_UINT16,
30         REG_TYPE_UINT32,
31         REG_TYPE_UINT64,
32         REG_TYPE_UINT128,
33         REG_TYPE_CODE_PTR,
34         REG_TYPE_DATA_PTR,
35         REG_TYPE_FLOAT,
36         REG_TYPE_IEEE_SINGLE,
37         REG_TYPE_IEEE_DOUBLE,
38         REG_TYPE_ARCH_DEFINED,
39 };
40
41 struct reg_feature {
42         const char *name;
43 };
44
45 struct reg_data_type_vector {
46         struct reg_data_type *type;
47         uint32_t count;
48 };
49
50 struct reg_data_type_union_field {
51         const char *name;
52         struct reg_data_type *type;
53         struct reg_data_type_union_field *next;
54 };
55
56 struct reg_data_type_union {
57         struct reg_data_type_union_field *fields;
58 };
59
60 struct reg_data_type_bitfield {
61         uint32_t start;
62         uint32_t end;
63         enum reg_type type;
64 };
65
66 struct reg_data_type_struct_field {
67         const char *name;
68         bool use_bitfields;
69         union {
70                 struct reg_data_type_bitfield *bitfield;
71                 struct reg_data_type *type;
72         };
73         struct reg_data_type_struct_field *next;
74 };
75
76 struct reg_data_type_struct {
77         uint32_t size;
78         struct reg_data_type_struct_field *fields;
79 };
80
81 struct reg_data_type_flags_field {
82         const char *name;
83         struct reg_data_type_bitfield *bitfield;
84         struct reg_data_type_flags_field *next;
85 };
86
87 struct reg_data_type_flags {
88         uint32_t size;
89         struct reg_data_type_flags_field *fields;
90 };
91
92 enum reg_data_type_class {
93         REG_TYPE_CLASS_VECTOR,
94         REG_TYPE_CLASS_UNION,
95         REG_TYPE_CLASS_STRUCT,
96         REG_TYPE_CLASS_FLAGS,
97 };
98
99 struct reg_data_type {
100         enum reg_type type;
101         const char *id;
102         enum reg_data_type_class type_class;
103         union {
104                 struct reg_data_type_vector *reg_type_vector;
105                 struct reg_data_type_union *reg_type_union;
106                 struct reg_data_type_struct *reg_type_struct;
107                 struct reg_data_type_flags *reg_type_flags;
108         };
109 };
110
111 struct reg {
112         /* Canonical name of the register. */
113         const char *name;
114         /* Number that gdb uses to access this register. */
115         uint32_t number;
116         /* TODO. This should probably be const. */
117         struct reg_feature *feature;
118         /* TODO: When true, the caller will save this register before running any algorithm. */
119         bool caller_save;
120         /* Pointer to place where the value is stored, in the format understood by
121          * the binarybuffer.h functions. */
122         uint8_t *value;
123         /* The stored value needs to be written to the target. */
124         bool dirty;
125         /* When true, value is valid. */
126         bool valid;
127         /* When false, the register doesn't actually exist in the target. */
128         bool exist;
129         /* Hide the register from gdb and omit it in 'reg' cmd output */
130         bool hidden;
131         /* Size of the register in bits. */
132         uint32_t size;
133         /* Used for generating XML description of registers. Can be set to NULL for
134          * targets that don't use that. */
135         struct reg_data_type *reg_data_type;
136         /* Used for generating XML description of registers. Can be set to NULL for
137          * targets that don't use that. */
138         const char *group;
139         /* Pointer to architecture-specific info for this register. */
140         void *arch_info;
141         const struct reg_arch_type *type;
142 };
143
144 struct reg_cache {
145         const char *name;
146         struct reg_cache *next;
147         struct reg *reg_list;
148         unsigned num_regs;
149 };
150
151 struct reg_arch_type {
152         int (*get)(struct reg *reg);
153         int (*set)(struct reg *reg, uint8_t *buf);
154 };
155
156 struct reg *register_get_by_number(struct reg_cache *first,
157                 uint32_t reg_num, bool search_all);
158 struct reg *register_get_by_name(struct reg_cache *first,
159                 const char *name, bool search_all);
160 struct reg_cache **register_get_last_cache_p(struct reg_cache **first);
161 void register_unlink_cache(struct reg_cache **cache_p, const struct reg_cache *cache);
162 void register_cache_invalidate(struct reg_cache *cache);
163
164 void register_init_dummy(struct reg *reg);
165
166 #endif /* OPENOCD_TARGET_REGISTER_H */