OpenOCD
field_helpers.h
Go to the documentation of this file.
1 /* SPDX-License-Identifier: GPL-2.0-or-later */
2 
3 #ifndef OPENOCD_TARGET_RISCV_FIELD_HELPERS_H
4 #define OPENOCD_TARGET_RISCV_FIELD_HELPERS_H
5 
6 #include <stdint.h>
7 #include <assert.h>
8 
9 static inline uint64_t get_field(uint64_t reg, uint64_t mask)
10 {
11  return (reg & mask) / (mask & ~(mask << 1));
12 }
13 
14 static inline uint32_t get_field32(uint64_t reg, uint64_t mask)
15 {
16  uint64_t value = get_field(reg, mask);
17  assert(value <= UINT32_MAX);
18  return value;
19 }
20 
21 static inline uint64_t set_field(uint64_t reg, uint64_t mask, uint64_t val)
22 {
23  /* Clear current value from field. */
24  reg &= ~mask;
25  uint64_t low_field_bit = mask & ~(mask << 1);
26  /* Assert if the value doesn't fit in the field. */
27  assert(((val * low_field_bit) & ~mask) == 0);
28  reg |= (val * low_field_bit) & mask;
29  return reg;
30 }
31 
32 static inline uint32_t set_field32(uint32_t reg, uint32_t mask, uint32_t val)
33 {
34  return (uint32_t)set_field(reg, mask, val);
35 }
36 
37 static inline uint64_t field_value(uint64_t mask, uint64_t val)
38 {
39  return set_field(0, mask, val);
40 }
41 
42 static inline uint32_t field_value32(uint32_t mask, uint32_t val)
43 {
44  return set_field32(0, mask, val);
45 }
46 
47 #endif /* OPENOCD_TARGET_RISCV_FIELD_HELPERS_H */
static uint32_t field_value32(uint32_t mask, uint32_t val)
Definition: field_helpers.h:42
static uint64_t set_field(uint64_t reg, uint64_t mask, uint64_t val)
Definition: field_helpers.h:21
static uint64_t field_value(uint64_t mask, uint64_t val)
Definition: field_helpers.h:37
static uint32_t get_field32(uint64_t reg, uint64_t mask)
Definition: field_helpers.h:14
static uint64_t get_field(uint64_t reg, uint64_t mask)
Definition: field_helpers.h:9
static uint32_t set_field32(uint32_t reg, uint32_t mask, uint32_t val)
Definition: field_helpers.h:32
uint8_t mask
Definition: parport.c:70
Definition: register.h:111