]> rtime.felk.cvut.cz Git - jailhouse.git/blob - hypervisor/include/jailhouse/mmio.h
410487e6e1340bb31fecd4c5c14ccff6e9c89fe5
[jailhouse.git] / hypervisor / include / jailhouse / mmio.h
1 /*
2  * Jailhouse, a Linux-based partitioning hypervisor
3  *
4  * Copyright (c) Siemens AG, 2013
5  *
6  * Authors:
7  *  Jan Kiszka <jan.kiszka@siemens.com>
8  *
9  * This work is licensed under the terms of the GNU GPL, version 2.  See
10  * the COPYING file in the top-level directory.
11  */
12
13 #ifndef _JAILHOUSE_MMIO_H
14 #define _JAILHOUSE_MMIO_H
15
16 #include <jailhouse/paging.h>
17
18 struct mmio_access {
19         unsigned int inst_len;
20         unsigned int size;
21         unsigned int reg;
22 };
23
24 #define DEFINE_MMIO_READ(size)                                          \
25 static inline u##size mmio_read##size(void *address)                    \
26 {                                                                       \
27         return *(volatile u##size *)address;                            \
28 }
29 DEFINE_MMIO_READ(8)
30 DEFINE_MMIO_READ(16)
31 DEFINE_MMIO_READ(32)
32 DEFINE_MMIO_READ(64)
33
34 #define DEFINE_MMIO_WRITE(size)                                         \
35 static inline void mmio_write##size(void *address, u##size value)       \
36 {                                                                       \
37         *(volatile u##size *)address = value;                           \
38 }
39 DEFINE_MMIO_WRITE(8)
40 DEFINE_MMIO_WRITE(16)
41 DEFINE_MMIO_WRITE(32)
42 DEFINE_MMIO_WRITE(64)
43
44 struct mmio_access mmio_parse(unsigned long pc,
45                               const struct guest_paging_structures *pg_structs,
46                               bool is_write);
47
48 /**
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.
53  *
54  * Return: Field value of register.
55  */
56 static inline u32 mmio_read32_field(void *addr, u32 mask)
57 {
58         return (mmio_read32(addr) & mask) >> (__builtin_ffs(mask) - 1);
59 }
60
61 /**
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).
66  *
67  * Update field value of 32-bit register, leaving all other fields unmodified.
68
69  * Return: None.
70  */
71 static inline void mmio_write32_field(void *addr, u32 mask, u32 value)
72 {
73         mmio_write32(addr, (mmio_read32(addr) & ~mask) |
74                         ((value << (__builtin_ffs(mask) - 1)) & mask));
75 }
76
77 /**
78  * mmio_read64_field() - Read value of 64-bit register field.
79  * See mmio_read32_field() for more details.
80  */
81 static inline u64 mmio_read64_field(void *addr, u64 mask)
82 {
83         return (mmio_read64(addr) & mask) >> (__builtin_ffsl(mask) - 1);
84 }
85
86 /**
87  * mmio_write64_field() - Write value of 64-bit register field.
88  * See mmio_write32_field() for more details.
89  */
90 static inline void mmio_write64_field(void *addr, u64 mask, u64 value)
91 {
92         mmio_write64(addr, (mmio_read64(addr) & ~mask) |
93                         ((value << (__builtin_ffsl(mask) - 1)) & mask));
94 }
95
96 #endif /* !_JAILHOUSE_MMIO_H */