1*fe1a3aceSPhilippe Mathieu-Daudé /* 2*fe1a3aceSPhilippe Mathieu-Daudé * Probe guest virtual addresses for access permissions. 3*fe1a3aceSPhilippe Mathieu-Daudé * 4*fe1a3aceSPhilippe Mathieu-Daudé * Copyright (c) 2003 Fabrice Bellard 5*fe1a3aceSPhilippe Mathieu-Daudé * SPDX-License-Identifier: LGPL-2.1-or-later 6*fe1a3aceSPhilippe Mathieu-Daudé */ 7*fe1a3aceSPhilippe Mathieu-Daudé #ifndef ACCEL_TCG_PROBE_H 8*fe1a3aceSPhilippe Mathieu-Daudé #define ACCEL_TCG_PROBE_H 9*fe1a3aceSPhilippe Mathieu-Daudé 10*fe1a3aceSPhilippe Mathieu-Daudé #include "exec/mmu-access-type.h" 11*fe1a3aceSPhilippe Mathieu-Daudé #include "exec/vaddr.h" 12*fe1a3aceSPhilippe Mathieu-Daudé 13*fe1a3aceSPhilippe Mathieu-Daudé /** 14*fe1a3aceSPhilippe Mathieu-Daudé * probe_access: 15*fe1a3aceSPhilippe Mathieu-Daudé * @env: CPUArchState 16*fe1a3aceSPhilippe Mathieu-Daudé * @addr: guest virtual address to look up 17*fe1a3aceSPhilippe Mathieu-Daudé * @size: size of the access 18*fe1a3aceSPhilippe Mathieu-Daudé * @access_type: read, write or execute permission 19*fe1a3aceSPhilippe Mathieu-Daudé * @mmu_idx: MMU index to use for lookup 20*fe1a3aceSPhilippe Mathieu-Daudé * @retaddr: return address for unwinding 21*fe1a3aceSPhilippe Mathieu-Daudé * 22*fe1a3aceSPhilippe Mathieu-Daudé * Look up the guest virtual address @addr. Raise an exception if the 23*fe1a3aceSPhilippe Mathieu-Daudé * page does not satisfy @access_type. Raise an exception if the 24*fe1a3aceSPhilippe Mathieu-Daudé * access (@addr, @size) hits a watchpoint. For writes, mark a clean 25*fe1a3aceSPhilippe Mathieu-Daudé * page as dirty. 26*fe1a3aceSPhilippe Mathieu-Daudé * 27*fe1a3aceSPhilippe Mathieu-Daudé * Finally, return the host address for a page that is backed by RAM, 28*fe1a3aceSPhilippe Mathieu-Daudé * or NULL if the page requires I/O. 29*fe1a3aceSPhilippe Mathieu-Daudé */ 30*fe1a3aceSPhilippe Mathieu-Daudé void *probe_access(CPUArchState *env, vaddr addr, int size, 31*fe1a3aceSPhilippe Mathieu-Daudé MMUAccessType access_type, int mmu_idx, uintptr_t retaddr); 32*fe1a3aceSPhilippe Mathieu-Daudé 33*fe1a3aceSPhilippe Mathieu-Daudé static inline void *probe_write(CPUArchState *env, vaddr addr, int size, 34*fe1a3aceSPhilippe Mathieu-Daudé int mmu_idx, uintptr_t retaddr) 35*fe1a3aceSPhilippe Mathieu-Daudé { 36*fe1a3aceSPhilippe Mathieu-Daudé return probe_access(env, addr, size, MMU_DATA_STORE, mmu_idx, retaddr); 37*fe1a3aceSPhilippe Mathieu-Daudé } 38*fe1a3aceSPhilippe Mathieu-Daudé 39*fe1a3aceSPhilippe Mathieu-Daudé static inline void *probe_read(CPUArchState *env, vaddr addr, int size, 40*fe1a3aceSPhilippe Mathieu-Daudé int mmu_idx, uintptr_t retaddr) 41*fe1a3aceSPhilippe Mathieu-Daudé { 42*fe1a3aceSPhilippe Mathieu-Daudé return probe_access(env, addr, size, MMU_DATA_LOAD, mmu_idx, retaddr); 43*fe1a3aceSPhilippe Mathieu-Daudé } 44*fe1a3aceSPhilippe Mathieu-Daudé 45*fe1a3aceSPhilippe Mathieu-Daudé /** 46*fe1a3aceSPhilippe Mathieu-Daudé * probe_access_flags: 47*fe1a3aceSPhilippe Mathieu-Daudé * @env: CPUArchState 48*fe1a3aceSPhilippe Mathieu-Daudé * @addr: guest virtual address to look up 49*fe1a3aceSPhilippe Mathieu-Daudé * @size: size of the access 50*fe1a3aceSPhilippe Mathieu-Daudé * @access_type: read, write or execute permission 51*fe1a3aceSPhilippe Mathieu-Daudé * @mmu_idx: MMU index to use for lookup 52*fe1a3aceSPhilippe Mathieu-Daudé * @nonfault: suppress the fault 53*fe1a3aceSPhilippe Mathieu-Daudé * @phost: return value for host address 54*fe1a3aceSPhilippe Mathieu-Daudé * @retaddr: return address for unwinding 55*fe1a3aceSPhilippe Mathieu-Daudé * 56*fe1a3aceSPhilippe Mathieu-Daudé * Similar to probe_access, loosely returning the TLB_FLAGS_MASK for 57*fe1a3aceSPhilippe Mathieu-Daudé * the page, and storing the host address for RAM in @phost. 58*fe1a3aceSPhilippe Mathieu-Daudé * 59*fe1a3aceSPhilippe Mathieu-Daudé * If @nonfault is set, do not raise an exception but return TLB_INVALID_MASK. 60*fe1a3aceSPhilippe Mathieu-Daudé * Do not handle watchpoints, but include TLB_WATCHPOINT in the returned flags. 61*fe1a3aceSPhilippe Mathieu-Daudé * Do handle clean pages, so exclude TLB_NOTDIRY from the returned flags. 62*fe1a3aceSPhilippe Mathieu-Daudé * For simplicity, all "mmio-like" flags are folded to TLB_MMIO. 63*fe1a3aceSPhilippe Mathieu-Daudé */ 64*fe1a3aceSPhilippe Mathieu-Daudé int probe_access_flags(CPUArchState *env, vaddr addr, int size, 65*fe1a3aceSPhilippe Mathieu-Daudé MMUAccessType access_type, int mmu_idx, 66*fe1a3aceSPhilippe Mathieu-Daudé bool nonfault, void **phost, uintptr_t retaddr); 67*fe1a3aceSPhilippe Mathieu-Daudé 68*fe1a3aceSPhilippe Mathieu-Daudé #ifndef CONFIG_USER_ONLY 69*fe1a3aceSPhilippe Mathieu-Daudé 70*fe1a3aceSPhilippe Mathieu-Daudé /** 71*fe1a3aceSPhilippe Mathieu-Daudé * probe_access_full: 72*fe1a3aceSPhilippe Mathieu-Daudé * Like probe_access_flags, except also return into @pfull. 73*fe1a3aceSPhilippe Mathieu-Daudé * 74*fe1a3aceSPhilippe Mathieu-Daudé * The CPUTLBEntryFull structure returned via @pfull is transient 75*fe1a3aceSPhilippe Mathieu-Daudé * and must be consumed or copied immediately, before any further 76*fe1a3aceSPhilippe Mathieu-Daudé * access or changes to TLB @mmu_idx. 77*fe1a3aceSPhilippe Mathieu-Daudé * 78*fe1a3aceSPhilippe Mathieu-Daudé * This function will not fault if @nonfault is set, but will 79*fe1a3aceSPhilippe Mathieu-Daudé * return TLB_INVALID_MASK if the page is not mapped, or is not 80*fe1a3aceSPhilippe Mathieu-Daudé * accessible with @access_type. 81*fe1a3aceSPhilippe Mathieu-Daudé * 82*fe1a3aceSPhilippe Mathieu-Daudé * This function will return TLB_MMIO in order to force the access 83*fe1a3aceSPhilippe Mathieu-Daudé * to be handled out-of-line if plugins wish to instrument the access. 84*fe1a3aceSPhilippe Mathieu-Daudé */ 85*fe1a3aceSPhilippe Mathieu-Daudé int probe_access_full(CPUArchState *env, vaddr addr, int size, 86*fe1a3aceSPhilippe Mathieu-Daudé MMUAccessType access_type, int mmu_idx, 87*fe1a3aceSPhilippe Mathieu-Daudé bool nonfault, void **phost, 88*fe1a3aceSPhilippe Mathieu-Daudé CPUTLBEntryFull **pfull, uintptr_t retaddr); 89*fe1a3aceSPhilippe Mathieu-Daudé 90*fe1a3aceSPhilippe Mathieu-Daudé /** 91*fe1a3aceSPhilippe Mathieu-Daudé * probe_access_full_mmu: 92*fe1a3aceSPhilippe Mathieu-Daudé * Like probe_access_full, except: 93*fe1a3aceSPhilippe Mathieu-Daudé * 94*fe1a3aceSPhilippe Mathieu-Daudé * This function is intended to be used for page table accesses by 95*fe1a3aceSPhilippe Mathieu-Daudé * the target mmu itself. Since such page walking happens while 96*fe1a3aceSPhilippe Mathieu-Daudé * handling another potential mmu fault, this function never raises 97*fe1a3aceSPhilippe Mathieu-Daudé * exceptions (akin to @nonfault true for probe_access_full). 98*fe1a3aceSPhilippe Mathieu-Daudé * Likewise this function does not trigger plugin instrumentation. 99*fe1a3aceSPhilippe Mathieu-Daudé */ 100*fe1a3aceSPhilippe Mathieu-Daudé int probe_access_full_mmu(CPUArchState *env, vaddr addr, int size, 101*fe1a3aceSPhilippe Mathieu-Daudé MMUAccessType access_type, int mmu_idx, 102*fe1a3aceSPhilippe Mathieu-Daudé void **phost, CPUTLBEntryFull **pfull); 103*fe1a3aceSPhilippe Mathieu-Daudé 104*fe1a3aceSPhilippe Mathieu-Daudé #endif /* !CONFIG_USER_ONLY */ 105*fe1a3aceSPhilippe Mathieu-Daudé 106*fe1a3aceSPhilippe Mathieu-Daudé #endif 107