]>
Commit | Line | Data |
---|---|---|
bf1b0071 BS |
1 | #ifndef QEMU_RANGE_H |
2 | #define QEMU_RANGE_H | |
3 | ||
620ac82e MT |
4 | #include <inttypes.h> |
5 | ||
6 | /* | |
7 | * Operations on 64 bit address ranges. | |
8 | * Notes: | |
9 | * - ranges must not wrap around 0, but can include the last byte ~0x0LL. | |
10 | * - this can not represent a full 0 to ~0x0LL range. | |
11 | */ | |
12 | ||
13 | /* A structure representing a range of addresses. */ | |
14 | struct Range { | |
15 | uint64_t begin; /* First byte of the range, or 0 if empty. */ | |
16 | uint64_t end; /* 1 + the last byte. 0 if range empty or ends at ~0x0LL. */ | |
17 | }; | |
18 | typedef struct Range Range; | |
19 | ||
bf1b0071 BS |
20 | /* Get last byte of a range from offset + length. |
21 | * Undefined for ranges that wrap around 0. */ | |
22 | static inline uint64_t range_get_last(uint64_t offset, uint64_t len) | |
23 | { | |
24 | return offset + len - 1; | |
25 | } | |
26 | ||
27 | /* Check whether a given range covers a given byte. */ | |
28 | static inline int range_covers_byte(uint64_t offset, uint64_t len, | |
29 | uint64_t byte) | |
30 | { | |
31 | return offset <= byte && byte <= range_get_last(offset, len); | |
32 | } | |
33 | ||
34 | /* Check whether 2 given ranges overlap. | |
35 | * Undefined if ranges that wrap around 0. */ | |
36 | static inline int ranges_overlap(uint64_t first1, uint64_t len1, | |
37 | uint64_t first2, uint64_t len2) | |
38 | { | |
39 | uint64_t last1 = range_get_last(first1, len1); | |
40 | uint64_t last2 = range_get_last(first2, len2); | |
41 | ||
42 | return !(last2 < first1 || last1 < first2); | |
43 | } | |
44 | ||
45 | #endif |