1 /******************************************************************************
2  * rangeset.h
3  *
4  * Creation, maintenance and automatic destruction of per-domain sets of
5  * numeric ranges.
6  *
7  * Copyright (c) 2005, K A Fraser
8  */
9 
10 #ifndef __XEN_RANGESET_H__
11 #define __XEN_RANGESET_H__
12 
13 #include <xen/types.h>
14 
15 struct domain;
16 struct rangeset;
17 
18 /*
19  * Initialise/destroy per-domain rangeset information.
20  *
21  * It is invalid to create or destroy a rangeset belonging to a domain @d
22  * before rangeset_domain_initialise(d) returns or after calling
23  * rangeset_domain_destroy(d).
24  */
25 void rangeset_domain_initialise(
26     struct domain *d);
27 void rangeset_domain_destroy(
28     struct domain *d);
29 
30 /*
31  * Create/destroy a rangeset. Optionally attach to specified domain @d for
32  * auto-destruction when the domain dies. A name may be specified, for use
33  * in debug pretty-printing, and various RANGESETF flags (defined below).
34  *
35  * It is invalid to perform any operation on a rangeset @r after calling
36  * rangeset_destroy(r).
37  */
38 struct rangeset *rangeset_new(
39     struct domain *d, char *name, unsigned int flags);
40 void rangeset_destroy(
41     struct rangeset *r);
42 
43 /*
44  * Set a limit on the number of ranges that may exist in set @r.
45  * NOTE: This must be called while @r is empty.
46  */
47 void rangeset_limit(
48     struct rangeset *r, unsigned int limit);
49 
50 /* Flags for passing to rangeset_new(). */
51  /* Pretty-print range limits in hexadecimal. */
52 #define _RANGESETF_prettyprint_hex 0
53 #define RANGESETF_prettyprint_hex  (1U << _RANGESETF_prettyprint_hex)
54 
55 bool_t __must_check rangeset_is_empty(
56     const struct rangeset *r);
57 
58 /* Add/claim/remove/query a numeric range. */
59 int __must_check rangeset_add_range(
60     struct rangeset *r, unsigned long s, unsigned long e);
61 int __must_check rangeset_claim_range(struct rangeset *r, unsigned long size,
62                                       unsigned long *s);
63 int __must_check rangeset_remove_range(
64     struct rangeset *r, unsigned long s, unsigned long e);
65 bool_t __must_check rangeset_contains_range(
66     struct rangeset *r, unsigned long s, unsigned long e);
67 bool_t __must_check rangeset_overlaps_range(
68     struct rangeset *r, unsigned long s, unsigned long e);
69 int rangeset_report_ranges(
70     struct rangeset *r, unsigned long s, unsigned long e,
71     int (*cb)(unsigned long s, unsigned long e, void *), void *ctxt);
72 
73 /*
74  * Note that the consume function can return an error value apart from
75  * -ERESTART, and that no cleanup is performed (ie: the user should call
76  * rangeset_destroy if needed).
77  */
78 int rangeset_consume_ranges(struct rangeset *r,
79                             int (*cb)(unsigned long s, unsigned long e,
80                                       void *, unsigned long *c),
81                             void *ctxt);
82 
83 /* Merge rangeset r2 into rangeset r1. */
84 int __must_check rangeset_merge(struct rangeset *r1, struct rangeset *r2);
85 
86 /* Add/remove/query a single number. */
87 int __must_check rangeset_add_singleton(
88     struct rangeset *r, unsigned long s);
89 int __must_check rangeset_remove_singleton(
90     struct rangeset *r, unsigned long s);
91 bool_t __must_check rangeset_contains_singleton(
92     struct rangeset *r, unsigned long s);
93 
94 /* swap contents */
95 void rangeset_swap(struct rangeset *a, struct rangeset *b);
96 
97 /* Rangeset pretty printing. */
98 void rangeset_domain_printk(
99     struct domain *d);
100 
101 #endif /* __XEN_RANGESET_H__ */
102 
103 /*
104  * Local variables:
105  * mode: C
106  * c-file-style: "BSD"
107  * c-basic-offset: 4
108  * tab-width: 4
109  * indent-tabs-mode: nil
110  * End:
111  */
112