| /* SPDX-License-Identifier: GPL-2.0-or-later */ |
| /* Access guest memory in blocks. */ |
| |
| #ifndef X86_TCG_ACCESS_H |
| #define X86_TCG_ACCESS_H |
| |
| /* An access covers at most sizeof(X86XSaveArea), at most 2 pages. */ |
| typedef struct X86Access { |
| target_ulong vaddr; |
| void *haddr1; |
| void *haddr2; |
| uint16_t size; |
| uint16_t size1; |
| /* |
| * If we can't access the host page directly, we'll have to do I/O access |
| * via ld/st helpers. These are internal details, so we store the rest |
| * to do the access here instead of passing it around in the helpers. |
| */ |
| int mmu_idx; |
| CPUX86State *env; |
| uintptr_t ra; |
| } X86Access; |
| |
| void access_prepare_mmu(X86Access *ret, CPUX86State *env, |
| vaddr vaddr, unsigned size, |
| MMUAccessType type, int mmu_idx, uintptr_t ra); |
| void access_prepare(X86Access *ret, CPUX86State *env, vaddr vaddr, |
| unsigned size, MMUAccessType type, uintptr_t ra); |
| |
| uint8_t access_ldb(X86Access *ac, vaddr addr); |
| uint16_t access_ldw(X86Access *ac, vaddr addr); |
| uint32_t access_ldl(X86Access *ac, vaddr addr); |
| uint64_t access_ldq(X86Access *ac, vaddr addr); |
| |
| void access_stb(X86Access *ac, vaddr addr, uint8_t val); |
| void access_stw(X86Access *ac, vaddr addr, uint16_t val); |
| void access_stl(X86Access *ac, vaddr addr, uint32_t val); |
| void access_stq(X86Access *ac, vaddr addr, uint64_t val); |
| |
| #endif |