~pmdj/ubuntu/trusty/qemu/2.9+applesmc+fadtv3

« back to all changes in this revision

Viewing changes to include/hw/register.h

  • Committer: Phil Dennis-Jordan
  • Date: 2017-07-21 08:03:43 UTC
  • mfrom: (1.1.1)
  • Revision ID: phil@philjordan.eu-20170721080343-2yr2vdj7713czahv
New upstream release 2.9.0.

Show diffs side-by-side

added added

removed removed

Lines of Context:
13
13
 
14
14
#include "hw/qdev-core.h"
15
15
#include "exec/memory.h"
 
16
#include "hw/registerfields.h"
16
17
 
17
18
typedef struct RegisterInfo RegisterInfo;
18
19
typedef struct RegisterAccessInfo RegisterAccessInfo;
92
93
 * This structure is used to group all of the individual registers which are
93
94
 * modeled using the RegisterInfo structure.
94
95
 *
95
 
 * @r is an aray containing of all the relevent RegisterInfo structures.
 
96
 * @r is an array containing of all the relevant RegisterInfo structures.
96
97
 *
97
98
 * @num_elements is the number of elements in the array r
98
99
 *
206
207
 
207
208
void register_finalize_block(RegisterInfoArray *r_array);
208
209
 
209
 
/* Define constants for a 32 bit register */
210
 
 
211
 
/* This macro will define A_FOO, for the byte address of a register
212
 
 * as well as R_FOO for the uint32_t[] register number (A_FOO / 4).
213
 
 */
214
 
#define REG32(reg, addr)                                                  \
215
 
    enum { A_ ## reg = (addr) };                                          \
216
 
    enum { R_ ## reg = (addr) / 4 };
217
 
 
218
 
/* Define SHIFT, LENGTH and MASK constants for a field within a register */
219
 
 
220
 
/* This macro will define FOO_BAR_MASK, FOO_BAR_SHIFT and FOO_BAR_LENGTH 
221
 
 * constants for field BAR in register FOO.
222
 
 */
223
 
#define FIELD(reg, field, shift, length)                                  \
224
 
    enum { R_ ## reg ## _ ## field ## _SHIFT = (shift)};                  \
225
 
    enum { R_ ## reg ## _ ## field ## _LENGTH = (length)};                \
226
 
    enum { R_ ## reg ## _ ## field ## _MASK =                             \
227
 
                                        MAKE_64BIT_MASK(shift, length)};
228
 
 
229
 
/* Extract a field from a register */
230
 
#define FIELD_EX32(storage, reg, field)                                   \
231
 
    extract32((storage), R_ ## reg ## _ ## field ## _SHIFT,               \
232
 
              R_ ## reg ## _ ## field ## _LENGTH)
233
 
 
234
 
/* Extract a field from an array of registers */
235
 
#define ARRAY_FIELD_EX32(regs, reg, field)                                \
236
 
    FIELD_EX32((regs)[R_ ## reg], reg, field)
237
 
 
238
 
/* Deposit a register field.
239
 
 * Assigning values larger then the target field will result in
240
 
 * compilation warnings.
241
 
 */
242
 
#define FIELD_DP32(storage, reg, field, val) ({                           \
243
 
    struct {                                                              \
244
 
        unsigned int v:R_ ## reg ## _ ## field ## _LENGTH;                \
245
 
    } v = { .v = val };                                                   \
246
 
    uint32_t d;                                                           \
247
 
    d = deposit32((storage), R_ ## reg ## _ ## field ## _SHIFT,           \
248
 
                  R_ ## reg ## _ ## field ## _LENGTH, v.v);               \
249
 
    d; })
250
 
 
251
 
/* Deposit a field to array of registers.  */
252
 
#define ARRAY_FIELD_DP32(regs, reg, field, val)                           \
253
 
    (regs)[R_ ## reg] = FIELD_DP32((regs)[R_ ## reg], reg, field, val);
254
 
 
255
210
#endif