2 * Jailhouse, a Linux-based partitioning hypervisor
4 * Copyright (c) Siemens AG, 2013
7 * Jan Kiszka <jan.kiszka@siemens.com>
9 * This work is licensed under the terms of the GNU GPL, version 2. See
10 * the COPYING file in the top-level directory.
13 #ifndef _JAILHOUSE_MMIO_H
14 #define _JAILHOUSE_MMIO_H
16 #include <jailhouse/paging.h>
19 unsigned int inst_len;
24 #define DEFINE_MMIO_READ(size) \
25 static inline u##size mmio_read##size(void *address) \
27 return *(volatile u##size *)address; \
34 #define DEFINE_MMIO_WRITE(size) \
35 static inline void mmio_write##size(void *address, u##size value) \
37 *(volatile u##size *)address = value; \
44 struct mmio_access mmio_parse(unsigned long pc,
45 const struct guest_paging_structures *pg_structs,
49 * mmio_read32_field() - Read value of 32-bit register field
50 * @addr: Register address.
51 * @mask: Bit mask. Shifted value must be provided which describes both
52 * starting bit position (1st non-zero bit) and length of the field.
54 * Return: Field value of register.
56 static inline u32 mmio_read32_field(void *addr, u32 mask)
58 return (mmio_read32(addr) & mask) >> (__builtin_ffs(mask) - 1);
62 * mmio_write32_field() - Write value of 32-bit register field
63 * @addr: Register address.
64 * @mask: Bit mask. See mmio_read32_field() for more details.
65 * @value: Register field value (must be the same length as mask).
67 * Update field value of 32-bit register, leaving all other fields unmodified.
71 static inline void mmio_write32_field(void *addr, u32 mask, u32 value)
73 mmio_write32(addr, (mmio_read32(addr) & ~mask) |
74 ((value << (__builtin_ffs(mask) - 1)) & mask));
78 * mmio_read64_field() - Read value of 64-bit register field.
79 * See mmio_read32_field() for more details.
81 static inline u64 mmio_read64_field(void *addr, u64 mask)
83 return (mmio_read64(addr) & mask) >> (__builtin_ffsl(mask) - 1);
87 * mmio_write64_field() - Write value of 64-bit register field.
88 * See mmio_write32_field() for more details.
90 static inline void mmio_write64_field(void *addr, u64 mask, u64 value)
92 mmio_write64(addr, (mmio_read64(addr) & ~mask) |
93 ((value << (__builtin_ffsl(mask) - 1)) & mask));
96 #endif /* !_JAILHOUSE_MMIO_H */