| 1 | /* SPDX-License-Identifier: GPL-2.0-or-later */ |
| 2 | /* Access guest memory in blocks. */ |
| 3 | |
| 4 | #ifndef X86_TCG_ACCESS_H |
| 5 | #define X86_TCG_ACCESS_H |
| 6 | |
| 7 | /* An access covers at most sizeof(X86XSaveArea), at most 2 pages. */ |
| 8 | typedef struct X86Access { |
| 9 | target_ulong vaddr; |
| 10 | void *haddr1; |
| 11 | void *haddr2; |
| 12 | uint16_t size; |
| 13 | uint16_t size1; |
| 14 | /* |
| 15 | * If we can't access the host page directly, we'll have to do I/O access |
| 16 | * via ld/st helpers. These are internal details, so we store the rest |
| 17 | * to do the access here instead of passing it around in the helpers. |
| 18 | */ |
| 19 | int mmu_idx; |
| 20 | CPUX86State *env; |
| 21 | uintptr_t ra; |
| 22 | } X86Access; |
| 23 | |
| 24 | void access_prepare_mmu(X86Access *ret, CPUX86State *env, |
| 25 | vaddr vaddr, unsigned size, |
| 26 | MMUAccessType type, int mmu_idx, uintptr_t ra); |
| 27 | void access_prepare(X86Access *ret, CPUX86State *env, vaddr vaddr, |
| 28 | unsigned size, MMUAccessType type, uintptr_t ra); |
| 29 | |
| 30 | uint8_t access_ldb(X86Access *ac, vaddr addr); |
| 31 | uint16_t access_ldw(X86Access *ac, vaddr addr); |
| 32 | uint32_t access_ldl(X86Access *ac, vaddr addr); |
| 33 | uint64_t access_ldq(X86Access *ac, vaddr addr); |
| 34 | |
| 35 | void access_stb(X86Access *ac, vaddr addr, uint8_t val); |
| 36 | void access_stw(X86Access *ac, vaddr addr, uint16_t val); |
| 37 | void access_stl(X86Access *ac, vaddr addr, uint32_t val); |
| 38 | void access_stq(X86Access *ac, vaddr addr, uint64_t val); |
| 39 | |
| 40 | #endif |