xref: /openbmc/qemu/include/exec/memory_ldst_cached.h.inc (revision 62c0ac5041e9130b041adfa13a41583d3c3ddd24)
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