1
2
3
4
5
6
7
8
9
10
11#ifndef REGISTERFIELDS_H
12#define REGISTERFIELDS_H
13
14#include "qemu/bitops.h"
15
16
17
18
19
20
21#define REG32(reg, addr) \
22 enum { A_ ## reg = (addr) }; \
23 enum { R_ ## reg = (addr) / 4 };
24
25#define REG8(reg, addr) \
26 enum { A_ ## reg = (addr) }; \
27 enum { R_ ## reg = (addr) };
28
29#define REG16(reg, addr) \
30 enum { A_ ## reg = (addr) }; \
31 enum { R_ ## reg = (addr) / 2 };
32
33
34
35
36
37
38#define FIELD(reg, field, shift, length) \
39 enum { R_ ## reg ## _ ## field ## _SHIFT = (shift)}; \
40 enum { R_ ## reg ## _ ## field ## _LENGTH = (length)}; \
41 enum { R_ ## reg ## _ ## field ## _MASK = \
42 MAKE_64BIT_MASK(shift, length)};
43
44
45#define FIELD_EX8(storage, reg, field) \
46 extract8((storage), R_ ## reg ## _ ## field ## _SHIFT, \
47 R_ ## reg ## _ ## field ## _LENGTH)
48#define FIELD_EX16(storage, reg, field) \
49 extract16((storage), R_ ## reg ## _ ## field ## _SHIFT, \
50 R_ ## reg ## _ ## field ## _LENGTH)
51#define FIELD_EX32(storage, reg, field) \
52 extract32((storage), R_ ## reg ## _ ## field ## _SHIFT, \
53 R_ ## reg ## _ ## field ## _LENGTH)
54#define FIELD_EX64(storage, reg, field) \
55 extract64((storage), R_ ## reg ## _ ## field ## _SHIFT, \
56 R_ ## reg ## _ ## field ## _LENGTH)
57
58
59#define ARRAY_FIELD_EX32(regs, reg, field) \
60 FIELD_EX32((regs)[R_ ## reg], reg, field)
61
62
63
64
65
66#define FIELD_DP8(storage, reg, field, val) ({ \
67 struct { \
68 unsigned int v:R_ ## reg ## _ ## field ## _LENGTH; \
69 } _v = { .v = val }; \
70 uint8_t _d; \
71 _d = deposit32((storage), R_ ## reg ## _ ## field ## _SHIFT, \
72 R_ ## reg ## _ ## field ## _LENGTH, _v.v); \
73 _d; })
74#define FIELD_DP16(storage, reg, field, val) ({ \
75 struct { \
76 unsigned int v:R_ ## reg ## _ ## field ## _LENGTH; \
77 } _v = { .v = val }; \
78 uint16_t _d; \
79 _d = deposit32((storage), R_ ## reg ## _ ## field ## _SHIFT, \
80 R_ ## reg ## _ ## field ## _LENGTH, _v.v); \
81 _d; })
82#define FIELD_DP32(storage, reg, field, val) ({ \
83 struct { \
84 unsigned int v:R_ ## reg ## _ ## field ## _LENGTH; \
85 } _v = { .v = val }; \
86 uint32_t _d; \
87 _d = deposit32((storage), R_ ## reg ## _ ## field ## _SHIFT, \
88 R_ ## reg ## _ ## field ## _LENGTH, _v.v); \
89 _d; })
90#define FIELD_DP64(storage, reg, field, val) ({ \
91 struct { \
92 unsigned int v:R_ ## reg ## _ ## field ## _LENGTH; \
93 } _v = { .v = val }; \
94 uint64_t _d; \
95 _d = deposit64((storage), R_ ## reg ## _ ## field ## _SHIFT, \
96 R_ ## reg ## _ ## field ## _LENGTH, _v.v); \
97 _d; })
98
99
100#define ARRAY_FIELD_DP32(regs, reg, field, val) \
101 (regs)[R_ ## reg] = FIELD_DP32((regs)[R_ ## reg], reg, field, val);
102
103#endif
104