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 /* Add/remove/query a single number. */
74 int __must_check rangeset_add_singleton(
75     struct rangeset *r, unsigned long s);
76 int __must_check rangeset_remove_singleton(
77     struct rangeset *r, unsigned long s);
78 bool_t __must_check rangeset_contains_singleton(
79     struct rangeset *r, unsigned long s);
80 
81 /* swap contents */
82 void rangeset_swap(struct rangeset *a, struct rangeset *b);
83 
84 /* Rangeset pretty printing. */
85 void rangeset_printk(
86     struct rangeset *r);
87 void rangeset_domain_printk(
88     struct domain *d);
89 
90 #endif /* __XEN_RANGESET_H__ */
91 
92 /*
93  * Local variables:
94  * mode: C
95  * c-file-style: "BSD"
96  * c-basic-offset: 4
97  * tab-width: 4
98  * indent-tabs-mode: nil
99  * End:
100  */
101