10979ed01SPaolo Bonzini/* 20979ed01SPaolo Bonzini * Memory access templates for MemoryRegionCache 30979ed01SPaolo Bonzini * 40979ed01SPaolo Bonzini * Copyright (c) 2018 Red Hat, Inc. 50979ed01SPaolo Bonzini * 60979ed01SPaolo Bonzini * This library is free software; you can redistribute it and/or 70979ed01SPaolo Bonzini * modify it under the terms of the GNU Lesser General Public 80979ed01SPaolo Bonzini * License as published by the Free Software Foundation; either 961f3c91aSChetan Pant * version 2.1 of the License, or (at your option) any later version. 100979ed01SPaolo Bonzini * 110979ed01SPaolo Bonzini * This library is distributed in the hope that it will be useful, 120979ed01SPaolo Bonzini * but WITHOUT ANY WARRANTY; without even the implied warranty of 130979ed01SPaolo Bonzini * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 140979ed01SPaolo Bonzini * Lesser General Public License for more details. 150979ed01SPaolo Bonzini * 160979ed01SPaolo Bonzini * You should have received a copy of the GNU Lesser General Public 170979ed01SPaolo Bonzini * License along with this library; if not, see <http://www.gnu.org/licenses/>. 180979ed01SPaolo Bonzini */ 190979ed01SPaolo Bonzini 200979ed01SPaolo Bonzini#define ADDRESS_SPACE_LD_CACHED(size) \ 210979ed01SPaolo Bonzini glue(glue(address_space_ld, size), glue(ENDIANNESS, _cached)) 220979ed01SPaolo Bonzini#define ADDRESS_SPACE_LD_CACHED_SLOW(size) \ 230979ed01SPaolo Bonzini glue(glue(address_space_ld, size), glue(ENDIANNESS, _cached_slow)) 240979ed01SPaolo Bonzini#define LD_P(size) \ 250979ed01SPaolo Bonzini glue(glue(ld, size), glue(ENDIANNESS, _p)) 260979ed01SPaolo Bonzini 27*4045f49cSPhilippe Mathieu-Daudéstatic inline uint16_t ADDRESS_SPACE_LD_CACHED(uw)(MemoryRegionCache *cache, 280a73d7acSPhilippe Mathieu-Daudé hwaddr addr, MemTxAttrs attrs, MemTxResult *result) 290a73d7acSPhilippe Mathieu-Daudé{ 300a73d7acSPhilippe Mathieu-Daudé assert(addr < cache->len && 2 <= cache->len - addr); 310a73d7acSPhilippe Mathieu-Daudé fuzz_dma_read_cb(cache->xlat + addr, 2, cache->mrs.mr); 320a73d7acSPhilippe Mathieu-Daudé if (likely(cache->ptr)) { 330a73d7acSPhilippe Mathieu-Daudé return LD_P(uw)(cache->ptr + addr); 340a73d7acSPhilippe Mathieu-Daudé } else { 350a73d7acSPhilippe Mathieu-Daudé return ADDRESS_SPACE_LD_CACHED_SLOW(uw)(cache, addr, attrs, result); 360a73d7acSPhilippe Mathieu-Daudé } 370a73d7acSPhilippe Mathieu-Daudé} 380a73d7acSPhilippe Mathieu-Daudé 390979ed01SPaolo Bonzinistatic inline uint32_t ADDRESS_SPACE_LD_CACHED(l)(MemoryRegionCache *cache, 400979ed01SPaolo Bonzini hwaddr addr, MemTxAttrs attrs, MemTxResult *result) 410979ed01SPaolo Bonzini{ 420979ed01SPaolo Bonzini assert(addr < cache->len && 4 <= cache->len - addr); 43fc1c8344SAlexander Bulekov fuzz_dma_read_cb(cache->xlat + addr, 4, cache->mrs.mr); 440979ed01SPaolo Bonzini if (likely(cache->ptr)) { 450979ed01SPaolo Bonzini return LD_P(l)(cache->ptr + addr); 460979ed01SPaolo Bonzini } else { 470979ed01SPaolo Bonzini return ADDRESS_SPACE_LD_CACHED_SLOW(l)(cache, addr, attrs, result); 480979ed01SPaolo Bonzini } 490979ed01SPaolo Bonzini} 500979ed01SPaolo Bonzini 510979ed01SPaolo Bonzinistatic inline uint64_t ADDRESS_SPACE_LD_CACHED(q)(MemoryRegionCache *cache, 520979ed01SPaolo Bonzini hwaddr addr, MemTxAttrs attrs, MemTxResult *result) 530979ed01SPaolo Bonzini{ 540979ed01SPaolo Bonzini assert(addr < cache->len && 8 <= cache->len - addr); 55fc1c8344SAlexander Bulekov fuzz_dma_read_cb(cache->xlat + addr, 8, cache->mrs.mr); 560979ed01SPaolo Bonzini if (likely(cache->ptr)) { 570979ed01SPaolo Bonzini return LD_P(q)(cache->ptr + addr); 580979ed01SPaolo Bonzini } else { 590979ed01SPaolo Bonzini return ADDRESS_SPACE_LD_CACHED_SLOW(q)(cache, addr, attrs, result); 600979ed01SPaolo Bonzini } 610979ed01SPaolo Bonzini} 620979ed01SPaolo Bonzini 630979ed01SPaolo Bonzini#undef ADDRESS_SPACE_LD_CACHED 640979ed01SPaolo Bonzini#undef ADDRESS_SPACE_LD_CACHED_SLOW 650979ed01SPaolo Bonzini#undef LD_P 660979ed01SPaolo Bonzini 670979ed01SPaolo Bonzini#define ADDRESS_SPACE_ST_CACHED(size) \ 680979ed01SPaolo Bonzini glue(glue(address_space_st, size), glue(ENDIANNESS, _cached)) 690979ed01SPaolo Bonzini#define ADDRESS_SPACE_ST_CACHED_SLOW(size) \ 700979ed01SPaolo Bonzini glue(glue(address_space_st, size), glue(ENDIANNESS, _cached_slow)) 710979ed01SPaolo Bonzini#define ST_P(size) \ 720979ed01SPaolo Bonzini glue(glue(st, size), glue(ENDIANNESS, _p)) 730979ed01SPaolo Bonzini 740979ed01SPaolo Bonzinistatic inline void ADDRESS_SPACE_ST_CACHED(w)(MemoryRegionCache *cache, 75*4045f49cSPhilippe Mathieu-Daudé hwaddr addr, uint16_t val, MemTxAttrs attrs, MemTxResult *result) 760979ed01SPaolo Bonzini{ 770979ed01SPaolo Bonzini assert(addr < cache->len && 2 <= cache->len - addr); 780979ed01SPaolo Bonzini if (likely(cache->ptr)) { 790979ed01SPaolo Bonzini ST_P(w)(cache->ptr + addr, val); 800979ed01SPaolo Bonzini } else { 810979ed01SPaolo Bonzini ADDRESS_SPACE_ST_CACHED_SLOW(w)(cache, addr, val, attrs, result); 820979ed01SPaolo Bonzini } 830979ed01SPaolo Bonzini} 840979ed01SPaolo Bonzini 850a73d7acSPhilippe Mathieu-Daudéstatic inline void ADDRESS_SPACE_ST_CACHED(l)(MemoryRegionCache *cache, 860a73d7acSPhilippe Mathieu-Daudé hwaddr addr, uint32_t val, MemTxAttrs attrs, MemTxResult *result) 870a73d7acSPhilippe Mathieu-Daudé{ 880a73d7acSPhilippe Mathieu-Daudé assert(addr < cache->len && 4 <= cache->len - addr); 890a73d7acSPhilippe Mathieu-Daudé if (likely(cache->ptr)) { 900a73d7acSPhilippe Mathieu-Daudé ST_P(l)(cache->ptr + addr, val); 910a73d7acSPhilippe Mathieu-Daudé } else { 920a73d7acSPhilippe Mathieu-Daudé ADDRESS_SPACE_ST_CACHED_SLOW(l)(cache, addr, val, attrs, result); 930a73d7acSPhilippe Mathieu-Daudé } 940a73d7acSPhilippe Mathieu-Daudé} 950a73d7acSPhilippe Mathieu-Daudé 960979ed01SPaolo Bonzinistatic inline void ADDRESS_SPACE_ST_CACHED(q)(MemoryRegionCache *cache, 970979ed01SPaolo Bonzini hwaddr addr, uint64_t val, MemTxAttrs attrs, MemTxResult *result) 980979ed01SPaolo Bonzini{ 990979ed01SPaolo Bonzini assert(addr < cache->len && 8 <= cache->len - addr); 1000979ed01SPaolo Bonzini if (likely(cache->ptr)) { 1010979ed01SPaolo Bonzini ST_P(q)(cache->ptr + addr, val); 1020979ed01SPaolo Bonzini } else { 1030979ed01SPaolo Bonzini ADDRESS_SPACE_ST_CACHED_SLOW(q)(cache, addr, val, attrs, result); 1040979ed01SPaolo Bonzini } 1050979ed01SPaolo Bonzini} 1060979ed01SPaolo Bonzini 1070979ed01SPaolo Bonzini#undef ADDRESS_SPACE_ST_CACHED 1080979ed01SPaolo Bonzini#undef ADDRESS_SPACE_ST_CACHED_SLOW 1090979ed01SPaolo Bonzini#undef ST_P 1100979ed01SPaolo Bonzini 1110979ed01SPaolo Bonzini#undef ENDIANNESS 112