1 /* 2 * Copyright (c) 2017-2019, Intel Corporation 3 * 4 * Redistribution and use in source and binary forms, with or without 5 * modification, are permitted provided that the following conditions are met: 6 * 7 * * Redistributions of source code must retain the above copyright notice, 8 * this list of conditions and the following disclaimer. 9 * * Redistributions in binary form must reproduce the above copyright notice, 10 * this list of conditions and the following disclaimer in the documentation 11 * and/or other materials provided with the distribution. 12 * * Neither the name of Intel Corporation nor the names of its contributors 13 * may be used to endorse or promote products derived from this software 14 * without specific prior written permission. 15 * 16 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 17 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 18 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 19 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE 20 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 21 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 22 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 23 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 24 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 25 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 26 * POSSIBILITY OF SUCH DAMAGE. 27 */ 28 29 #ifndef PT_MSEC_CACHE_H 30 #define PT_MSEC_CACHE_H 31 32 #include "pt_mapped_section.h" 33 34 #include "intel-pt.h" 35 36 37 /* A single-entry mapped section cache. 38 * 39 * The cached section is implicitly mapped and unmapped. The cache is not 40 * thread-safe. 41 */ 42 struct pt_msec_cache { 43 /* The cached section. 44 * 45 * The cache is valid if and only if @msec.section is not NULL. 46 * 47 * It needs to be unmapped and put. Use pt_blk_scache_invalidate() to 48 * release the cached section and to invalidate the cache. 49 */ 50 struct pt_mapped_section msec; 51 52 /* The section identifier. */ 53 int isid; 54 }; 55 56 /* Initialize the cache. */ 57 extern int pt_msec_cache_init(struct pt_msec_cache *cache); 58 59 /* Finalize the cache. */ 60 extern void pt_msec_cache_fini(struct pt_msec_cache *cache); 61 62 /* Invalidate the cache. */ 63 extern int pt_msec_cache_invalidate(struct pt_msec_cache *cache); 64 65 /* Read the cached section. 66 * 67 * If @cache is not empty and @image would find it when looking up @vaddr in 68 * @*pmsec->asid, provide a pointer to the cached section in @pmsec and return 69 * its image section identifier. 70 * 71 * The provided pointer remains valid until @cache is invalidated. 72 * 73 * Returns @*pmsec's isid on success, a negative pt_error_code otherwise. 74 */ 75 extern int pt_msec_cache_read(struct pt_msec_cache *cache, 76 const struct pt_mapped_section **pmsec, 77 struct pt_image *image, uint64_t vaddr); 78 79 /* Fill the cache. 80 * 81 * Look up @vaddr in @asid in @image and cache as well as provide the found 82 * section in @pmsec and return its image section identifier. 83 * 84 * Invalidates @cache. 85 * 86 * The provided pointer remains valid until @cache is invalidated. 87 * 88 * Returns @*pmsec's isid on success, a negative pt_error_code otherwise. 89 */ 90 extern int pt_msec_cache_fill(struct pt_msec_cache *cache, 91 const struct pt_mapped_section **pmsec, 92 struct pt_image *image, 93 const struct pt_asid *asid, uint64_t vaddr); 94 95 #endif /* PT_MSEC_CACHE_H */ 96