Hallo, dies ist ein Test.
PWD: /www/data-lst1/unixsoft/unixsoft/kaempfer/.public_html
Running in File Mode
Relative path: ./../.././../../../../usr/include/vm/util.h
Real path: /usr/include/vm/util.h
Zurück
/* * Copyright (c) 2012, 2021, Oracle and/or its affiliates. */ #ifndef _VM_UTIL_H #define _VM_UTIL_H #include <sys/avl.h> #include <sys/systm.h> #include <vm/types.h> #ifdef __cplusplus extern "C" { #endif /* * DR ranges are kept in an AVL tree sorted by pfnr_spfn. Ranges are not * allowed to overlap, and may only be merged if all of: * * pfnr_data, pfnr_mgid, and pfnr_mnodeid * * match. */ typedef struct pfn_range { avl_node_t pfnr_node; pfn_t pfnr_spfn; pfn_t pfnr_epfn; uint8_t pfnr_type; /* type of pfn_range */ } pfn_range_t; typedef enum drdel_type { DRDT_MEMSEG = 0, /* no mgid, has associated memseg */ DRDT_FAKEDR, /* no mgid, no memseg */ DRDT_PLAT_MISSING, /* no mgid, no memseg */ DRDT_NTYPES /* must be last */ } drdel_type_t; typedef struct drdel_range_t { pfn_range_t drdr_range; drdel_type_t drdr_type; /* remainder are set for DRDT_MEMSEG only */ struct memseg *drdr_seg; /* the memseg for this range */ rm_t *drdr_rml; /* after capture, the RMs */ } drdel_range_t; #define drdr_spfn drdr_range.pfnr_spfn #define drdr_epfn drdr_range.pfnr_epfn #define DRDR_TO_PFNR(drdr) (&((drdr)->drdr_range)) #define PFNR_TO_DRDR(drr) ((drdel_range_t *)(drr)) typedef enum { PFNRT_NORMAL = 0, /* nodes are pfn_range_t */ PFNRT_DEL, /* nodes are drdel_range_t */ PFNRT_NTYPES } pfn_range_type_t; struct pfn_rangeset { avl_tree_t prs_tree; /* tree of nodes */ pgcnt_t prs_total; /* pgcnt of tree nodes */ size_t prs_nodesize; /* size of tree nodes */ pfn_range_type_t prs_type; /* type of tree */ }; typedef struct drdel_rangeset { pfn_rangeset_t drdrs_rs; } drdel_rangeset_t; /* * ------------------------------------------------------------------ * Internal interfaces. * * Yes, we mean it. */ #ifdef _KERNEL typedef void pfn_rangeset_walk_cb_t(pfn_range_t *, void *); typedef void pfn_rangeset_walk_pfns_cb_t(pfn_t, pfn_t, void *); extern void pfn_rangeset_init(pfn_rangeset_t *); extern void pfn_rangeset_teardown(pfn_rangeset_t *); extern void pfn_rangeset_fini(pfn_rangeset_t *); extern size_t pfn_rangeset_ranges(const pfn_rangeset_t *); extern pgcnt_t pfn_rangeset_pages(const pfn_rangeset_t *); extern pfn_range_t *pfn_rangeset_find(pfn_rangeset_t *, pfn_t, pfn_t); extern boolean_t pfn_rangeset_contains_all(pfn_rangeset_t *, pfn_t, pfn_t); extern void pfn_rangeset_add(pfn_rangeset_t *, pfn_t, pfn_t); extern void pfn_rangeset_remove(pfn_rangeset_t *, pfn_t, pfn_t); extern pfn_t pfn_rangeset_alloc_aligned(pfn_rangeset_t *, pgcnt_t, pgcnt_t); extern void pfn_rangeset_walk(pfn_rangeset_t *, pfn_rangeset_walk_cb_t *, void *); extern void pfn_rangeset_walk_pfns(pfn_rangeset_t *, pfn_rangeset_walk_pfns_cb_t *, void *); typedef void drdel_rangeset_walk_cb_t(drdel_range_t *, void *); extern void drdel_rangeset_init(drdel_rangeset_t *); extern void drdel_rangeset_teardown(drdel_rangeset_t *); extern void drdel_rangeset_fini(drdel_rangeset_t *); extern void drdel_rangeset_add(drdel_rangeset_t *, pfn_t, pfn_t, drdel_type_t, struct memseg *); extern void drdel_rangeset_walk(drdel_rangeset_t *, drdel_rangeset_walk_cb_t *, void *); extern drdel_range_t *drdel_rangeset_find(drdel_rangeset_t *, pfn_t, pfn_t); extern drdel_range_t *drdel_rangeset_next(drdel_rangeset_t *, drdel_range_t *); extern void drdel_rangeset_walk_pfns(drdel_rangeset_t *, pfn_rangeset_walk_pfns_cb_t *, void *); /* * PFN range manipulations */ extern pfnrange_t pfnrange(pfn_t, pfn_t); extern pgcnt_t pfnrange_count(pfnrange_t); extern uint_t pfnrange_contains(pfnrange_t, pfn_t); extern uint_t pfnrange_empty(pfnrange_t); extern uint_t pfnrange_equal(pfnrange_t, pfnrange_t); extern uint_t pfnrange_is_subset(pfnrange_t, pfnrange_t); extern pfnrange_t pfnrange_include(pfnrange_t, pfn_t, pfn_t); extern pfnrange_t pfnrange_include_pfn(pfnrange_t, pfn_t); extern pfnrange_t pfnrange_join(pfnrange_t, pfnrange_t); extern pfnrange_t pfnrange_intersect(pfnrange_t, pfnrange_t); extern pfnrange_t pfnrange_nothing(void); /* * SGL interfaces */ extern sgl_t *sgl_alloc(size_t, int); extern size_t sgl_size(size_t); extern void sgl_init(sgl_t *, size_t); extern void sgl_clear(sgl_t *); extern void sgl_free(sgl_t *); extern void sgl_sort(sgl_t *); extern void sgl_add(sgl_t *, u_offset_t, uint_t); extern void sgl_add_rounded_range(sgl_t *, u_offset_t, size_t, size_t); extern boolean_t sgl_is_empty(const sgl_t *); extern boolean_t sgl_is_full(const sgl_t *); extern size_t sgl_get_referenced_length(const sgl_t *); typedef int sgl_iterate_cb_f(u_offset_t, u_offset_t, void *); extern int sgl_iterate(const sgl_t *, sgl_iterate_cb_f *, void *); /* * The actual implementation of this is opaque to the callers, but we must * expose the size so it can be stack-allocated. */ #define OFFITER_WORDS 4 struct offiter { uintptr_t offi_opaque[OFFITER_WORDS]; }; extern void offiter_setup_sgl(offiter_t *, const sgl_t *); extern void offiter_setup_range(offiter_t *, u_offset_t, u_offset_t); extern void offiter_setup_empty(offiter_t *); extern void offiter_copy(offiter_t *, const offiter_t *); extern void offiter_unsetup(const offiter_t *, u_offset_t *, u_offset_t *, const sgl_t **); extern boolean_t offiter_is_empty(const offiter_t *); extern size_t offiter_next(offiter_t *, u_offset_t *); extern boolean_t offiter_contains(const offiter_t *, u_offset_t, u_offset_t); extern size_t offiter_length(const offiter_t *); typedef int offiter_walk_cb_f(u_offset_t, u_offset_t, u_offset_t *, void *); extern int offiter_walk(const offiter_t *, offiter_walk_cb_f *, void *); #define OFFITER_INTERSECT_WORDS (2*OFFITER_WORDS + 4) struct offiter_intersect { uintptr_t offii_opaque[OFFITER_INTERSECT_WORDS]; }; extern boolean_t offiter_intersect_setup_offis(offiter_intersect_t *, const offiter_t *, const offiter_t *); extern boolean_t offiter_intersect_setup_offi_range(offiter_intersect_t *, const offiter_t *, u_offset_t, u_offset_t); extern boolean_t offiter_intersect_setup_offi_sgl(offiter_intersect_t *, const offiter_t *, const sgl_t *); /* used by MW callbacks */ extern size_t offiter_intersect_next(offiter_intersect_t *, u_offset_t *); extern boolean_t offiter_intersect_peek(offiter_intersect_t *); /* generic vm helper routines */ extern szc_t szc_for_size(size_t); extern szc_t szc_atmost_bytes(size_t); #endif /* _KERNEL */ #ifdef __cplusplus } #endif #endif /* _VM_UTIL_H */