1 /* 2 * Copyright (c) 2013-2018 The strace developers. 3 * 4 * Redistribution and use in source and binary forms, with or without 5 * modification, are permitted provided that the following conditions 6 * are met: 7 * 1. Redistributions of source code must retain the above copyright 8 * notice, this list of conditions and the following disclaimer. 9 * 2. Redistributions in binary form must reproduce the above copyright 10 * notice, this list of conditions and the following disclaimer in the 11 * documentation and/or other materials provided with the distribution. 12 * 3. The name of the author may not be used to endorse or promote products 13 * derived from this software without specific prior written permission. 14 * 15 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 16 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 17 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 18 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 19 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 20 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 21 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 22 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 23 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 24 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 25 */ 26 27 #ifndef STRACE_MMAP_CACHE_H 28 #define STRACE_MMAP_CACHE_H 29 30 /* 31 * Keep a sorted array of cache entries, 32 * so that we can binary search through it. 33 */ 34 35 struct mmap_cache_t { 36 struct mmap_cache_entry_t *entry; 37 void (*free_fn)(struct tcb *, const char *caller); 38 unsigned int size; 39 unsigned int generation; 40 }; 41 42 struct mmap_cache_entry_t { 43 /** 44 * example entry: 45 * 7fabbb09b000-7fabbb09f000 r-xp 00179000 fc:00 1180246 /lib/libc-2.11.1.so 46 * 47 * start_addr is 0x7fabbb09b000 48 * end_addr is 0x7fabbb09f000 49 * mmap_offset is 0x179000 50 * protections is MMAP_CACHE_PROT_READABLE|MMAP_CACHE_PROT_EXECUTABLE 51 * major is 0xfc 52 * minor is 0x00 53 * binary_filename is "/lib/libc-2.11.1.so" 54 */ 55 unsigned long start_addr; 56 unsigned long end_addr; 57 unsigned long mmap_offset; 58 unsigned char protections; 59 unsigned long major, minor; 60 char *binary_filename; 61 }; 62 63 enum mmap_cache_protection { 64 MMAP_CACHE_PROT_READABLE = 1 << 0, 65 MMAP_CACHE_PROT_WRITABLE = 1 << 1, 66 MMAP_CACHE_PROT_EXECUTABLE = 1 << 2, 67 MMAP_CACHE_PROT_SHARED = 1 << 3, 68 }; 69 70 enum mmap_cache_rebuild_result { 71 MMAP_CACHE_REBUILD_NOCACHE, 72 MMAP_CACHE_REBUILD_READY, 73 MMAP_CACHE_REBUILD_RENEWED, 74 }; 75 76 typedef bool (*mmap_cache_search_fn)(struct mmap_cache_entry_t *, void *); 77 78 extern void 79 mmap_cache_enable(void); 80 81 extern enum mmap_cache_rebuild_result 82 mmap_cache_rebuild_if_invalid(struct tcb *, const char *caller); 83 84 extern struct mmap_cache_entry_t * 85 mmap_cache_search(struct tcb *, unsigned long ip); 86 87 extern struct mmap_cache_entry_t * 88 mmap_cache_search_custom(struct tcb *, mmap_cache_search_fn, void *); 89 90 #endif /* !STRACE_MMAP_CACHE_H */ 91