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