]> git.proxmox.com Git - mirror_qemu.git/blame - exec.c
migration/virtio: Remove simple .get/.put use
[mirror_qemu.git] / exec.c
CommitLineData
54936004 1/*
5b6dd868 2 * Virtual page mapping
5fafdf24 3 *
54936004
FB
4 * Copyright (c) 2003 Fabrice Bellard
5 *
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2 of the License, or (at your option) any later version.
10 *
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
15 *
16 * You should have received a copy of the GNU Lesser General Public
8167ee88 17 * License along with this library; if not, see <http://www.gnu.org/licenses/>.
54936004 18 */
67b915a5 19#include "config.h"
777872e5 20#ifndef _WIN32
a98d49b1 21#include <sys/types.h>
d5a8f07c
FB
22#include <sys/mman.h>
23#endif
54936004 24
055403b2 25#include "qemu-common.h"
6180a181 26#include "cpu.h"
b67d9a52 27#include "tcg.h"
b3c7724c 28#include "hw/hw.h"
4485bd26 29#if !defined(CONFIG_USER_ONLY)
47c8ca53 30#include "hw/boards.h"
4485bd26 31#endif
cc9e98cb 32#include "hw/qdev.h"
1de7afc9 33#include "qemu/osdep.h"
9c17d615 34#include "sysemu/kvm.h"
2ff3de68 35#include "sysemu/sysemu.h"
0d09e41a 36#include "hw/xen/xen.h"
1de7afc9
PB
37#include "qemu/timer.h"
38#include "qemu/config-file.h"
75a34036 39#include "qemu/error-report.h"
022c62cb 40#include "exec/memory.h"
9c17d615 41#include "sysemu/dma.h"
022c62cb 42#include "exec/address-spaces.h"
53a5960a
PB
43#if defined(CONFIG_USER_ONLY)
44#include <qemu.h>
432d268c 45#else /* !CONFIG_USER_ONLY */
9c17d615 46#include "sysemu/xen-mapcache.h"
6506e4f9 47#include "trace.h"
53a5960a 48#endif
0d6d3c87 49#include "exec/cpu-all.h"
0dc3f44a 50#include "qemu/rcu_queue.h"
4840f10e 51#include "qemu/main-loop.h"
5b6dd868 52#include "translate-all.h"
7615936e 53#include "sysemu/replay.h"
0cac1b66 54
022c62cb 55#include "exec/memory-internal.h"
220c3ebd 56#include "exec/ram_addr.h"
67d95c15 57
b35ba30f 58#include "qemu/range.h"
794e8f30
MT
59#ifndef _WIN32
60#include "qemu/mmap-alloc.h"
61#endif
b35ba30f 62
db7b5426 63//#define DEBUG_SUBPAGE
1196be37 64
e2eef170 65#if !defined(CONFIG_USER_ONLY)
0dc3f44a
MD
66/* ram_list is read under rcu_read_lock()/rcu_read_unlock(). Writes
67 * are protected by the ramlist lock.
68 */
0d53d9fe 69RAMList ram_list = { .blocks = QLIST_HEAD_INITIALIZER(ram_list.blocks) };
62152b8a
AK
70
71static MemoryRegion *system_memory;
309cb471 72static MemoryRegion *system_io;
62152b8a 73
f6790af6
AK
74AddressSpace address_space_io;
75AddressSpace address_space_memory;
2673a5da 76
0844e007 77MemoryRegion io_mem_rom, io_mem_notdirty;
acc9d80b 78static MemoryRegion io_mem_unassigned;
0e0df1e2 79
7bd4f430
PB
80/* RAM is pre-allocated and passed into qemu_ram_alloc_from_ptr */
81#define RAM_PREALLOC (1 << 0)
82
dbcb8981
PB
83/* RAM is mmap-ed with MAP_SHARED */
84#define RAM_SHARED (1 << 1)
85
62be4e3a
MT
86/* Only a portion of RAM (used_length) is actually used, and migrated.
87 * This used_length size can change across reboots.
88 */
89#define RAM_RESIZEABLE (1 << 2)
90
e2eef170 91#endif
9fa3e853 92
bdc44640 93struct CPUTailQ cpus = QTAILQ_HEAD_INITIALIZER(cpus);
6a00d601
FB
94/* current CPU in the current thread. It is only valid inside
95 cpu_exec() */
f240eb6f 96__thread CPUState *current_cpu;
2e70f6ef 97/* 0 = Do not count executed instructions.
bf20dc07 98 1 = Precise instruction counting.
2e70f6ef 99 2 = Adaptive rate instruction counting. */
5708fc66 100int use_icount;
6a00d601 101
e2eef170 102#if !defined(CONFIG_USER_ONLY)
4346ae3e 103
1db8abb1
PB
104typedef struct PhysPageEntry PhysPageEntry;
105
106struct PhysPageEntry {
9736e55b 107 /* How many bits skip to next level (in units of L2_SIZE). 0 for a leaf. */
8b795765 108 uint32_t skip : 6;
9736e55b 109 /* index into phys_sections (!skip) or phys_map_nodes (skip) */
8b795765 110 uint32_t ptr : 26;
1db8abb1
PB
111};
112
8b795765
MT
113#define PHYS_MAP_NODE_NIL (((uint32_t)~0) >> 6)
114
03f49957 115/* Size of the L2 (and L3, etc) page tables. */
57271d63 116#define ADDR_SPACE_BITS 64
03f49957 117
026736ce 118#define P_L2_BITS 9
03f49957
PB
119#define P_L2_SIZE (1 << P_L2_BITS)
120
121#define P_L2_LEVELS (((ADDR_SPACE_BITS - TARGET_PAGE_BITS - 1) / P_L2_BITS) + 1)
122
123typedef PhysPageEntry Node[P_L2_SIZE];
0475d94f 124
53cb28cb 125typedef struct PhysPageMap {
79e2b9ae
PB
126 struct rcu_head rcu;
127
53cb28cb
MA
128 unsigned sections_nb;
129 unsigned sections_nb_alloc;
130 unsigned nodes_nb;
131 unsigned nodes_nb_alloc;
132 Node *nodes;
133 MemoryRegionSection *sections;
134} PhysPageMap;
135
1db8abb1 136struct AddressSpaceDispatch {
79e2b9ae
PB
137 struct rcu_head rcu;
138
1db8abb1
PB
139 /* This is a multi-level map on the physical address space.
140 * The bottom level has pointers to MemoryRegionSections.
141 */
142 PhysPageEntry phys_map;
53cb28cb 143 PhysPageMap map;
acc9d80b 144 AddressSpace *as;
1db8abb1
PB
145};
146
90260c6c
JK
147#define SUBPAGE_IDX(addr) ((addr) & ~TARGET_PAGE_MASK)
148typedef struct subpage_t {
149 MemoryRegion iomem;
acc9d80b 150 AddressSpace *as;
90260c6c
JK
151 hwaddr base;
152 uint16_t sub_section[TARGET_PAGE_SIZE];
153} subpage_t;
154
b41aac4f
LPF
155#define PHYS_SECTION_UNASSIGNED 0
156#define PHYS_SECTION_NOTDIRTY 1
157#define PHYS_SECTION_ROM 2
158#define PHYS_SECTION_WATCH 3
5312bd8b 159
e2eef170 160static void io_mem_init(void);
62152b8a 161static void memory_map_init(void);
09daed84 162static void tcg_commit(MemoryListener *listener);
e2eef170 163
1ec9b909 164static MemoryRegion io_mem_watch;
32857f4d
PM
165
166/**
167 * CPUAddressSpace: all the information a CPU needs about an AddressSpace
168 * @cpu: the CPU whose AddressSpace this is
169 * @as: the AddressSpace itself
170 * @memory_dispatch: its dispatch pointer (cached, RCU protected)
171 * @tcg_as_listener: listener for tracking changes to the AddressSpace
172 */
173struct CPUAddressSpace {
174 CPUState *cpu;
175 AddressSpace *as;
176 struct AddressSpaceDispatch *memory_dispatch;
177 MemoryListener tcg_as_listener;
178};
179
6658ffb8 180#endif
fd6ce8f6 181
6d9a1304 182#if !defined(CONFIG_USER_ONLY)
d6f2ea22 183
53cb28cb 184static void phys_map_node_reserve(PhysPageMap *map, unsigned nodes)
d6f2ea22 185{
53cb28cb
MA
186 if (map->nodes_nb + nodes > map->nodes_nb_alloc) {
187 map->nodes_nb_alloc = MAX(map->nodes_nb_alloc * 2, 16);
188 map->nodes_nb_alloc = MAX(map->nodes_nb_alloc, map->nodes_nb + nodes);
189 map->nodes = g_renew(Node, map->nodes, map->nodes_nb_alloc);
d6f2ea22 190 }
f7bf5461
AK
191}
192
db94604b 193static uint32_t phys_map_node_alloc(PhysPageMap *map, bool leaf)
f7bf5461
AK
194{
195 unsigned i;
8b795765 196 uint32_t ret;
db94604b
PB
197 PhysPageEntry e;
198 PhysPageEntry *p;
f7bf5461 199
53cb28cb 200 ret = map->nodes_nb++;
db94604b 201 p = map->nodes[ret];
f7bf5461 202 assert(ret != PHYS_MAP_NODE_NIL);
53cb28cb 203 assert(ret != map->nodes_nb_alloc);
db94604b
PB
204
205 e.skip = leaf ? 0 : 1;
206 e.ptr = leaf ? PHYS_SECTION_UNASSIGNED : PHYS_MAP_NODE_NIL;
03f49957 207 for (i = 0; i < P_L2_SIZE; ++i) {
db94604b 208 memcpy(&p[i], &e, sizeof(e));
d6f2ea22 209 }
f7bf5461 210 return ret;
d6f2ea22
AK
211}
212
53cb28cb
MA
213static void phys_page_set_level(PhysPageMap *map, PhysPageEntry *lp,
214 hwaddr *index, hwaddr *nb, uint16_t leaf,
2999097b 215 int level)
f7bf5461
AK
216{
217 PhysPageEntry *p;
03f49957 218 hwaddr step = (hwaddr)1 << (level * P_L2_BITS);
108c49b8 219
9736e55b 220 if (lp->skip && lp->ptr == PHYS_MAP_NODE_NIL) {
db94604b 221 lp->ptr = phys_map_node_alloc(map, level == 0);
92e873b9 222 }
db94604b 223 p = map->nodes[lp->ptr];
03f49957 224 lp = &p[(*index >> (level * P_L2_BITS)) & (P_L2_SIZE - 1)];
f7bf5461 225
03f49957 226 while (*nb && lp < &p[P_L2_SIZE]) {
07f07b31 227 if ((*index & (step - 1)) == 0 && *nb >= step) {
9736e55b 228 lp->skip = 0;
c19e8800 229 lp->ptr = leaf;
07f07b31
AK
230 *index += step;
231 *nb -= step;
2999097b 232 } else {
53cb28cb 233 phys_page_set_level(map, lp, index, nb, leaf, level - 1);
2999097b
AK
234 }
235 ++lp;
f7bf5461
AK
236 }
237}
238
ac1970fb 239static void phys_page_set(AddressSpaceDispatch *d,
a8170e5e 240 hwaddr index, hwaddr nb,
2999097b 241 uint16_t leaf)
f7bf5461 242{
2999097b 243 /* Wildly overreserve - it doesn't matter much. */
53cb28cb 244 phys_map_node_reserve(&d->map, 3 * P_L2_LEVELS);
5cd2c5b6 245
53cb28cb 246 phys_page_set_level(&d->map, &d->phys_map, &index, &nb, leaf, P_L2_LEVELS - 1);
92e873b9
FB
247}
248
b35ba30f
MT
249/* Compact a non leaf page entry. Simply detect that the entry has a single child,
250 * and update our entry so we can skip it and go directly to the destination.
251 */
252static void phys_page_compact(PhysPageEntry *lp, Node *nodes, unsigned long *compacted)
253{
254 unsigned valid_ptr = P_L2_SIZE;
255 int valid = 0;
256 PhysPageEntry *p;
257 int i;
258
259 if (lp->ptr == PHYS_MAP_NODE_NIL) {
260 return;
261 }
262
263 p = nodes[lp->ptr];
264 for (i = 0; i < P_L2_SIZE; i++) {
265 if (p[i].ptr == PHYS_MAP_NODE_NIL) {
266 continue;
267 }
268
269 valid_ptr = i;
270 valid++;
271 if (p[i].skip) {
272 phys_page_compact(&p[i], nodes, compacted);
273 }
274 }
275
276 /* We can only compress if there's only one child. */
277 if (valid != 1) {
278 return;
279 }
280
281 assert(valid_ptr < P_L2_SIZE);
282
283 /* Don't compress if it won't fit in the # of bits we have. */
284 if (lp->skip + p[valid_ptr].skip >= (1 << 3)) {
285 return;
286 }
287
288 lp->ptr = p[valid_ptr].ptr;
289 if (!p[valid_ptr].skip) {
290 /* If our only child is a leaf, make this a leaf. */
291 /* By design, we should have made this node a leaf to begin with so we
292 * should never reach here.
293 * But since it's so simple to handle this, let's do it just in case we
294 * change this rule.
295 */
296 lp->skip = 0;
297 } else {
298 lp->skip += p[valid_ptr].skip;
299 }
300}
301
302static void phys_page_compact_all(AddressSpaceDispatch *d, int nodes_nb)
303{
304 DECLARE_BITMAP(compacted, nodes_nb);
305
306 if (d->phys_map.skip) {
53cb28cb 307 phys_page_compact(&d->phys_map, d->map.nodes, compacted);
b35ba30f
MT
308 }
309}
310
97115a8d 311static MemoryRegionSection *phys_page_find(PhysPageEntry lp, hwaddr addr,
9affd6fc 312 Node *nodes, MemoryRegionSection *sections)
92e873b9 313{
31ab2b4a 314 PhysPageEntry *p;
97115a8d 315 hwaddr index = addr >> TARGET_PAGE_BITS;
31ab2b4a 316 int i;
f1f6e3b8 317
9736e55b 318 for (i = P_L2_LEVELS; lp.skip && (i -= lp.skip) >= 0;) {
c19e8800 319 if (lp.ptr == PHYS_MAP_NODE_NIL) {
9affd6fc 320 return &sections[PHYS_SECTION_UNASSIGNED];
31ab2b4a 321 }
9affd6fc 322 p = nodes[lp.ptr];
03f49957 323 lp = p[(index >> (i * P_L2_BITS)) & (P_L2_SIZE - 1)];
5312bd8b 324 }
b35ba30f
MT
325
326 if (sections[lp.ptr].size.hi ||
327 range_covers_byte(sections[lp.ptr].offset_within_address_space,
328 sections[lp.ptr].size.lo, addr)) {
329 return &sections[lp.ptr];
330 } else {
331 return &sections[PHYS_SECTION_UNASSIGNED];
332 }
f3705d53
AK
333}
334
e5548617
BS
335bool memory_region_is_unassigned(MemoryRegion *mr)
336{
2a8e7499 337 return mr != &io_mem_rom && mr != &io_mem_notdirty && !mr->rom_device
5b6dd868 338 && mr != &io_mem_watch;
fd6ce8f6 339}
149f54b5 340
79e2b9ae 341/* Called from RCU critical section */
c7086b4a 342static MemoryRegionSection *address_space_lookup_region(AddressSpaceDispatch *d,
90260c6c
JK
343 hwaddr addr,
344 bool resolve_subpage)
9f029603 345{
90260c6c
JK
346 MemoryRegionSection *section;
347 subpage_t *subpage;
348
53cb28cb 349 section = phys_page_find(d->phys_map, addr, d->map.nodes, d->map.sections);
90260c6c
JK
350 if (resolve_subpage && section->mr->subpage) {
351 subpage = container_of(section->mr, subpage_t, iomem);
53cb28cb 352 section = &d->map.sections[subpage->sub_section[SUBPAGE_IDX(addr)]];
90260c6c
JK
353 }
354 return section;
9f029603
JK
355}
356
79e2b9ae 357/* Called from RCU critical section */
90260c6c 358static MemoryRegionSection *
c7086b4a 359address_space_translate_internal(AddressSpaceDispatch *d, hwaddr addr, hwaddr *xlat,
90260c6c 360 hwaddr *plen, bool resolve_subpage)
149f54b5
PB
361{
362 MemoryRegionSection *section;
965eb2fc 363 MemoryRegion *mr;
a87f3954 364 Int128 diff;
149f54b5 365
c7086b4a 366 section = address_space_lookup_region(d, addr, resolve_subpage);
149f54b5
PB
367 /* Compute offset within MemoryRegionSection */
368 addr -= section->offset_within_address_space;
369
370 /* Compute offset within MemoryRegion */
371 *xlat = addr + section->offset_within_region;
372
965eb2fc 373 mr = section->mr;
b242e0e0
PB
374
375 /* MMIO registers can be expected to perform full-width accesses based only
376 * on their address, without considering adjacent registers that could
377 * decode to completely different MemoryRegions. When such registers
378 * exist (e.g. I/O ports 0xcf8 and 0xcf9 on most PC chipsets), MMIO
379 * regions overlap wildly. For this reason we cannot clamp the accesses
380 * here.
381 *
382 * If the length is small (as is the case for address_space_ldl/stl),
383 * everything works fine. If the incoming length is large, however,
384 * the caller really has to do the clamping through memory_access_size.
385 */
965eb2fc 386 if (memory_region_is_ram(mr)) {
e4a511f8 387 diff = int128_sub(section->size, int128_make64(addr));
965eb2fc
PB
388 *plen = int128_get64(int128_min(diff, int128_make64(*plen)));
389 }
149f54b5
PB
390 return section;
391}
90260c6c 392
41063e1e 393/* Called from RCU critical section */
5c8a00ce
PB
394MemoryRegion *address_space_translate(AddressSpace *as, hwaddr addr,
395 hwaddr *xlat, hwaddr *plen,
396 bool is_write)
90260c6c 397{
30951157
AK
398 IOMMUTLBEntry iotlb;
399 MemoryRegionSection *section;
400 MemoryRegion *mr;
30951157
AK
401
402 for (;;) {
79e2b9ae
PB
403 AddressSpaceDispatch *d = atomic_rcu_read(&as->dispatch);
404 section = address_space_translate_internal(d, addr, &addr, plen, true);
30951157
AK
405 mr = section->mr;
406
407 if (!mr->iommu_ops) {
408 break;
409 }
410
8d7b8cb9 411 iotlb = mr->iommu_ops->translate(mr, addr, is_write);
30951157
AK
412 addr = ((iotlb.translated_addr & ~iotlb.addr_mask)
413 | (addr & iotlb.addr_mask));
23820dbf 414 *plen = MIN(*plen, (addr | iotlb.addr_mask) - addr + 1);
30951157
AK
415 if (!(iotlb.perm & (1 << is_write))) {
416 mr = &io_mem_unassigned;
417 break;
418 }
419
420 as = iotlb.target_as;
421 }
422
fe680d0d 423 if (xen_enabled() && memory_access_is_direct(mr, is_write)) {
a87f3954 424 hwaddr page = ((addr & TARGET_PAGE_MASK) + TARGET_PAGE_SIZE) - addr;
23820dbf 425 *plen = MIN(page, *plen);
a87f3954
PB
426 }
427
30951157
AK
428 *xlat = addr;
429 return mr;
90260c6c
JK
430}
431
79e2b9ae 432/* Called from RCU critical section */
90260c6c 433MemoryRegionSection *
9d82b5a7
PB
434address_space_translate_for_iotlb(CPUState *cpu, hwaddr addr,
435 hwaddr *xlat, hwaddr *plen)
90260c6c 436{
30951157 437 MemoryRegionSection *section;
32857f4d 438 section = address_space_translate_internal(cpu->cpu_ases[0].memory_dispatch,
9d82b5a7 439 addr, xlat, plen, false);
30951157
AK
440
441 assert(!section->mr->iommu_ops);
442 return section;
90260c6c 443}
5b6dd868 444#endif
fd6ce8f6 445
b170fce3 446#if !defined(CONFIG_USER_ONLY)
5b6dd868
BS
447
448static int cpu_common_post_load(void *opaque, int version_id)
fd6ce8f6 449{
259186a7 450 CPUState *cpu = opaque;
a513fe19 451
5b6dd868
BS
452 /* 0x01 was CPU_INTERRUPT_EXIT. This line can be removed when the
453 version_id is increased. */
259186a7 454 cpu->interrupt_request &= ~0x01;
c01a71c1 455 tlb_flush(cpu, 1);
5b6dd868
BS
456
457 return 0;
a513fe19 458}
7501267e 459
6c3bff0e
PD
460static int cpu_common_pre_load(void *opaque)
461{
462 CPUState *cpu = opaque;
463
adee6424 464 cpu->exception_index = -1;
6c3bff0e
PD
465
466 return 0;
467}
468
469static bool cpu_common_exception_index_needed(void *opaque)
470{
471 CPUState *cpu = opaque;
472
adee6424 473 return tcg_enabled() && cpu->exception_index != -1;
6c3bff0e
PD
474}
475
476static const VMStateDescription vmstate_cpu_common_exception_index = {
477 .name = "cpu_common/exception_index",
478 .version_id = 1,
479 .minimum_version_id = 1,
5cd8cada 480 .needed = cpu_common_exception_index_needed,
6c3bff0e
PD
481 .fields = (VMStateField[]) {
482 VMSTATE_INT32(exception_index, CPUState),
483 VMSTATE_END_OF_LIST()
484 }
485};
486
bac05aa9
AS
487static bool cpu_common_crash_occurred_needed(void *opaque)
488{
489 CPUState *cpu = opaque;
490
491 return cpu->crash_occurred;
492}
493
494static const VMStateDescription vmstate_cpu_common_crash_occurred = {
495 .name = "cpu_common/crash_occurred",
496 .version_id = 1,
497 .minimum_version_id = 1,
498 .needed = cpu_common_crash_occurred_needed,
499 .fields = (VMStateField[]) {
500 VMSTATE_BOOL(crash_occurred, CPUState),
501 VMSTATE_END_OF_LIST()
502 }
503};
504
1a1562f5 505const VMStateDescription vmstate_cpu_common = {
5b6dd868
BS
506 .name = "cpu_common",
507 .version_id = 1,
508 .minimum_version_id = 1,
6c3bff0e 509 .pre_load = cpu_common_pre_load,
5b6dd868 510 .post_load = cpu_common_post_load,
35d08458 511 .fields = (VMStateField[]) {
259186a7
AF
512 VMSTATE_UINT32(halted, CPUState),
513 VMSTATE_UINT32(interrupt_request, CPUState),
5b6dd868 514 VMSTATE_END_OF_LIST()
6c3bff0e 515 },
5cd8cada
JQ
516 .subsections = (const VMStateDescription*[]) {
517 &vmstate_cpu_common_exception_index,
bac05aa9 518 &vmstate_cpu_common_crash_occurred,
5cd8cada 519 NULL
5b6dd868
BS
520 }
521};
1a1562f5 522
5b6dd868 523#endif
ea041c0e 524
38d8f5c8 525CPUState *qemu_get_cpu(int index)
ea041c0e 526{
bdc44640 527 CPUState *cpu;
ea041c0e 528
bdc44640 529 CPU_FOREACH(cpu) {
55e5c285 530 if (cpu->cpu_index == index) {
bdc44640 531 return cpu;
55e5c285 532 }
ea041c0e 533 }
5b6dd868 534
bdc44640 535 return NULL;
ea041c0e
FB
536}
537
09daed84
EI
538#if !defined(CONFIG_USER_ONLY)
539void tcg_cpu_address_space_init(CPUState *cpu, AddressSpace *as)
540{
541 /* We only support one address space per cpu at the moment. */
542 assert(cpu->as == as);
543
32857f4d
PM
544 if (cpu->cpu_ases) {
545 /* We've already registered the listener for our only AS */
546 return;
09daed84 547 }
32857f4d
PM
548
549 cpu->cpu_ases = g_new0(CPUAddressSpace, 1);
550 cpu->cpu_ases[0].cpu = cpu;
551 cpu->cpu_ases[0].as = as;
552 cpu->cpu_ases[0].tcg_as_listener.commit = tcg_commit;
553 memory_listener_register(&cpu->cpu_ases[0].tcg_as_listener, as);
09daed84
EI
554}
555#endif
556
b7bca733
BR
557#ifndef CONFIG_USER_ONLY
558static DECLARE_BITMAP(cpu_index_map, MAX_CPUMASK_BITS);
559
560static int cpu_get_free_index(Error **errp)
561{
562 int cpu = find_first_zero_bit(cpu_index_map, MAX_CPUMASK_BITS);
563
564 if (cpu >= MAX_CPUMASK_BITS) {
565 error_setg(errp, "Trying to use more CPUs than max of %d",
566 MAX_CPUMASK_BITS);
567 return -1;
568 }
569
570 bitmap_set(cpu_index_map, cpu, 1);
571 return cpu;
572}
573
574void cpu_exec_exit(CPUState *cpu)
575{
576 if (cpu->cpu_index == -1) {
577 /* cpu_index was never allocated by this @cpu or was already freed. */
578 return;
579 }
580
581 bitmap_clear(cpu_index_map, cpu->cpu_index, 1);
582 cpu->cpu_index = -1;
583}
584#else
585
586static int cpu_get_free_index(Error **errp)
587{
588 CPUState *some_cpu;
589 int cpu_index = 0;
590
591 CPU_FOREACH(some_cpu) {
592 cpu_index++;
593 }
594 return cpu_index;
595}
596
597void cpu_exec_exit(CPUState *cpu)
598{
599}
600#endif
601
4bad9e39 602void cpu_exec_init(CPUState *cpu, Error **errp)
ea041c0e 603{
b170fce3 604 CPUClass *cc = CPU_GET_CLASS(cpu);
5b6dd868 605 int cpu_index;
b7bca733 606 Error *local_err = NULL;
5b6dd868 607
291135b5
EH
608#ifndef CONFIG_USER_ONLY
609 cpu->as = &address_space_memory;
610 cpu->thread_id = qemu_get_thread_id();
291135b5
EH
611#endif
612
5b6dd868
BS
613#if defined(CONFIG_USER_ONLY)
614 cpu_list_lock();
615#endif
b7bca733
BR
616 cpu_index = cpu->cpu_index = cpu_get_free_index(&local_err);
617 if (local_err) {
618 error_propagate(errp, local_err);
619#if defined(CONFIG_USER_ONLY)
620 cpu_list_unlock();
621#endif
622 return;
5b6dd868 623 }
bdc44640 624 QTAILQ_INSERT_TAIL(&cpus, cpu, node);
5b6dd868
BS
625#if defined(CONFIG_USER_ONLY)
626 cpu_list_unlock();
627#endif
e0d47944
AF
628 if (qdev_get_vmsd(DEVICE(cpu)) == NULL) {
629 vmstate_register(NULL, cpu_index, &vmstate_cpu_common, cpu);
630 }
5b6dd868 631#if defined(CPU_SAVE_VERSION) && !defined(CONFIG_USER_ONLY)
5b6dd868 632 register_savevm(NULL, "cpu", cpu_index, CPU_SAVE_VERSION,
4bad9e39 633 cpu_save, cpu_load, cpu->env_ptr);
b170fce3 634 assert(cc->vmsd == NULL);
e0d47944 635 assert(qdev_get_vmsd(DEVICE(cpu)) == NULL);
5b6dd868 636#endif
b170fce3
AF
637 if (cc->vmsd != NULL) {
638 vmstate_register(NULL, cpu_index, cc->vmsd, cpu);
639 }
ea041c0e
FB
640}
641
94df27fd 642#if defined(CONFIG_USER_ONLY)
00b941e5 643static void breakpoint_invalidate(CPUState *cpu, target_ulong pc)
94df27fd
PB
644{
645 tb_invalidate_phys_page_range(pc, pc + 1, 0);
646}
647#else
00b941e5 648static void breakpoint_invalidate(CPUState *cpu, target_ulong pc)
1e7855a5 649{
e8262a1b
MF
650 hwaddr phys = cpu_get_phys_page_debug(cpu, pc);
651 if (phys != -1) {
09daed84 652 tb_invalidate_phys_addr(cpu->as,
29d8ec7b 653 phys | (pc & ~TARGET_PAGE_MASK));
e8262a1b 654 }
1e7855a5 655}
c27004ec 656#endif
d720b93d 657
c527ee8f 658#if defined(CONFIG_USER_ONLY)
75a34036 659void cpu_watchpoint_remove_all(CPUState *cpu, int mask)
c527ee8f
PB
660
661{
662}
663
3ee887e8
PM
664int cpu_watchpoint_remove(CPUState *cpu, vaddr addr, vaddr len,
665 int flags)
666{
667 return -ENOSYS;
668}
669
670void cpu_watchpoint_remove_by_ref(CPUState *cpu, CPUWatchpoint *watchpoint)
671{
672}
673
75a34036 674int cpu_watchpoint_insert(CPUState *cpu, vaddr addr, vaddr len,
c527ee8f
PB
675 int flags, CPUWatchpoint **watchpoint)
676{
677 return -ENOSYS;
678}
679#else
6658ffb8 680/* Add a watchpoint. */
75a34036 681int cpu_watchpoint_insert(CPUState *cpu, vaddr addr, vaddr len,
a1d1bb31 682 int flags, CPUWatchpoint **watchpoint)
6658ffb8 683{
c0ce998e 684 CPUWatchpoint *wp;
6658ffb8 685
05068c0d 686 /* forbid ranges which are empty or run off the end of the address space */
07e2863d 687 if (len == 0 || (addr + len - 1) < addr) {
75a34036
AF
688 error_report("tried to set invalid watchpoint at %"
689 VADDR_PRIx ", len=%" VADDR_PRIu, addr, len);
b4051334
AL
690 return -EINVAL;
691 }
7267c094 692 wp = g_malloc(sizeof(*wp));
a1d1bb31
AL
693
694 wp->vaddr = addr;
05068c0d 695 wp->len = len;
a1d1bb31
AL
696 wp->flags = flags;
697
2dc9f411 698 /* keep all GDB-injected watchpoints in front */
ff4700b0
AF
699 if (flags & BP_GDB) {
700 QTAILQ_INSERT_HEAD(&cpu->watchpoints, wp, entry);
701 } else {
702 QTAILQ_INSERT_TAIL(&cpu->watchpoints, wp, entry);
703 }
6658ffb8 704
31b030d4 705 tlb_flush_page(cpu, addr);
a1d1bb31
AL
706
707 if (watchpoint)
708 *watchpoint = wp;
709 return 0;
6658ffb8
PB
710}
711
a1d1bb31 712/* Remove a specific watchpoint. */
75a34036 713int cpu_watchpoint_remove(CPUState *cpu, vaddr addr, vaddr len,
a1d1bb31 714 int flags)
6658ffb8 715{
a1d1bb31 716 CPUWatchpoint *wp;
6658ffb8 717
ff4700b0 718 QTAILQ_FOREACH(wp, &cpu->watchpoints, entry) {
05068c0d 719 if (addr == wp->vaddr && len == wp->len
6e140f28 720 && flags == (wp->flags & ~BP_WATCHPOINT_HIT)) {
75a34036 721 cpu_watchpoint_remove_by_ref(cpu, wp);
6658ffb8
PB
722 return 0;
723 }
724 }
a1d1bb31 725 return -ENOENT;
6658ffb8
PB
726}
727
a1d1bb31 728/* Remove a specific watchpoint by reference. */
75a34036 729void cpu_watchpoint_remove_by_ref(CPUState *cpu, CPUWatchpoint *watchpoint)
a1d1bb31 730{
ff4700b0 731 QTAILQ_REMOVE(&cpu->watchpoints, watchpoint, entry);
7d03f82f 732
31b030d4 733 tlb_flush_page(cpu, watchpoint->vaddr);
a1d1bb31 734
7267c094 735 g_free(watchpoint);
a1d1bb31
AL
736}
737
738/* Remove all matching watchpoints. */
75a34036 739void cpu_watchpoint_remove_all(CPUState *cpu, int mask)
a1d1bb31 740{
c0ce998e 741 CPUWatchpoint *wp, *next;
a1d1bb31 742
ff4700b0 743 QTAILQ_FOREACH_SAFE(wp, &cpu->watchpoints, entry, next) {
75a34036
AF
744 if (wp->flags & mask) {
745 cpu_watchpoint_remove_by_ref(cpu, wp);
746 }
c0ce998e 747 }
7d03f82f 748}
05068c0d
PM
749
750/* Return true if this watchpoint address matches the specified
751 * access (ie the address range covered by the watchpoint overlaps
752 * partially or completely with the address range covered by the
753 * access).
754 */
755static inline bool cpu_watchpoint_address_matches(CPUWatchpoint *wp,
756 vaddr addr,
757 vaddr len)
758{
759 /* We know the lengths are non-zero, but a little caution is
760 * required to avoid errors in the case where the range ends
761 * exactly at the top of the address space and so addr + len
762 * wraps round to zero.
763 */
764 vaddr wpend = wp->vaddr + wp->len - 1;
765 vaddr addrend = addr + len - 1;
766
767 return !(addr > wpend || wp->vaddr > addrend);
768}
769
c527ee8f 770#endif
7d03f82f 771
a1d1bb31 772/* Add a breakpoint. */
b3310ab3 773int cpu_breakpoint_insert(CPUState *cpu, vaddr pc, int flags,
a1d1bb31 774 CPUBreakpoint **breakpoint)
4c3a88a2 775{
c0ce998e 776 CPUBreakpoint *bp;
3b46e624 777
7267c094 778 bp = g_malloc(sizeof(*bp));
4c3a88a2 779
a1d1bb31
AL
780 bp->pc = pc;
781 bp->flags = flags;
782
2dc9f411 783 /* keep all GDB-injected breakpoints in front */
00b941e5 784 if (flags & BP_GDB) {
f0c3c505 785 QTAILQ_INSERT_HEAD(&cpu->breakpoints, bp, entry);
00b941e5 786 } else {
f0c3c505 787 QTAILQ_INSERT_TAIL(&cpu->breakpoints, bp, entry);
00b941e5 788 }
3b46e624 789
f0c3c505 790 breakpoint_invalidate(cpu, pc);
a1d1bb31 791
00b941e5 792 if (breakpoint) {
a1d1bb31 793 *breakpoint = bp;
00b941e5 794 }
4c3a88a2 795 return 0;
4c3a88a2
FB
796}
797
a1d1bb31 798/* Remove a specific breakpoint. */
b3310ab3 799int cpu_breakpoint_remove(CPUState *cpu, vaddr pc, int flags)
a1d1bb31 800{
a1d1bb31
AL
801 CPUBreakpoint *bp;
802
f0c3c505 803 QTAILQ_FOREACH(bp, &cpu->breakpoints, entry) {
a1d1bb31 804 if (bp->pc == pc && bp->flags == flags) {
b3310ab3 805 cpu_breakpoint_remove_by_ref(cpu, bp);
a1d1bb31
AL
806 return 0;
807 }
7d03f82f 808 }
a1d1bb31 809 return -ENOENT;
7d03f82f
EI
810}
811
a1d1bb31 812/* Remove a specific breakpoint by reference. */
b3310ab3 813void cpu_breakpoint_remove_by_ref(CPUState *cpu, CPUBreakpoint *breakpoint)
4c3a88a2 814{
f0c3c505
AF
815 QTAILQ_REMOVE(&cpu->breakpoints, breakpoint, entry);
816
817 breakpoint_invalidate(cpu, breakpoint->pc);
a1d1bb31 818
7267c094 819 g_free(breakpoint);
a1d1bb31
AL
820}
821
822/* Remove all matching breakpoints. */
b3310ab3 823void cpu_breakpoint_remove_all(CPUState *cpu, int mask)
a1d1bb31 824{
c0ce998e 825 CPUBreakpoint *bp, *next;
a1d1bb31 826
f0c3c505 827 QTAILQ_FOREACH_SAFE(bp, &cpu->breakpoints, entry, next) {
b3310ab3
AF
828 if (bp->flags & mask) {
829 cpu_breakpoint_remove_by_ref(cpu, bp);
830 }
c0ce998e 831 }
4c3a88a2
FB
832}
833
c33a346e
FB
834/* enable or disable single step mode. EXCP_DEBUG is returned by the
835 CPU loop after each instruction */
3825b28f 836void cpu_single_step(CPUState *cpu, int enabled)
c33a346e 837{
ed2803da
AF
838 if (cpu->singlestep_enabled != enabled) {
839 cpu->singlestep_enabled = enabled;
840 if (kvm_enabled()) {
38e478ec 841 kvm_update_guest_debug(cpu, 0);
ed2803da 842 } else {
ccbb4d44 843 /* must flush all the translated code to avoid inconsistencies */
e22a25c9 844 /* XXX: only flush what is necessary */
bbd77c18 845 tb_flush(cpu);
e22a25c9 846 }
c33a346e 847 }
c33a346e
FB
848}
849
a47dddd7 850void cpu_abort(CPUState *cpu, const char *fmt, ...)
7501267e
FB
851{
852 va_list ap;
493ae1f0 853 va_list ap2;
7501267e
FB
854
855 va_start(ap, fmt);
493ae1f0 856 va_copy(ap2, ap);
7501267e
FB
857 fprintf(stderr, "qemu: fatal: ");
858 vfprintf(stderr, fmt, ap);
859 fprintf(stderr, "\n");
878096ee 860 cpu_dump_state(cpu, stderr, fprintf, CPU_DUMP_FPU | CPU_DUMP_CCOP);
013a2942 861 if (qemu_log_separate()) {
93fcfe39
AL
862 qemu_log("qemu: fatal: ");
863 qemu_log_vprintf(fmt, ap2);
864 qemu_log("\n");
a0762859 865 log_cpu_state(cpu, CPU_DUMP_FPU | CPU_DUMP_CCOP);
31b1a7b4 866 qemu_log_flush();
93fcfe39 867 qemu_log_close();
924edcae 868 }
493ae1f0 869 va_end(ap2);
f9373291 870 va_end(ap);
7615936e 871 replay_finish();
fd052bf6
RV
872#if defined(CONFIG_USER_ONLY)
873 {
874 struct sigaction act;
875 sigfillset(&act.sa_mask);
876 act.sa_handler = SIG_DFL;
877 sigaction(SIGABRT, &act, NULL);
878 }
879#endif
7501267e
FB
880 abort();
881}
882
0124311e 883#if !defined(CONFIG_USER_ONLY)
0dc3f44a 884/* Called from RCU critical section */
041603fe
PB
885static RAMBlock *qemu_get_ram_block(ram_addr_t addr)
886{
887 RAMBlock *block;
888
43771539 889 block = atomic_rcu_read(&ram_list.mru_block);
9b8424d5 890 if (block && addr - block->offset < block->max_length) {
68851b98 891 return block;
041603fe 892 }
0dc3f44a 893 QLIST_FOREACH_RCU(block, &ram_list.blocks, next) {
9b8424d5 894 if (addr - block->offset < block->max_length) {
041603fe
PB
895 goto found;
896 }
897 }
898
899 fprintf(stderr, "Bad ram offset %" PRIx64 "\n", (uint64_t)addr);
900 abort();
901
902found:
43771539
PB
903 /* It is safe to write mru_block outside the iothread lock. This
904 * is what happens:
905 *
906 * mru_block = xxx
907 * rcu_read_unlock()
908 * xxx removed from list
909 * rcu_read_lock()
910 * read mru_block
911 * mru_block = NULL;
912 * call_rcu(reclaim_ramblock, xxx);
913 * rcu_read_unlock()
914 *
915 * atomic_rcu_set is not needed here. The block was already published
916 * when it was placed into the list. Here we're just making an extra
917 * copy of the pointer.
918 */
041603fe
PB
919 ram_list.mru_block = block;
920 return block;
921}
922
a2f4d5be 923static void tlb_reset_dirty_range_all(ram_addr_t start, ram_addr_t length)
d24981d3 924{
9a13565d 925 CPUState *cpu;
041603fe 926 ram_addr_t start1;
a2f4d5be
JQ
927 RAMBlock *block;
928 ram_addr_t end;
929
930 end = TARGET_PAGE_ALIGN(start + length);
931 start &= TARGET_PAGE_MASK;
d24981d3 932
0dc3f44a 933 rcu_read_lock();
041603fe
PB
934 block = qemu_get_ram_block(start);
935 assert(block == qemu_get_ram_block(end - 1));
1240be24 936 start1 = (uintptr_t)ramblock_ptr(block, start - block->offset);
9a13565d
PC
937 CPU_FOREACH(cpu) {
938 tlb_reset_dirty(cpu, start1, length);
939 }
0dc3f44a 940 rcu_read_unlock();
d24981d3
JQ
941}
942
5579c7f3 943/* Note: start and end must be within the same ram block. */
03eebc9e
SH
944bool cpu_physical_memory_test_and_clear_dirty(ram_addr_t start,
945 ram_addr_t length,
946 unsigned client)
1ccde1cb 947{
03eebc9e
SH
948 unsigned long end, page;
949 bool dirty;
950
951 if (length == 0) {
952 return false;
953 }
f23db169 954
03eebc9e
SH
955 end = TARGET_PAGE_ALIGN(start + length) >> TARGET_PAGE_BITS;
956 page = start >> TARGET_PAGE_BITS;
957 dirty = bitmap_test_and_clear_atomic(ram_list.dirty_memory[client],
958 page, end - page);
959
960 if (dirty && tcg_enabled()) {
a2f4d5be 961 tlb_reset_dirty_range_all(start, length);
5579c7f3 962 }
03eebc9e
SH
963
964 return dirty;
1ccde1cb
FB
965}
966
79e2b9ae 967/* Called from RCU critical section */
bb0e627a 968hwaddr memory_region_section_get_iotlb(CPUState *cpu,
149f54b5
PB
969 MemoryRegionSection *section,
970 target_ulong vaddr,
971 hwaddr paddr, hwaddr xlat,
972 int prot,
973 target_ulong *address)
e5548617 974{
a8170e5e 975 hwaddr iotlb;
e5548617
BS
976 CPUWatchpoint *wp;
977
cc5bea60 978 if (memory_region_is_ram(section->mr)) {
e5548617
BS
979 /* Normal RAM. */
980 iotlb = (memory_region_get_ram_addr(section->mr) & TARGET_PAGE_MASK)
149f54b5 981 + xlat;
e5548617 982 if (!section->readonly) {
b41aac4f 983 iotlb |= PHYS_SECTION_NOTDIRTY;
e5548617 984 } else {
b41aac4f 985 iotlb |= PHYS_SECTION_ROM;
e5548617
BS
986 }
987 } else {
0b8e2c10
PM
988 AddressSpaceDispatch *d;
989
990 d = atomic_rcu_read(&section->address_space->dispatch);
991 iotlb = section - d->map.sections;
149f54b5 992 iotlb += xlat;
e5548617
BS
993 }
994
995 /* Make accesses to pages with watchpoints go via the
996 watchpoint trap routines. */
ff4700b0 997 QTAILQ_FOREACH(wp, &cpu->watchpoints, entry) {
05068c0d 998 if (cpu_watchpoint_address_matches(wp, vaddr, TARGET_PAGE_SIZE)) {
e5548617
BS
999 /* Avoid trapping reads of pages with a write breakpoint. */
1000 if ((prot & PAGE_WRITE) || (wp->flags & BP_MEM_READ)) {
b41aac4f 1001 iotlb = PHYS_SECTION_WATCH + paddr;
e5548617
BS
1002 *address |= TLB_MMIO;
1003 break;
1004 }
1005 }
1006 }
1007
1008 return iotlb;
1009}
9fa3e853
FB
1010#endif /* defined(CONFIG_USER_ONLY) */
1011
e2eef170 1012#if !defined(CONFIG_USER_ONLY)
8da3ff18 1013
c227f099 1014static int subpage_register (subpage_t *mmio, uint32_t start, uint32_t end,
5312bd8b 1015 uint16_t section);
acc9d80b 1016static subpage_t *subpage_init(AddressSpace *as, hwaddr base);
54688b1e 1017
a2b257d6
IM
1018static void *(*phys_mem_alloc)(size_t size, uint64_t *align) =
1019 qemu_anon_ram_alloc;
91138037
MA
1020
1021/*
1022 * Set a custom physical guest memory alloator.
1023 * Accelerators with unusual needs may need this. Hopefully, we can
1024 * get rid of it eventually.
1025 */
a2b257d6 1026void phys_mem_set_alloc(void *(*alloc)(size_t, uint64_t *align))
91138037
MA
1027{
1028 phys_mem_alloc = alloc;
1029}
1030
53cb28cb
MA
1031static uint16_t phys_section_add(PhysPageMap *map,
1032 MemoryRegionSection *section)
5312bd8b 1033{
68f3f65b
PB
1034 /* The physical section number is ORed with a page-aligned
1035 * pointer to produce the iotlb entries. Thus it should
1036 * never overflow into the page-aligned value.
1037 */
53cb28cb 1038 assert(map->sections_nb < TARGET_PAGE_SIZE);
68f3f65b 1039
53cb28cb
MA
1040 if (map->sections_nb == map->sections_nb_alloc) {
1041 map->sections_nb_alloc = MAX(map->sections_nb_alloc * 2, 16);
1042 map->sections = g_renew(MemoryRegionSection, map->sections,
1043 map->sections_nb_alloc);
5312bd8b 1044 }
53cb28cb 1045 map->sections[map->sections_nb] = *section;
dfde4e6e 1046 memory_region_ref(section->mr);
53cb28cb 1047 return map->sections_nb++;
5312bd8b
AK
1048}
1049
058bc4b5
PB
1050static void phys_section_destroy(MemoryRegion *mr)
1051{
55b4e80b
DS
1052 bool have_sub_page = mr->subpage;
1053
dfde4e6e
PB
1054 memory_region_unref(mr);
1055
55b4e80b 1056 if (have_sub_page) {
058bc4b5 1057 subpage_t *subpage = container_of(mr, subpage_t, iomem);
b4fefef9 1058 object_unref(OBJECT(&subpage->iomem));
058bc4b5
PB
1059 g_free(subpage);
1060 }
1061}
1062
6092666e 1063static void phys_sections_free(PhysPageMap *map)
5312bd8b 1064{
9affd6fc
PB
1065 while (map->sections_nb > 0) {
1066 MemoryRegionSection *section = &map->sections[--map->sections_nb];
058bc4b5
PB
1067 phys_section_destroy(section->mr);
1068 }
9affd6fc
PB
1069 g_free(map->sections);
1070 g_free(map->nodes);
5312bd8b
AK
1071}
1072
ac1970fb 1073static void register_subpage(AddressSpaceDispatch *d, MemoryRegionSection *section)
0f0cb164
AK
1074{
1075 subpage_t *subpage;
a8170e5e 1076 hwaddr base = section->offset_within_address_space
0f0cb164 1077 & TARGET_PAGE_MASK;
97115a8d 1078 MemoryRegionSection *existing = phys_page_find(d->phys_map, base,
53cb28cb 1079 d->map.nodes, d->map.sections);
0f0cb164
AK
1080 MemoryRegionSection subsection = {
1081 .offset_within_address_space = base,
052e87b0 1082 .size = int128_make64(TARGET_PAGE_SIZE),
0f0cb164 1083 };
a8170e5e 1084 hwaddr start, end;
0f0cb164 1085
f3705d53 1086 assert(existing->mr->subpage || existing->mr == &io_mem_unassigned);
0f0cb164 1087
f3705d53 1088 if (!(existing->mr->subpage)) {
acc9d80b 1089 subpage = subpage_init(d->as, base);
3be91e86 1090 subsection.address_space = d->as;
0f0cb164 1091 subsection.mr = &subpage->iomem;
ac1970fb 1092 phys_page_set(d, base >> TARGET_PAGE_BITS, 1,
53cb28cb 1093 phys_section_add(&d->map, &subsection));
0f0cb164 1094 } else {
f3705d53 1095 subpage = container_of(existing->mr, subpage_t, iomem);
0f0cb164
AK
1096 }
1097 start = section->offset_within_address_space & ~TARGET_PAGE_MASK;
052e87b0 1098 end = start + int128_get64(section->size) - 1;
53cb28cb
MA
1099 subpage_register(subpage, start, end,
1100 phys_section_add(&d->map, section));
0f0cb164
AK
1101}
1102
1103
052e87b0
PB
1104static void register_multipage(AddressSpaceDispatch *d,
1105 MemoryRegionSection *section)
33417e70 1106{
a8170e5e 1107 hwaddr start_addr = section->offset_within_address_space;
53cb28cb 1108 uint16_t section_index = phys_section_add(&d->map, section);
052e87b0
PB
1109 uint64_t num_pages = int128_get64(int128_rshift(section->size,
1110 TARGET_PAGE_BITS));
dd81124b 1111
733d5ef5
PB
1112 assert(num_pages);
1113 phys_page_set(d, start_addr >> TARGET_PAGE_BITS, num_pages, section_index);
33417e70
FB
1114}
1115
ac1970fb 1116static void mem_add(MemoryListener *listener, MemoryRegionSection *section)
0f0cb164 1117{
89ae337a 1118 AddressSpace *as = container_of(listener, AddressSpace, dispatch_listener);
00752703 1119 AddressSpaceDispatch *d = as->next_dispatch;
99b9cc06 1120 MemoryRegionSection now = *section, remain = *section;
052e87b0 1121 Int128 page_size = int128_make64(TARGET_PAGE_SIZE);
0f0cb164 1122
733d5ef5
PB
1123 if (now.offset_within_address_space & ~TARGET_PAGE_MASK) {
1124 uint64_t left = TARGET_PAGE_ALIGN(now.offset_within_address_space)
1125 - now.offset_within_address_space;
1126
052e87b0 1127 now.size = int128_min(int128_make64(left), now.size);
ac1970fb 1128 register_subpage(d, &now);
733d5ef5 1129 } else {
052e87b0 1130 now.size = int128_zero();
733d5ef5 1131 }
052e87b0
PB
1132 while (int128_ne(remain.size, now.size)) {
1133 remain.size = int128_sub(remain.size, now.size);
1134 remain.offset_within_address_space += int128_get64(now.size);
1135 remain.offset_within_region += int128_get64(now.size);
69b67646 1136 now = remain;
052e87b0 1137 if (int128_lt(remain.size, page_size)) {
733d5ef5 1138 register_subpage(d, &now);
88266249 1139 } else if (remain.offset_within_address_space & ~TARGET_PAGE_MASK) {
052e87b0 1140 now.size = page_size;
ac1970fb 1141 register_subpage(d, &now);
69b67646 1142 } else {
052e87b0 1143 now.size = int128_and(now.size, int128_neg(page_size));
ac1970fb 1144 register_multipage(d, &now);
69b67646 1145 }
0f0cb164
AK
1146 }
1147}
1148
62a2744c
SY
1149void qemu_flush_coalesced_mmio_buffer(void)
1150{
1151 if (kvm_enabled())
1152 kvm_flush_coalesced_mmio_buffer();
1153}
1154
b2a8658e
UD
1155void qemu_mutex_lock_ramlist(void)
1156{
1157 qemu_mutex_lock(&ram_list.mutex);
1158}
1159
1160void qemu_mutex_unlock_ramlist(void)
1161{
1162 qemu_mutex_unlock(&ram_list.mutex);
1163}
1164
e1e84ba0 1165#ifdef __linux__
c902760f
MT
1166
1167#include <sys/vfs.h>
1168
1169#define HUGETLBFS_MAGIC 0x958458f6
1170
fc7a5800 1171static long gethugepagesize(const char *path, Error **errp)
c902760f
MT
1172{
1173 struct statfs fs;
1174 int ret;
1175
1176 do {
9742bf26 1177 ret = statfs(path, &fs);
c902760f
MT
1178 } while (ret != 0 && errno == EINTR);
1179
1180 if (ret != 0) {
fc7a5800
HT
1181 error_setg_errno(errp, errno, "failed to get page size of file %s",
1182 path);
9742bf26 1183 return 0;
c902760f
MT
1184 }
1185
c902760f
MT
1186 return fs.f_bsize;
1187}
1188
04b16653
AW
1189static void *file_ram_alloc(RAMBlock *block,
1190 ram_addr_t memory,
7f56e740
PB
1191 const char *path,
1192 Error **errp)
c902760f 1193{
8d31d6b6 1194 struct stat st;
c902760f 1195 char *filename;
8ca761f6
PF
1196 char *sanitized_name;
1197 char *c;
794e8f30 1198 void *area;
c902760f 1199 int fd;
557529dd 1200 uint64_t hpagesize;
fc7a5800 1201 Error *local_err = NULL;
c902760f 1202
fc7a5800
HT
1203 hpagesize = gethugepagesize(path, &local_err);
1204 if (local_err) {
1205 error_propagate(errp, local_err);
f9a49dfa 1206 goto error;
c902760f 1207 }
a2b257d6 1208 block->mr->align = hpagesize;
c902760f
MT
1209
1210 if (memory < hpagesize) {
557529dd
HT
1211 error_setg(errp, "memory size 0x" RAM_ADDR_FMT " must be equal to "
1212 "or larger than huge page size 0x%" PRIx64,
1213 memory, hpagesize);
1214 goto error;
c902760f
MT
1215 }
1216
1217 if (kvm_enabled() && !kvm_has_sync_mmu()) {
7f56e740
PB
1218 error_setg(errp,
1219 "host lacks kvm mmu notifiers, -mem-path unsupported");
f9a49dfa 1220 goto error;
c902760f
MT
1221 }
1222
8d31d6b6
PF
1223 if (!stat(path, &st) && S_ISDIR(st.st_mode)) {
1224 /* Make name safe to use with mkstemp by replacing '/' with '_'. */
1225 sanitized_name = g_strdup(memory_region_name(block->mr));
1226 for (c = sanitized_name; *c != '\0'; c++) {
1227 if (*c == '/') {
1228 *c = '_';
1229 }
1230 }
8ca761f6 1231
8d31d6b6
PF
1232 filename = g_strdup_printf("%s/qemu_back_mem.%s.XXXXXX", path,
1233 sanitized_name);
1234 g_free(sanitized_name);
1235
1236 fd = mkstemp(filename);
1237 if (fd >= 0) {
1238 unlink(filename);
1239 }
1240 g_free(filename);
1241 } else {
1242 fd = open(path, O_RDWR | O_CREAT, 0644);
1243 }
c902760f 1244
c902760f 1245 if (fd < 0) {
7f56e740
PB
1246 error_setg_errno(errp, errno,
1247 "unable to create backing store for hugepages");
f9a49dfa 1248 goto error;
c902760f 1249 }
c902760f 1250
9284f319 1251 memory = ROUND_UP(memory, hpagesize);
c902760f
MT
1252
1253 /*
1254 * ftruncate is not supported by hugetlbfs in older
1255 * hosts, so don't bother bailing out on errors.
1256 * If anything goes wrong with it under other filesystems,
1257 * mmap will fail.
1258 */
7f56e740 1259 if (ftruncate(fd, memory)) {
9742bf26 1260 perror("ftruncate");
7f56e740 1261 }
c902760f 1262
794e8f30 1263 area = qemu_ram_mmap(fd, memory, hpagesize, block->flags & RAM_SHARED);
c902760f 1264 if (area == MAP_FAILED) {
7f56e740
PB
1265 error_setg_errno(errp, errno,
1266 "unable to map backing store for hugepages");
9742bf26 1267 close(fd);
f9a49dfa 1268 goto error;
c902760f 1269 }
ef36fa14
MT
1270
1271 if (mem_prealloc) {
38183310 1272 os_mem_prealloc(fd, area, memory);
ef36fa14
MT
1273 }
1274
04b16653 1275 block->fd = fd;
c902760f 1276 return area;
f9a49dfa
MT
1277
1278error:
f9a49dfa 1279 return NULL;
c902760f
MT
1280}
1281#endif
1282
0dc3f44a 1283/* Called with the ramlist lock held. */
d17b5288 1284static ram_addr_t find_ram_offset(ram_addr_t size)
04b16653
AW
1285{
1286 RAMBlock *block, *next_block;
3e837b2c 1287 ram_addr_t offset = RAM_ADDR_MAX, mingap = RAM_ADDR_MAX;
04b16653 1288
49cd9ac6
SH
1289 assert(size != 0); /* it would hand out same offset multiple times */
1290
0dc3f44a 1291 if (QLIST_EMPTY_RCU(&ram_list.blocks)) {
04b16653 1292 return 0;
0d53d9fe 1293 }
04b16653 1294
0dc3f44a 1295 QLIST_FOREACH_RCU(block, &ram_list.blocks, next) {
f15fbc4b 1296 ram_addr_t end, next = RAM_ADDR_MAX;
04b16653 1297
62be4e3a 1298 end = block->offset + block->max_length;
04b16653 1299
0dc3f44a 1300 QLIST_FOREACH_RCU(next_block, &ram_list.blocks, next) {
04b16653
AW
1301 if (next_block->offset >= end) {
1302 next = MIN(next, next_block->offset);
1303 }
1304 }
1305 if (next - end >= size && next - end < mingap) {
3e837b2c 1306 offset = end;
04b16653
AW
1307 mingap = next - end;
1308 }
1309 }
3e837b2c
AW
1310
1311 if (offset == RAM_ADDR_MAX) {
1312 fprintf(stderr, "Failed to find gap of requested size: %" PRIu64 "\n",
1313 (uint64_t)size);
1314 abort();
1315 }
1316
04b16653
AW
1317 return offset;
1318}
1319
652d7ec2 1320ram_addr_t last_ram_offset(void)
d17b5288
AW
1321{
1322 RAMBlock *block;
1323 ram_addr_t last = 0;
1324
0dc3f44a
MD
1325 rcu_read_lock();
1326 QLIST_FOREACH_RCU(block, &ram_list.blocks, next) {
62be4e3a 1327 last = MAX(last, block->offset + block->max_length);
0d53d9fe 1328 }
0dc3f44a 1329 rcu_read_unlock();
d17b5288
AW
1330 return last;
1331}
1332
ddb97f1d
JB
1333static void qemu_ram_setup_dump(void *addr, ram_addr_t size)
1334{
1335 int ret;
ddb97f1d
JB
1336
1337 /* Use MADV_DONTDUMP, if user doesn't want the guest memory in the core */
47c8ca53 1338 if (!machine_dump_guest_core(current_machine)) {
ddb97f1d
JB
1339 ret = qemu_madvise(addr, size, QEMU_MADV_DONTDUMP);
1340 if (ret) {
1341 perror("qemu_madvise");
1342 fprintf(stderr, "madvise doesn't support MADV_DONTDUMP, "
1343 "but dump_guest_core=off specified\n");
1344 }
1345 }
1346}
1347
0dc3f44a
MD
1348/* Called within an RCU critical section, or while the ramlist lock
1349 * is held.
1350 */
20cfe881 1351static RAMBlock *find_ram_block(ram_addr_t addr)
84b89d78 1352{
20cfe881 1353 RAMBlock *block;
84b89d78 1354
0dc3f44a 1355 QLIST_FOREACH_RCU(block, &ram_list.blocks, next) {
c5705a77 1356 if (block->offset == addr) {
20cfe881 1357 return block;
c5705a77
AK
1358 }
1359 }
20cfe881
HT
1360
1361 return NULL;
1362}
1363
422148d3
DDAG
1364const char *qemu_ram_get_idstr(RAMBlock *rb)
1365{
1366 return rb->idstr;
1367}
1368
ae3a7047 1369/* Called with iothread lock held. */
20cfe881
HT
1370void qemu_ram_set_idstr(ram_addr_t addr, const char *name, DeviceState *dev)
1371{
ae3a7047 1372 RAMBlock *new_block, *block;
20cfe881 1373
0dc3f44a 1374 rcu_read_lock();
ae3a7047 1375 new_block = find_ram_block(addr);
c5705a77
AK
1376 assert(new_block);
1377 assert(!new_block->idstr[0]);
84b89d78 1378
09e5ab63
AL
1379 if (dev) {
1380 char *id = qdev_get_dev_path(dev);
84b89d78
CM
1381 if (id) {
1382 snprintf(new_block->idstr, sizeof(new_block->idstr), "%s/", id);
7267c094 1383 g_free(id);
84b89d78
CM
1384 }
1385 }
1386 pstrcat(new_block->idstr, sizeof(new_block->idstr), name);
1387
0dc3f44a 1388 QLIST_FOREACH_RCU(block, &ram_list.blocks, next) {
c5705a77 1389 if (block != new_block && !strcmp(block->idstr, new_block->idstr)) {
84b89d78
CM
1390 fprintf(stderr, "RAMBlock \"%s\" already registered, abort!\n",
1391 new_block->idstr);
1392 abort();
1393 }
1394 }
0dc3f44a 1395 rcu_read_unlock();
c5705a77
AK
1396}
1397
ae3a7047 1398/* Called with iothread lock held. */
20cfe881
HT
1399void qemu_ram_unset_idstr(ram_addr_t addr)
1400{
ae3a7047 1401 RAMBlock *block;
20cfe881 1402
ae3a7047
MD
1403 /* FIXME: arch_init.c assumes that this is not called throughout
1404 * migration. Ignore the problem since hot-unplug during migration
1405 * does not work anyway.
1406 */
1407
0dc3f44a 1408 rcu_read_lock();
ae3a7047 1409 block = find_ram_block(addr);
20cfe881
HT
1410 if (block) {
1411 memset(block->idstr, 0, sizeof(block->idstr));
1412 }
0dc3f44a 1413 rcu_read_unlock();
20cfe881
HT
1414}
1415
8490fc78
LC
1416static int memory_try_enable_merging(void *addr, size_t len)
1417{
75cc7f01 1418 if (!machine_mem_merge(current_machine)) {
8490fc78
LC
1419 /* disabled by the user */
1420 return 0;
1421 }
1422
1423 return qemu_madvise(addr, len, QEMU_MADV_MERGEABLE);
1424}
1425
62be4e3a
MT
1426/* Only legal before guest might have detected the memory size: e.g. on
1427 * incoming migration, or right after reset.
1428 *
1429 * As memory core doesn't know how is memory accessed, it is up to
1430 * resize callback to update device state and/or add assertions to detect
1431 * misuse, if necessary.
1432 */
1433int qemu_ram_resize(ram_addr_t base, ram_addr_t newsize, Error **errp)
1434{
1435 RAMBlock *block = find_ram_block(base);
1436
1437 assert(block);
1438
4ed023ce 1439 newsize = HOST_PAGE_ALIGN(newsize);
129ddaf3 1440
62be4e3a
MT
1441 if (block->used_length == newsize) {
1442 return 0;
1443 }
1444
1445 if (!(block->flags & RAM_RESIZEABLE)) {
1446 error_setg_errno(errp, EINVAL,
1447 "Length mismatch: %s: 0x" RAM_ADDR_FMT
1448 " in != 0x" RAM_ADDR_FMT, block->idstr,
1449 newsize, block->used_length);
1450 return -EINVAL;
1451 }
1452
1453 if (block->max_length < newsize) {
1454 error_setg_errno(errp, EINVAL,
1455 "Length too large: %s: 0x" RAM_ADDR_FMT
1456 " > 0x" RAM_ADDR_FMT, block->idstr,
1457 newsize, block->max_length);
1458 return -EINVAL;
1459 }
1460
1461 cpu_physical_memory_clear_dirty_range(block->offset, block->used_length);
1462 block->used_length = newsize;
58d2707e
PB
1463 cpu_physical_memory_set_dirty_range(block->offset, block->used_length,
1464 DIRTY_CLIENTS_ALL);
62be4e3a
MT
1465 memory_region_set_size(block->mr, newsize);
1466 if (block->resized) {
1467 block->resized(block->idstr, newsize, block->host);
1468 }
1469 return 0;
1470}
1471
ef701d7b 1472static ram_addr_t ram_block_add(RAMBlock *new_block, Error **errp)
c5705a77 1473{
e1c57ab8 1474 RAMBlock *block;
0d53d9fe 1475 RAMBlock *last_block = NULL;
2152f5ca
JQ
1476 ram_addr_t old_ram_size, new_ram_size;
1477
1478 old_ram_size = last_ram_offset() >> TARGET_PAGE_BITS;
c5705a77 1479
b2a8658e 1480 qemu_mutex_lock_ramlist();
9b8424d5 1481 new_block->offset = find_ram_offset(new_block->max_length);
e1c57ab8
PB
1482
1483 if (!new_block->host) {
1484 if (xen_enabled()) {
9b8424d5
MT
1485 xen_ram_alloc(new_block->offset, new_block->max_length,
1486 new_block->mr);
e1c57ab8 1487 } else {
9b8424d5 1488 new_block->host = phys_mem_alloc(new_block->max_length,
a2b257d6 1489 &new_block->mr->align);
39228250 1490 if (!new_block->host) {
ef701d7b
HT
1491 error_setg_errno(errp, errno,
1492 "cannot set up guest memory '%s'",
1493 memory_region_name(new_block->mr));
1494 qemu_mutex_unlock_ramlist();
1495 return -1;
39228250 1496 }
9b8424d5 1497 memory_try_enable_merging(new_block->host, new_block->max_length);
6977dfe6 1498 }
c902760f 1499 }
94a6b54f 1500
dd631697
LZ
1501 new_ram_size = MAX(old_ram_size,
1502 (new_block->offset + new_block->max_length) >> TARGET_PAGE_BITS);
1503 if (new_ram_size > old_ram_size) {
1504 migration_bitmap_extend(old_ram_size, new_ram_size);
1505 }
0d53d9fe
MD
1506 /* Keep the list sorted from biggest to smallest block. Unlike QTAILQ,
1507 * QLIST (which has an RCU-friendly variant) does not have insertion at
1508 * tail, so save the last element in last_block.
1509 */
0dc3f44a 1510 QLIST_FOREACH_RCU(block, &ram_list.blocks, next) {
0d53d9fe 1511 last_block = block;
9b8424d5 1512 if (block->max_length < new_block->max_length) {
abb26d63
PB
1513 break;
1514 }
1515 }
1516 if (block) {
0dc3f44a 1517 QLIST_INSERT_BEFORE_RCU(block, new_block, next);
0d53d9fe 1518 } else if (last_block) {
0dc3f44a 1519 QLIST_INSERT_AFTER_RCU(last_block, new_block, next);
0d53d9fe 1520 } else { /* list is empty */
0dc3f44a 1521 QLIST_INSERT_HEAD_RCU(&ram_list.blocks, new_block, next);
abb26d63 1522 }
0d6d3c87 1523 ram_list.mru_block = NULL;
94a6b54f 1524
0dc3f44a
MD
1525 /* Write list before version */
1526 smp_wmb();
f798b07f 1527 ram_list.version++;
b2a8658e 1528 qemu_mutex_unlock_ramlist();
f798b07f 1529
2152f5ca
JQ
1530 new_ram_size = last_ram_offset() >> TARGET_PAGE_BITS;
1531
1532 if (new_ram_size > old_ram_size) {
1ab4c8ce 1533 int i;
ae3a7047
MD
1534
1535 /* ram_list.dirty_memory[] is protected by the iothread lock. */
1ab4c8ce
JQ
1536 for (i = 0; i < DIRTY_MEMORY_NUM; i++) {
1537 ram_list.dirty_memory[i] =
1538 bitmap_zero_extend(ram_list.dirty_memory[i],
1539 old_ram_size, new_ram_size);
1540 }
2152f5ca 1541 }
9b8424d5 1542 cpu_physical_memory_set_dirty_range(new_block->offset,
58d2707e
PB
1543 new_block->used_length,
1544 DIRTY_CLIENTS_ALL);
94a6b54f 1545
a904c911
PB
1546 if (new_block->host) {
1547 qemu_ram_setup_dump(new_block->host, new_block->max_length);
1548 qemu_madvise(new_block->host, new_block->max_length, QEMU_MADV_HUGEPAGE);
1549 qemu_madvise(new_block->host, new_block->max_length, QEMU_MADV_DONTFORK);
1550 if (kvm_enabled()) {
1551 kvm_setup_guest_memory(new_block->host, new_block->max_length);
1552 }
e1c57ab8 1553 }
6f0437e8 1554
94a6b54f
PB
1555 return new_block->offset;
1556}
e9a1ab19 1557
0b183fc8 1558#ifdef __linux__
e1c57ab8 1559ram_addr_t qemu_ram_alloc_from_file(ram_addr_t size, MemoryRegion *mr,
dbcb8981 1560 bool share, const char *mem_path,
7f56e740 1561 Error **errp)
e1c57ab8
PB
1562{
1563 RAMBlock *new_block;
ef701d7b
HT
1564 ram_addr_t addr;
1565 Error *local_err = NULL;
e1c57ab8
PB
1566
1567 if (xen_enabled()) {
7f56e740
PB
1568 error_setg(errp, "-mem-path not supported with Xen");
1569 return -1;
e1c57ab8
PB
1570 }
1571
1572 if (phys_mem_alloc != qemu_anon_ram_alloc) {
1573 /*
1574 * file_ram_alloc() needs to allocate just like
1575 * phys_mem_alloc, but we haven't bothered to provide
1576 * a hook there.
1577 */
7f56e740
PB
1578 error_setg(errp,
1579 "-mem-path not supported with this accelerator");
1580 return -1;
e1c57ab8
PB
1581 }
1582
4ed023ce 1583 size = HOST_PAGE_ALIGN(size);
e1c57ab8
PB
1584 new_block = g_malloc0(sizeof(*new_block));
1585 new_block->mr = mr;
9b8424d5
MT
1586 new_block->used_length = size;
1587 new_block->max_length = size;
dbcb8981 1588 new_block->flags = share ? RAM_SHARED : 0;
7f56e740
PB
1589 new_block->host = file_ram_alloc(new_block, size,
1590 mem_path, errp);
1591 if (!new_block->host) {
1592 g_free(new_block);
1593 return -1;
1594 }
1595
ef701d7b
HT
1596 addr = ram_block_add(new_block, &local_err);
1597 if (local_err) {
1598 g_free(new_block);
1599 error_propagate(errp, local_err);
1600 return -1;
1601 }
1602 return addr;
e1c57ab8 1603}
0b183fc8 1604#endif
e1c57ab8 1605
62be4e3a
MT
1606static
1607ram_addr_t qemu_ram_alloc_internal(ram_addr_t size, ram_addr_t max_size,
1608 void (*resized)(const char*,
1609 uint64_t length,
1610 void *host),
1611 void *host, bool resizeable,
ef701d7b 1612 MemoryRegion *mr, Error **errp)
e1c57ab8
PB
1613{
1614 RAMBlock *new_block;
ef701d7b
HT
1615 ram_addr_t addr;
1616 Error *local_err = NULL;
e1c57ab8 1617
4ed023ce
DDAG
1618 size = HOST_PAGE_ALIGN(size);
1619 max_size = HOST_PAGE_ALIGN(max_size);
e1c57ab8
PB
1620 new_block = g_malloc0(sizeof(*new_block));
1621 new_block->mr = mr;
62be4e3a 1622 new_block->resized = resized;
9b8424d5
MT
1623 new_block->used_length = size;
1624 new_block->max_length = max_size;
62be4e3a 1625 assert(max_size >= size);
e1c57ab8
PB
1626 new_block->fd = -1;
1627 new_block->host = host;
1628 if (host) {
7bd4f430 1629 new_block->flags |= RAM_PREALLOC;
e1c57ab8 1630 }
62be4e3a
MT
1631 if (resizeable) {
1632 new_block->flags |= RAM_RESIZEABLE;
1633 }
ef701d7b
HT
1634 addr = ram_block_add(new_block, &local_err);
1635 if (local_err) {
1636 g_free(new_block);
1637 error_propagate(errp, local_err);
1638 return -1;
1639 }
1640 return addr;
e1c57ab8
PB
1641}
1642
62be4e3a
MT
1643ram_addr_t qemu_ram_alloc_from_ptr(ram_addr_t size, void *host,
1644 MemoryRegion *mr, Error **errp)
1645{
1646 return qemu_ram_alloc_internal(size, size, NULL, host, false, mr, errp);
1647}
1648
ef701d7b 1649ram_addr_t qemu_ram_alloc(ram_addr_t size, MemoryRegion *mr, Error **errp)
6977dfe6 1650{
62be4e3a
MT
1651 return qemu_ram_alloc_internal(size, size, NULL, NULL, false, mr, errp);
1652}
1653
1654ram_addr_t qemu_ram_alloc_resizeable(ram_addr_t size, ram_addr_t maxsz,
1655 void (*resized)(const char*,
1656 uint64_t length,
1657 void *host),
1658 MemoryRegion *mr, Error **errp)
1659{
1660 return qemu_ram_alloc_internal(size, maxsz, resized, NULL, true, mr, errp);
6977dfe6
YT
1661}
1662
43771539
PB
1663static void reclaim_ramblock(RAMBlock *block)
1664{
1665 if (block->flags & RAM_PREALLOC) {
1666 ;
1667 } else if (xen_enabled()) {
1668 xen_invalidate_map_cache_entry(block->host);
1669#ifndef _WIN32
1670 } else if (block->fd >= 0) {
2f3a2bb1 1671 qemu_ram_munmap(block->host, block->max_length);
43771539
PB
1672 close(block->fd);
1673#endif
1674 } else {
1675 qemu_anon_ram_free(block->host, block->max_length);
1676 }
1677 g_free(block);
1678}
1679
c227f099 1680void qemu_ram_free(ram_addr_t addr)
e9a1ab19 1681{
04b16653
AW
1682 RAMBlock *block;
1683
b2a8658e 1684 qemu_mutex_lock_ramlist();
0dc3f44a 1685 QLIST_FOREACH_RCU(block, &ram_list.blocks, next) {
04b16653 1686 if (addr == block->offset) {
0dc3f44a 1687 QLIST_REMOVE_RCU(block, next);
0d6d3c87 1688 ram_list.mru_block = NULL;
0dc3f44a
MD
1689 /* Write list before version */
1690 smp_wmb();
f798b07f 1691 ram_list.version++;
43771539 1692 call_rcu(block, reclaim_ramblock, rcu);
b2a8658e 1693 break;
04b16653
AW
1694 }
1695 }
b2a8658e 1696 qemu_mutex_unlock_ramlist();
e9a1ab19
FB
1697}
1698
cd19cfa2
HY
1699#ifndef _WIN32
1700void qemu_ram_remap(ram_addr_t addr, ram_addr_t length)
1701{
1702 RAMBlock *block;
1703 ram_addr_t offset;
1704 int flags;
1705 void *area, *vaddr;
1706
0dc3f44a 1707 QLIST_FOREACH_RCU(block, &ram_list.blocks, next) {
cd19cfa2 1708 offset = addr - block->offset;
9b8424d5 1709 if (offset < block->max_length) {
1240be24 1710 vaddr = ramblock_ptr(block, offset);
7bd4f430 1711 if (block->flags & RAM_PREALLOC) {
cd19cfa2 1712 ;
dfeaf2ab
MA
1713 } else if (xen_enabled()) {
1714 abort();
cd19cfa2
HY
1715 } else {
1716 flags = MAP_FIXED;
3435f395 1717 if (block->fd >= 0) {
dbcb8981
PB
1718 flags |= (block->flags & RAM_SHARED ?
1719 MAP_SHARED : MAP_PRIVATE);
3435f395
MA
1720 area = mmap(vaddr, length, PROT_READ | PROT_WRITE,
1721 flags, block->fd, offset);
cd19cfa2 1722 } else {
2eb9fbaa
MA
1723 /*
1724 * Remap needs to match alloc. Accelerators that
1725 * set phys_mem_alloc never remap. If they did,
1726 * we'd need a remap hook here.
1727 */
1728 assert(phys_mem_alloc == qemu_anon_ram_alloc);
1729
cd19cfa2
HY
1730 flags |= MAP_PRIVATE | MAP_ANONYMOUS;
1731 area = mmap(vaddr, length, PROT_READ | PROT_WRITE,
1732 flags, -1, 0);
cd19cfa2
HY
1733 }
1734 if (area != vaddr) {
f15fbc4b
AP
1735 fprintf(stderr, "Could not remap addr: "
1736 RAM_ADDR_FMT "@" RAM_ADDR_FMT "\n",
cd19cfa2
HY
1737 length, addr);
1738 exit(1);
1739 }
8490fc78 1740 memory_try_enable_merging(vaddr, length);
ddb97f1d 1741 qemu_ram_setup_dump(vaddr, length);
cd19cfa2 1742 }
cd19cfa2
HY
1743 }
1744 }
1745}
1746#endif /* !_WIN32 */
1747
a35ba7be
PB
1748int qemu_get_ram_fd(ram_addr_t addr)
1749{
ae3a7047
MD
1750 RAMBlock *block;
1751 int fd;
a35ba7be 1752
0dc3f44a 1753 rcu_read_lock();
ae3a7047
MD
1754 block = qemu_get_ram_block(addr);
1755 fd = block->fd;
0dc3f44a 1756 rcu_read_unlock();
ae3a7047 1757 return fd;
a35ba7be
PB
1758}
1759
3fd74b84
DM
1760void *qemu_get_ram_block_host_ptr(ram_addr_t addr)
1761{
ae3a7047
MD
1762 RAMBlock *block;
1763 void *ptr;
3fd74b84 1764
0dc3f44a 1765 rcu_read_lock();
ae3a7047
MD
1766 block = qemu_get_ram_block(addr);
1767 ptr = ramblock_ptr(block, 0);
0dc3f44a 1768 rcu_read_unlock();
ae3a7047 1769 return ptr;
3fd74b84
DM
1770}
1771
1b5ec234 1772/* Return a host pointer to ram allocated with qemu_ram_alloc.
ae3a7047
MD
1773 * This should not be used for general purpose DMA. Use address_space_map
1774 * or address_space_rw instead. For local memory (e.g. video ram) that the
1775 * device owns, use memory_region_get_ram_ptr.
0dc3f44a 1776 *
49b24afc 1777 * Called within RCU critical section.
1b5ec234
PB
1778 */
1779void *qemu_get_ram_ptr(ram_addr_t addr)
1780{
49b24afc 1781 RAMBlock *block = qemu_get_ram_block(addr);
ae3a7047
MD
1782
1783 if (xen_enabled() && block->host == NULL) {
0d6d3c87
PB
1784 /* We need to check if the requested address is in the RAM
1785 * because we don't want to map the entire memory in QEMU.
1786 * In that case just map until the end of the page.
1787 */
1788 if (block->offset == 0) {
49b24afc 1789 return xen_map_cache(addr, 0, 0);
0d6d3c87 1790 }
ae3a7047
MD
1791
1792 block->host = xen_map_cache(block->offset, block->max_length, 1);
0d6d3c87 1793 }
49b24afc 1794 return ramblock_ptr(block, addr - block->offset);
dc828ca1
PB
1795}
1796
38bee5dc 1797/* Return a host pointer to guest's ram. Similar to qemu_get_ram_ptr
ae3a7047 1798 * but takes a size argument.
0dc3f44a 1799 *
e81bcda5 1800 * Called within RCU critical section.
ae3a7047 1801 */
cb85f7ab 1802static void *qemu_ram_ptr_length(ram_addr_t addr, hwaddr *size)
38bee5dc 1803{
e81bcda5
PB
1804 RAMBlock *block;
1805 ram_addr_t offset_inside_block;
8ab934f9
SS
1806 if (*size == 0) {
1807 return NULL;
1808 }
e81bcda5
PB
1809
1810 block = qemu_get_ram_block(addr);
1811 offset_inside_block = addr - block->offset;
1812 *size = MIN(*size, block->max_length - offset_inside_block);
1813
1814 if (xen_enabled() && block->host == NULL) {
1815 /* We need to check if the requested address is in the RAM
1816 * because we don't want to map the entire memory in QEMU.
1817 * In that case just map the requested area.
1818 */
1819 if (block->offset == 0) {
1820 return xen_map_cache(addr, *size, 1);
38bee5dc
SS
1821 }
1822
e81bcda5 1823 block->host = xen_map_cache(block->offset, block->max_length, 1);
38bee5dc 1824 }
e81bcda5
PB
1825
1826 return ramblock_ptr(block, offset_inside_block);
38bee5dc
SS
1827}
1828
422148d3
DDAG
1829/*
1830 * Translates a host ptr back to a RAMBlock, a ram_addr and an offset
1831 * in that RAMBlock.
1832 *
1833 * ptr: Host pointer to look up
1834 * round_offset: If true round the result offset down to a page boundary
1835 * *ram_addr: set to result ram_addr
1836 * *offset: set to result offset within the RAMBlock
1837 *
1838 * Returns: RAMBlock (or NULL if not found)
ae3a7047
MD
1839 *
1840 * By the time this function returns, the returned pointer is not protected
1841 * by RCU anymore. If the caller is not within an RCU critical section and
1842 * does not hold the iothread lock, it must have other means of protecting the
1843 * pointer, such as a reference to the region that includes the incoming
1844 * ram_addr_t.
1845 */
422148d3
DDAG
1846RAMBlock *qemu_ram_block_from_host(void *ptr, bool round_offset,
1847 ram_addr_t *ram_addr,
1848 ram_addr_t *offset)
5579c7f3 1849{
94a6b54f
PB
1850 RAMBlock *block;
1851 uint8_t *host = ptr;
1852
868bb33f 1853 if (xen_enabled()) {
0dc3f44a 1854 rcu_read_lock();
e41d7c69 1855 *ram_addr = xen_ram_addr_from_mapcache(ptr);
422148d3
DDAG
1856 block = qemu_get_ram_block(*ram_addr);
1857 if (block) {
1858 *offset = (host - block->host);
1859 }
0dc3f44a 1860 rcu_read_unlock();
422148d3 1861 return block;
712c2b41
SS
1862 }
1863
0dc3f44a
MD
1864 rcu_read_lock();
1865 block = atomic_rcu_read(&ram_list.mru_block);
9b8424d5 1866 if (block && block->host && host - block->host < block->max_length) {
23887b79
PB
1867 goto found;
1868 }
1869
0dc3f44a 1870 QLIST_FOREACH_RCU(block, &ram_list.blocks, next) {
432d268c
JN
1871 /* This case append when the block is not mapped. */
1872 if (block->host == NULL) {
1873 continue;
1874 }
9b8424d5 1875 if (host - block->host < block->max_length) {
23887b79 1876 goto found;
f471a17e 1877 }
94a6b54f 1878 }
432d268c 1879
0dc3f44a 1880 rcu_read_unlock();
1b5ec234 1881 return NULL;
23887b79
PB
1882
1883found:
422148d3
DDAG
1884 *offset = (host - block->host);
1885 if (round_offset) {
1886 *offset &= TARGET_PAGE_MASK;
1887 }
1888 *ram_addr = block->offset + *offset;
0dc3f44a 1889 rcu_read_unlock();
422148d3
DDAG
1890 return block;
1891}
1892
e3dd7493
DDAG
1893/*
1894 * Finds the named RAMBlock
1895 *
1896 * name: The name of RAMBlock to find
1897 *
1898 * Returns: RAMBlock (or NULL if not found)
1899 */
1900RAMBlock *qemu_ram_block_by_name(const char *name)
1901{
1902 RAMBlock *block;
1903
1904 QLIST_FOREACH_RCU(block, &ram_list.blocks, next) {
1905 if (!strcmp(name, block->idstr)) {
1906 return block;
1907 }
1908 }
1909
1910 return NULL;
1911}
1912
422148d3
DDAG
1913/* Some of the softmmu routines need to translate from a host pointer
1914 (typically a TLB entry) back to a ram offset. */
1915MemoryRegion *qemu_ram_addr_from_host(void *ptr, ram_addr_t *ram_addr)
1916{
1917 RAMBlock *block;
1918 ram_addr_t offset; /* Not used */
1919
1920 block = qemu_ram_block_from_host(ptr, false, ram_addr, &offset);
1921
1922 if (!block) {
1923 return NULL;
1924 }
1925
1926 return block->mr;
e890261f 1927}
f471a17e 1928
49b24afc 1929/* Called within RCU critical section. */
a8170e5e 1930static void notdirty_mem_write(void *opaque, hwaddr ram_addr,
0e0df1e2 1931 uint64_t val, unsigned size)
9fa3e853 1932{
52159192 1933 if (!cpu_physical_memory_get_dirty_flag(ram_addr, DIRTY_MEMORY_CODE)) {
0e0df1e2 1934 tb_invalidate_phys_page_fast(ram_addr, size);
3a7d929e 1935 }
0e0df1e2
AK
1936 switch (size) {
1937 case 1:
1938 stb_p(qemu_get_ram_ptr(ram_addr), val);
1939 break;
1940 case 2:
1941 stw_p(qemu_get_ram_ptr(ram_addr), val);
1942 break;
1943 case 4:
1944 stl_p(qemu_get_ram_ptr(ram_addr), val);
1945 break;
1946 default:
1947 abort();
3a7d929e 1948 }
58d2707e
PB
1949 /* Set both VGA and migration bits for simplicity and to remove
1950 * the notdirty callback faster.
1951 */
1952 cpu_physical_memory_set_dirty_range(ram_addr, size,
1953 DIRTY_CLIENTS_NOCODE);
f23db169
FB
1954 /* we remove the notdirty callback only if the code has been
1955 flushed */
a2cd8c85 1956 if (!cpu_physical_memory_is_clean(ram_addr)) {
bcae01e4 1957 tlb_set_dirty(current_cpu, current_cpu->mem_io_vaddr);
4917cf44 1958 }
9fa3e853
FB
1959}
1960
b018ddf6
PB
1961static bool notdirty_mem_accepts(void *opaque, hwaddr addr,
1962 unsigned size, bool is_write)
1963{
1964 return is_write;
1965}
1966
0e0df1e2 1967static const MemoryRegionOps notdirty_mem_ops = {
0e0df1e2 1968 .write = notdirty_mem_write,
b018ddf6 1969 .valid.accepts = notdirty_mem_accepts,
0e0df1e2 1970 .endianness = DEVICE_NATIVE_ENDIAN,
1ccde1cb
FB
1971};
1972
0f459d16 1973/* Generate a debug exception if a watchpoint has been hit. */
66b9b43c 1974static void check_watchpoint(int offset, int len, MemTxAttrs attrs, int flags)
0f459d16 1975{
93afeade
AF
1976 CPUState *cpu = current_cpu;
1977 CPUArchState *env = cpu->env_ptr;
06d55cc1 1978 target_ulong pc, cs_base;
0f459d16 1979 target_ulong vaddr;
a1d1bb31 1980 CPUWatchpoint *wp;
06d55cc1 1981 int cpu_flags;
0f459d16 1982
ff4700b0 1983 if (cpu->watchpoint_hit) {
06d55cc1
AL
1984 /* We re-entered the check after replacing the TB. Now raise
1985 * the debug interrupt so that is will trigger after the
1986 * current instruction. */
93afeade 1987 cpu_interrupt(cpu, CPU_INTERRUPT_DEBUG);
06d55cc1
AL
1988 return;
1989 }
93afeade 1990 vaddr = (cpu->mem_io_vaddr & TARGET_PAGE_MASK) + offset;
ff4700b0 1991 QTAILQ_FOREACH(wp, &cpu->watchpoints, entry) {
05068c0d
PM
1992 if (cpu_watchpoint_address_matches(wp, vaddr, len)
1993 && (wp->flags & flags)) {
08225676
PM
1994 if (flags == BP_MEM_READ) {
1995 wp->flags |= BP_WATCHPOINT_HIT_READ;
1996 } else {
1997 wp->flags |= BP_WATCHPOINT_HIT_WRITE;
1998 }
1999 wp->hitaddr = vaddr;
66b9b43c 2000 wp->hitattrs = attrs;
ff4700b0
AF
2001 if (!cpu->watchpoint_hit) {
2002 cpu->watchpoint_hit = wp;
239c51a5 2003 tb_check_watchpoint(cpu);
6e140f28 2004 if (wp->flags & BP_STOP_BEFORE_ACCESS) {
27103424 2005 cpu->exception_index = EXCP_DEBUG;
5638d180 2006 cpu_loop_exit(cpu);
6e140f28
AL
2007 } else {
2008 cpu_get_tb_cpu_state(env, &pc, &cs_base, &cpu_flags);
648f034c 2009 tb_gen_code(cpu, pc, cs_base, cpu_flags, 1);
0ea8cb88 2010 cpu_resume_from_signal(cpu, NULL);
6e140f28 2011 }
06d55cc1 2012 }
6e140f28
AL
2013 } else {
2014 wp->flags &= ~BP_WATCHPOINT_HIT;
0f459d16
PB
2015 }
2016 }
2017}
2018
6658ffb8
PB
2019/* Watchpoint access routines. Watchpoints are inserted using TLB tricks,
2020 so these check for a hit then pass through to the normal out-of-line
2021 phys routines. */
66b9b43c
PM
2022static MemTxResult watch_mem_read(void *opaque, hwaddr addr, uint64_t *pdata,
2023 unsigned size, MemTxAttrs attrs)
6658ffb8 2024{
66b9b43c
PM
2025 MemTxResult res;
2026 uint64_t data;
2027
2028 check_watchpoint(addr & ~TARGET_PAGE_MASK, size, attrs, BP_MEM_READ);
1ec9b909 2029 switch (size) {
66b9b43c
PM
2030 case 1:
2031 data = address_space_ldub(&address_space_memory, addr, attrs, &res);
2032 break;
2033 case 2:
2034 data = address_space_lduw(&address_space_memory, addr, attrs, &res);
2035 break;
2036 case 4:
2037 data = address_space_ldl(&address_space_memory, addr, attrs, &res);
2038 break;
1ec9b909
AK
2039 default: abort();
2040 }
66b9b43c
PM
2041 *pdata = data;
2042 return res;
6658ffb8
PB
2043}
2044
66b9b43c
PM
2045static MemTxResult watch_mem_write(void *opaque, hwaddr addr,
2046 uint64_t val, unsigned size,
2047 MemTxAttrs attrs)
6658ffb8 2048{
66b9b43c
PM
2049 MemTxResult res;
2050
2051 check_watchpoint(addr & ~TARGET_PAGE_MASK, size, attrs, BP_MEM_WRITE);
1ec9b909 2052 switch (size) {
67364150 2053 case 1:
66b9b43c 2054 address_space_stb(&address_space_memory, addr, val, attrs, &res);
67364150
MF
2055 break;
2056 case 2:
66b9b43c 2057 address_space_stw(&address_space_memory, addr, val, attrs, &res);
67364150
MF
2058 break;
2059 case 4:
66b9b43c 2060 address_space_stl(&address_space_memory, addr, val, attrs, &res);
67364150 2061 break;
1ec9b909
AK
2062 default: abort();
2063 }
66b9b43c 2064 return res;
6658ffb8
PB
2065}
2066
1ec9b909 2067static const MemoryRegionOps watch_mem_ops = {
66b9b43c
PM
2068 .read_with_attrs = watch_mem_read,
2069 .write_with_attrs = watch_mem_write,
1ec9b909 2070 .endianness = DEVICE_NATIVE_ENDIAN,
6658ffb8 2071};
6658ffb8 2072
f25a49e0
PM
2073static MemTxResult subpage_read(void *opaque, hwaddr addr, uint64_t *data,
2074 unsigned len, MemTxAttrs attrs)
db7b5426 2075{
acc9d80b 2076 subpage_t *subpage = opaque;
ff6cff75 2077 uint8_t buf[8];
5c9eb028 2078 MemTxResult res;
791af8c8 2079
db7b5426 2080#if defined(DEBUG_SUBPAGE)
016e9d62 2081 printf("%s: subpage %p len %u addr " TARGET_FMT_plx "\n", __func__,
acc9d80b 2082 subpage, len, addr);
db7b5426 2083#endif
5c9eb028
PM
2084 res = address_space_read(subpage->as, addr + subpage->base,
2085 attrs, buf, len);
2086 if (res) {
2087 return res;
f25a49e0 2088 }
acc9d80b
JK
2089 switch (len) {
2090 case 1:
f25a49e0
PM
2091 *data = ldub_p(buf);
2092 return MEMTX_OK;
acc9d80b 2093 case 2:
f25a49e0
PM
2094 *data = lduw_p(buf);
2095 return MEMTX_OK;
acc9d80b 2096 case 4:
f25a49e0
PM
2097 *data = ldl_p(buf);
2098 return MEMTX_OK;
ff6cff75 2099 case 8:
f25a49e0
PM
2100 *data = ldq_p(buf);
2101 return MEMTX_OK;
acc9d80b
JK
2102 default:
2103 abort();
2104 }
db7b5426
BS
2105}
2106
f25a49e0
PM
2107static MemTxResult subpage_write(void *opaque, hwaddr addr,
2108 uint64_t value, unsigned len, MemTxAttrs attrs)
db7b5426 2109{
acc9d80b 2110 subpage_t *subpage = opaque;
ff6cff75 2111 uint8_t buf[8];
acc9d80b 2112
db7b5426 2113#if defined(DEBUG_SUBPAGE)
016e9d62 2114 printf("%s: subpage %p len %u addr " TARGET_FMT_plx
acc9d80b
JK
2115 " value %"PRIx64"\n",
2116 __func__, subpage, len, addr, value);
db7b5426 2117#endif
acc9d80b
JK
2118 switch (len) {
2119 case 1:
2120 stb_p(buf, value);
2121 break;
2122 case 2:
2123 stw_p(buf, value);
2124 break;
2125 case 4:
2126 stl_p(buf, value);
2127 break;
ff6cff75
PB
2128 case 8:
2129 stq_p(buf, value);
2130 break;
acc9d80b
JK
2131 default:
2132 abort();
2133 }
5c9eb028
PM
2134 return address_space_write(subpage->as, addr + subpage->base,
2135 attrs, buf, len);
db7b5426
BS
2136}
2137
c353e4cc 2138static bool subpage_accepts(void *opaque, hwaddr addr,
016e9d62 2139 unsigned len, bool is_write)
c353e4cc 2140{
acc9d80b 2141 subpage_t *subpage = opaque;
c353e4cc 2142#if defined(DEBUG_SUBPAGE)
016e9d62 2143 printf("%s: subpage %p %c len %u addr " TARGET_FMT_plx "\n",
acc9d80b 2144 __func__, subpage, is_write ? 'w' : 'r', len, addr);
c353e4cc
PB
2145#endif
2146
acc9d80b 2147 return address_space_access_valid(subpage->as, addr + subpage->base,
016e9d62 2148 len, is_write);
c353e4cc
PB
2149}
2150
70c68e44 2151static const MemoryRegionOps subpage_ops = {
f25a49e0
PM
2152 .read_with_attrs = subpage_read,
2153 .write_with_attrs = subpage_write,
ff6cff75
PB
2154 .impl.min_access_size = 1,
2155 .impl.max_access_size = 8,
2156 .valid.min_access_size = 1,
2157 .valid.max_access_size = 8,
c353e4cc 2158 .valid.accepts = subpage_accepts,
70c68e44 2159 .endianness = DEVICE_NATIVE_ENDIAN,
db7b5426
BS
2160};
2161
c227f099 2162static int subpage_register (subpage_t *mmio, uint32_t start, uint32_t end,
5312bd8b 2163 uint16_t section)
db7b5426
BS
2164{
2165 int idx, eidx;
2166
2167 if (start >= TARGET_PAGE_SIZE || end >= TARGET_PAGE_SIZE)
2168 return -1;
2169 idx = SUBPAGE_IDX(start);
2170 eidx = SUBPAGE_IDX(end);
2171#if defined(DEBUG_SUBPAGE)
016e9d62
AK
2172 printf("%s: %p start %08x end %08x idx %08x eidx %08x section %d\n",
2173 __func__, mmio, start, end, idx, eidx, section);
db7b5426 2174#endif
db7b5426 2175 for (; idx <= eidx; idx++) {
5312bd8b 2176 mmio->sub_section[idx] = section;
db7b5426
BS
2177 }
2178
2179 return 0;
2180}
2181
acc9d80b 2182static subpage_t *subpage_init(AddressSpace *as, hwaddr base)
db7b5426 2183{
c227f099 2184 subpage_t *mmio;
db7b5426 2185
7267c094 2186 mmio = g_malloc0(sizeof(subpage_t));
1eec614b 2187
acc9d80b 2188 mmio->as = as;
1eec614b 2189 mmio->base = base;
2c9b15ca 2190 memory_region_init_io(&mmio->iomem, NULL, &subpage_ops, mmio,
b4fefef9 2191 NULL, TARGET_PAGE_SIZE);
b3b00c78 2192 mmio->iomem.subpage = true;
db7b5426 2193#if defined(DEBUG_SUBPAGE)
016e9d62
AK
2194 printf("%s: %p base " TARGET_FMT_plx " len %08x\n", __func__,
2195 mmio, base, TARGET_PAGE_SIZE);
db7b5426 2196#endif
b41aac4f 2197 subpage_register(mmio, 0, TARGET_PAGE_SIZE-1, PHYS_SECTION_UNASSIGNED);
db7b5426
BS
2198
2199 return mmio;
2200}
2201
a656e22f
PC
2202static uint16_t dummy_section(PhysPageMap *map, AddressSpace *as,
2203 MemoryRegion *mr)
5312bd8b 2204{
a656e22f 2205 assert(as);
5312bd8b 2206 MemoryRegionSection section = {
a656e22f 2207 .address_space = as,
5312bd8b
AK
2208 .mr = mr,
2209 .offset_within_address_space = 0,
2210 .offset_within_region = 0,
052e87b0 2211 .size = int128_2_64(),
5312bd8b
AK
2212 };
2213
53cb28cb 2214 return phys_section_add(map, &section);
5312bd8b
AK
2215}
2216
9d82b5a7 2217MemoryRegion *iotlb_to_region(CPUState *cpu, hwaddr index)
aa102231 2218{
32857f4d
PM
2219 CPUAddressSpace *cpuas = &cpu->cpu_ases[0];
2220 AddressSpaceDispatch *d = atomic_rcu_read(&cpuas->memory_dispatch);
79e2b9ae 2221 MemoryRegionSection *sections = d->map.sections;
9d82b5a7
PB
2222
2223 return sections[index & ~TARGET_PAGE_MASK].mr;
aa102231
AK
2224}
2225
e9179ce1
AK
2226static void io_mem_init(void)
2227{
1f6245e5 2228 memory_region_init_io(&io_mem_rom, NULL, &unassigned_mem_ops, NULL, NULL, UINT64_MAX);
2c9b15ca 2229 memory_region_init_io(&io_mem_unassigned, NULL, &unassigned_mem_ops, NULL,
1f6245e5 2230 NULL, UINT64_MAX);
2c9b15ca 2231 memory_region_init_io(&io_mem_notdirty, NULL, &notdirty_mem_ops, NULL,
1f6245e5 2232 NULL, UINT64_MAX);
2c9b15ca 2233 memory_region_init_io(&io_mem_watch, NULL, &watch_mem_ops, NULL,
1f6245e5 2234 NULL, UINT64_MAX);
e9179ce1
AK
2235}
2236
ac1970fb 2237static void mem_begin(MemoryListener *listener)
00752703
PB
2238{
2239 AddressSpace *as = container_of(listener, AddressSpace, dispatch_listener);
53cb28cb
MA
2240 AddressSpaceDispatch *d = g_new0(AddressSpaceDispatch, 1);
2241 uint16_t n;
2242
a656e22f 2243 n = dummy_section(&d->map, as, &io_mem_unassigned);
53cb28cb 2244 assert(n == PHYS_SECTION_UNASSIGNED);
a656e22f 2245 n = dummy_section(&d->map, as, &io_mem_notdirty);
53cb28cb 2246 assert(n == PHYS_SECTION_NOTDIRTY);
a656e22f 2247 n = dummy_section(&d->map, as, &io_mem_rom);
53cb28cb 2248 assert(n == PHYS_SECTION_ROM);
a656e22f 2249 n = dummy_section(&d->map, as, &io_mem_watch);
53cb28cb 2250 assert(n == PHYS_SECTION_WATCH);
00752703 2251
9736e55b 2252 d->phys_map = (PhysPageEntry) { .ptr = PHYS_MAP_NODE_NIL, .skip = 1 };
00752703
PB
2253 d->as = as;
2254 as->next_dispatch = d;
2255}
2256
79e2b9ae
PB
2257static void address_space_dispatch_free(AddressSpaceDispatch *d)
2258{
2259 phys_sections_free(&d->map);
2260 g_free(d);
2261}
2262
00752703 2263static void mem_commit(MemoryListener *listener)
ac1970fb 2264{
89ae337a 2265 AddressSpace *as = container_of(listener, AddressSpace, dispatch_listener);
0475d94f
PB
2266 AddressSpaceDispatch *cur = as->dispatch;
2267 AddressSpaceDispatch *next = as->next_dispatch;
2268
53cb28cb 2269 phys_page_compact_all(next, next->map.nodes_nb);
b35ba30f 2270
79e2b9ae 2271 atomic_rcu_set(&as->dispatch, next);
53cb28cb 2272 if (cur) {
79e2b9ae 2273 call_rcu(cur, address_space_dispatch_free, rcu);
53cb28cb 2274 }
9affd6fc
PB
2275}
2276
1d71148e 2277static void tcg_commit(MemoryListener *listener)
50c1e149 2278{
32857f4d
PM
2279 CPUAddressSpace *cpuas;
2280 AddressSpaceDispatch *d;
117712c3
AK
2281
2282 /* since each CPU stores ram addresses in its TLB cache, we must
2283 reset the modified entries */
32857f4d
PM
2284 cpuas = container_of(listener, CPUAddressSpace, tcg_as_listener);
2285 cpu_reloading_memory_map();
2286 /* The CPU and TLB are protected by the iothread lock.
2287 * We reload the dispatch pointer now because cpu_reloading_memory_map()
2288 * may have split the RCU critical section.
2289 */
2290 d = atomic_rcu_read(&cpuas->as->dispatch);
2291 cpuas->memory_dispatch = d;
2292 tlb_flush(cpuas->cpu, 1);
50c1e149
AK
2293}
2294
ac1970fb
AK
2295void address_space_init_dispatch(AddressSpace *as)
2296{
00752703 2297 as->dispatch = NULL;
89ae337a 2298 as->dispatch_listener = (MemoryListener) {
ac1970fb 2299 .begin = mem_begin,
00752703 2300 .commit = mem_commit,
ac1970fb
AK
2301 .region_add = mem_add,
2302 .region_nop = mem_add,
2303 .priority = 0,
2304 };
89ae337a 2305 memory_listener_register(&as->dispatch_listener, as);
ac1970fb
AK
2306}
2307
6e48e8f9
PB
2308void address_space_unregister(AddressSpace *as)
2309{
2310 memory_listener_unregister(&as->dispatch_listener);
2311}
2312
83f3c251
AK
2313void address_space_destroy_dispatch(AddressSpace *as)
2314{
2315 AddressSpaceDispatch *d = as->dispatch;
2316
79e2b9ae
PB
2317 atomic_rcu_set(&as->dispatch, NULL);
2318 if (d) {
2319 call_rcu(d, address_space_dispatch_free, rcu);
2320 }
83f3c251
AK
2321}
2322
62152b8a
AK
2323static void memory_map_init(void)
2324{
7267c094 2325 system_memory = g_malloc(sizeof(*system_memory));
03f49957 2326
57271d63 2327 memory_region_init(system_memory, NULL, "system", UINT64_MAX);
7dca8043 2328 address_space_init(&address_space_memory, system_memory, "memory");
309cb471 2329
7267c094 2330 system_io = g_malloc(sizeof(*system_io));
3bb28b72
JK
2331 memory_region_init_io(system_io, NULL, &unassigned_io_ops, NULL, "io",
2332 65536);
7dca8043 2333 address_space_init(&address_space_io, system_io, "I/O");
62152b8a
AK
2334}
2335
2336MemoryRegion *get_system_memory(void)
2337{
2338 return system_memory;
2339}
2340
309cb471
AK
2341MemoryRegion *get_system_io(void)
2342{
2343 return system_io;
2344}
2345
e2eef170
PB
2346#endif /* !defined(CONFIG_USER_ONLY) */
2347
13eb76e0
FB
2348/* physical memory access (slow version, mainly for debug) */
2349#if defined(CONFIG_USER_ONLY)
f17ec444 2350int cpu_memory_rw_debug(CPUState *cpu, target_ulong addr,
a68fe89c 2351 uint8_t *buf, int len, int is_write)
13eb76e0
FB
2352{
2353 int l, flags;
2354 target_ulong page;
53a5960a 2355 void * p;
13eb76e0
FB
2356
2357 while (len > 0) {
2358 page = addr & TARGET_PAGE_MASK;
2359 l = (page + TARGET_PAGE_SIZE) - addr;
2360 if (l > len)
2361 l = len;
2362 flags = page_get_flags(page);
2363 if (!(flags & PAGE_VALID))
a68fe89c 2364 return -1;
13eb76e0
FB
2365 if (is_write) {
2366 if (!(flags & PAGE_WRITE))
a68fe89c 2367 return -1;
579a97f7 2368 /* XXX: this code should not depend on lock_user */
72fb7daa 2369 if (!(p = lock_user(VERIFY_WRITE, addr, l, 0)))
a68fe89c 2370 return -1;
72fb7daa
AJ
2371 memcpy(p, buf, l);
2372 unlock_user(p, addr, l);
13eb76e0
FB
2373 } else {
2374 if (!(flags & PAGE_READ))
a68fe89c 2375 return -1;
579a97f7 2376 /* XXX: this code should not depend on lock_user */
72fb7daa 2377 if (!(p = lock_user(VERIFY_READ, addr, l, 1)))
a68fe89c 2378 return -1;
72fb7daa 2379 memcpy(buf, p, l);
5b257578 2380 unlock_user(p, addr, 0);
13eb76e0
FB
2381 }
2382 len -= l;
2383 buf += l;
2384 addr += l;
2385 }
a68fe89c 2386 return 0;
13eb76e0 2387}
8df1cd07 2388
13eb76e0 2389#else
51d7a9eb 2390
845b6214 2391static void invalidate_and_set_dirty(MemoryRegion *mr, hwaddr addr,
a8170e5e 2392 hwaddr length)
51d7a9eb 2393{
e87f7778
PB
2394 uint8_t dirty_log_mask = memory_region_get_dirty_log_mask(mr);
2395 /* No early return if dirty_log_mask is or becomes 0, because
2396 * cpu_physical_memory_set_dirty_range will still call
2397 * xen_modified_memory.
2398 */
2399 if (dirty_log_mask) {
2400 dirty_log_mask =
2401 cpu_physical_memory_range_includes_clean(addr, length, dirty_log_mask);
2402 }
2403 if (dirty_log_mask & (1 << DIRTY_MEMORY_CODE)) {
2404 tb_invalidate_phys_range(addr, addr + length);
2405 dirty_log_mask &= ~(1 << DIRTY_MEMORY_CODE);
51d7a9eb 2406 }
e87f7778 2407 cpu_physical_memory_set_dirty_range(addr, length, dirty_log_mask);
51d7a9eb
AP
2408}
2409
23326164 2410static int memory_access_size(MemoryRegion *mr, unsigned l, hwaddr addr)
82f2563f 2411{
e1622f4b 2412 unsigned access_size_max = mr->ops->valid.max_access_size;
23326164
RH
2413
2414 /* Regions are assumed to support 1-4 byte accesses unless
2415 otherwise specified. */
23326164
RH
2416 if (access_size_max == 0) {
2417 access_size_max = 4;
2418 }
2419
2420 /* Bound the maximum access by the alignment of the address. */
2421 if (!mr->ops->impl.unaligned) {
2422 unsigned align_size_max = addr & -addr;
2423 if (align_size_max != 0 && align_size_max < access_size_max) {
2424 access_size_max = align_size_max;
2425 }
82f2563f 2426 }
23326164
RH
2427
2428 /* Don't attempt accesses larger than the maximum. */
2429 if (l > access_size_max) {
2430 l = access_size_max;
82f2563f 2431 }
6554f5c0 2432 l = pow2floor(l);
23326164
RH
2433
2434 return l;
82f2563f
PB
2435}
2436
4840f10e 2437static bool prepare_mmio_access(MemoryRegion *mr)
125b3806 2438{
4840f10e
JK
2439 bool unlocked = !qemu_mutex_iothread_locked();
2440 bool release_lock = false;
2441
2442 if (unlocked && mr->global_locking) {
2443 qemu_mutex_lock_iothread();
2444 unlocked = false;
2445 release_lock = true;
2446 }
125b3806 2447 if (mr->flush_coalesced_mmio) {
4840f10e
JK
2448 if (unlocked) {
2449 qemu_mutex_lock_iothread();
2450 }
125b3806 2451 qemu_flush_coalesced_mmio_buffer();
4840f10e
JK
2452 if (unlocked) {
2453 qemu_mutex_unlock_iothread();
2454 }
125b3806 2455 }
4840f10e
JK
2456
2457 return release_lock;
125b3806
PB
2458}
2459
a203ac70
PB
2460/* Called within RCU critical section. */
2461static MemTxResult address_space_write_continue(AddressSpace *as, hwaddr addr,
2462 MemTxAttrs attrs,
2463 const uint8_t *buf,
2464 int len, hwaddr addr1,
2465 hwaddr l, MemoryRegion *mr)
13eb76e0 2466{
13eb76e0 2467 uint8_t *ptr;
791af8c8 2468 uint64_t val;
3b643495 2469 MemTxResult result = MEMTX_OK;
4840f10e 2470 bool release_lock = false;
3b46e624 2471
a203ac70 2472 for (;;) {
eb7eeb88
PB
2473 if (!memory_access_is_direct(mr, true)) {
2474 release_lock |= prepare_mmio_access(mr);
2475 l = memory_access_size(mr, l, addr1);
2476 /* XXX: could force current_cpu to NULL to avoid
2477 potential bugs */
2478 switch (l) {
2479 case 8:
2480 /* 64 bit write access */
2481 val = ldq_p(buf);
2482 result |= memory_region_dispatch_write(mr, addr1, val, 8,
2483 attrs);
2484 break;
2485 case 4:
2486 /* 32 bit write access */
2487 val = ldl_p(buf);
2488 result |= memory_region_dispatch_write(mr, addr1, val, 4,
2489 attrs);
2490 break;
2491 case 2:
2492 /* 16 bit write access */
2493 val = lduw_p(buf);
2494 result |= memory_region_dispatch_write(mr, addr1, val, 2,
2495 attrs);
2496 break;
2497 case 1:
2498 /* 8 bit write access */
2499 val = ldub_p(buf);
2500 result |= memory_region_dispatch_write(mr, addr1, val, 1,
2501 attrs);
2502 break;
2503 default:
2504 abort();
13eb76e0
FB
2505 }
2506 } else {
eb7eeb88
PB
2507 addr1 += memory_region_get_ram_addr(mr);
2508 /* RAM case */
2509 ptr = qemu_get_ram_ptr(addr1);
2510 memcpy(ptr, buf, l);
2511 invalidate_and_set_dirty(mr, addr1, l);
13eb76e0 2512 }
4840f10e
JK
2513
2514 if (release_lock) {
2515 qemu_mutex_unlock_iothread();
2516 release_lock = false;
2517 }
2518
13eb76e0
FB
2519 len -= l;
2520 buf += l;
2521 addr += l;
a203ac70
PB
2522
2523 if (!len) {
2524 break;
2525 }
2526
2527 l = len;
2528 mr = address_space_translate(as, addr, &addr1, &l, true);
13eb76e0 2529 }
fd8aaa76 2530
3b643495 2531 return result;
13eb76e0 2532}
8df1cd07 2533
a203ac70
PB
2534MemTxResult address_space_write(AddressSpace *as, hwaddr addr, MemTxAttrs attrs,
2535 const uint8_t *buf, int len)
ac1970fb 2536{
eb7eeb88 2537 hwaddr l;
eb7eeb88
PB
2538 hwaddr addr1;
2539 MemoryRegion *mr;
2540 MemTxResult result = MEMTX_OK;
eb7eeb88 2541
a203ac70
PB
2542 if (len > 0) {
2543 rcu_read_lock();
eb7eeb88 2544 l = len;
a203ac70
PB
2545 mr = address_space_translate(as, addr, &addr1, &l, true);
2546 result = address_space_write_continue(as, addr, attrs, buf, len,
2547 addr1, l, mr);
2548 rcu_read_unlock();
2549 }
2550
2551 return result;
2552}
2553
2554/* Called within RCU critical section. */
2555MemTxResult address_space_read_continue(AddressSpace *as, hwaddr addr,
2556 MemTxAttrs attrs, uint8_t *buf,
2557 int len, hwaddr addr1, hwaddr l,
2558 MemoryRegion *mr)
2559{
2560 uint8_t *ptr;
2561 uint64_t val;
2562 MemTxResult result = MEMTX_OK;
2563 bool release_lock = false;
eb7eeb88 2564
a203ac70 2565 for (;;) {
eb7eeb88
PB
2566 if (!memory_access_is_direct(mr, false)) {
2567 /* I/O case */
2568 release_lock |= prepare_mmio_access(mr);
2569 l = memory_access_size(mr, l, addr1);
2570 switch (l) {
2571 case 8:
2572 /* 64 bit read access */
2573 result |= memory_region_dispatch_read(mr, addr1, &val, 8,
2574 attrs);
2575 stq_p(buf, val);
2576 break;
2577 case 4:
2578 /* 32 bit read access */
2579 result |= memory_region_dispatch_read(mr, addr1, &val, 4,
2580 attrs);
2581 stl_p(buf, val);
2582 break;
2583 case 2:
2584 /* 16 bit read access */
2585 result |= memory_region_dispatch_read(mr, addr1, &val, 2,
2586 attrs);
2587 stw_p(buf, val);
2588 break;
2589 case 1:
2590 /* 8 bit read access */
2591 result |= memory_region_dispatch_read(mr, addr1, &val, 1,
2592 attrs);
2593 stb_p(buf, val);
2594 break;
2595 default:
2596 abort();
2597 }
2598 } else {
2599 /* RAM case */
2600 ptr = qemu_get_ram_ptr(mr->ram_addr + addr1);
2601 memcpy(buf, ptr, l);
2602 }
2603
2604 if (release_lock) {
2605 qemu_mutex_unlock_iothread();
2606 release_lock = false;
2607 }
2608
2609 len -= l;
2610 buf += l;
2611 addr += l;
a203ac70
PB
2612
2613 if (!len) {
2614 break;
2615 }
2616
2617 l = len;
2618 mr = address_space_translate(as, addr, &addr1, &l, false);
2619 }
2620
2621 return result;
2622}
2623
3cc8f884
PB
2624MemTxResult address_space_read_full(AddressSpace *as, hwaddr addr,
2625 MemTxAttrs attrs, uint8_t *buf, int len)
a203ac70
PB
2626{
2627 hwaddr l;
2628 hwaddr addr1;
2629 MemoryRegion *mr;
2630 MemTxResult result = MEMTX_OK;
2631
2632 if (len > 0) {
2633 rcu_read_lock();
2634 l = len;
2635 mr = address_space_translate(as, addr, &addr1, &l, false);
2636 result = address_space_read_continue(as, addr, attrs, buf, len,
2637 addr1, l, mr);
2638 rcu_read_unlock();
eb7eeb88 2639 }
eb7eeb88
PB
2640
2641 return result;
ac1970fb
AK
2642}
2643
eb7eeb88
PB
2644MemTxResult address_space_rw(AddressSpace *as, hwaddr addr, MemTxAttrs attrs,
2645 uint8_t *buf, int len, bool is_write)
2646{
2647 if (is_write) {
2648 return address_space_write(as, addr, attrs, (uint8_t *)buf, len);
2649 } else {
2650 return address_space_read(as, addr, attrs, (uint8_t *)buf, len);
2651 }
2652}
ac1970fb 2653
a8170e5e 2654void cpu_physical_memory_rw(hwaddr addr, uint8_t *buf,
ac1970fb
AK
2655 int len, int is_write)
2656{
5c9eb028
PM
2657 address_space_rw(&address_space_memory, addr, MEMTXATTRS_UNSPECIFIED,
2658 buf, len, is_write);
ac1970fb
AK
2659}
2660
582b55a9
AG
2661enum write_rom_type {
2662 WRITE_DATA,
2663 FLUSH_CACHE,
2664};
2665
2a221651 2666static inline void cpu_physical_memory_write_rom_internal(AddressSpace *as,
582b55a9 2667 hwaddr addr, const uint8_t *buf, int len, enum write_rom_type type)
d0ecd2aa 2668{
149f54b5 2669 hwaddr l;
d0ecd2aa 2670 uint8_t *ptr;
149f54b5 2671 hwaddr addr1;
5c8a00ce 2672 MemoryRegion *mr;
3b46e624 2673
41063e1e 2674 rcu_read_lock();
d0ecd2aa 2675 while (len > 0) {
149f54b5 2676 l = len;
2a221651 2677 mr = address_space_translate(as, addr, &addr1, &l, true);
3b46e624 2678
5c8a00ce
PB
2679 if (!(memory_region_is_ram(mr) ||
2680 memory_region_is_romd(mr))) {
b242e0e0 2681 l = memory_access_size(mr, l, addr1);
d0ecd2aa 2682 } else {
5c8a00ce 2683 addr1 += memory_region_get_ram_addr(mr);
d0ecd2aa 2684 /* ROM/RAM case */
5579c7f3 2685 ptr = qemu_get_ram_ptr(addr1);
582b55a9
AG
2686 switch (type) {
2687 case WRITE_DATA:
2688 memcpy(ptr, buf, l);
845b6214 2689 invalidate_and_set_dirty(mr, addr1, l);
582b55a9
AG
2690 break;
2691 case FLUSH_CACHE:
2692 flush_icache_range((uintptr_t)ptr, (uintptr_t)ptr + l);
2693 break;
2694 }
d0ecd2aa
FB
2695 }
2696 len -= l;
2697 buf += l;
2698 addr += l;
2699 }
41063e1e 2700 rcu_read_unlock();
d0ecd2aa
FB
2701}
2702
582b55a9 2703/* used for ROM loading : can write in RAM and ROM */
2a221651 2704void cpu_physical_memory_write_rom(AddressSpace *as, hwaddr addr,
582b55a9
AG
2705 const uint8_t *buf, int len)
2706{
2a221651 2707 cpu_physical_memory_write_rom_internal(as, addr, buf, len, WRITE_DATA);
582b55a9
AG
2708}
2709
2710void cpu_flush_icache_range(hwaddr start, int len)
2711{
2712 /*
2713 * This function should do the same thing as an icache flush that was
2714 * triggered from within the guest. For TCG we are always cache coherent,
2715 * so there is no need to flush anything. For KVM / Xen we need to flush
2716 * the host's instruction cache at least.
2717 */
2718 if (tcg_enabled()) {
2719 return;
2720 }
2721
2a221651
EI
2722 cpu_physical_memory_write_rom_internal(&address_space_memory,
2723 start, NULL, len, FLUSH_CACHE);
582b55a9
AG
2724}
2725
6d16c2f8 2726typedef struct {
d3e71559 2727 MemoryRegion *mr;
6d16c2f8 2728 void *buffer;
a8170e5e
AK
2729 hwaddr addr;
2730 hwaddr len;
c2cba0ff 2731 bool in_use;
6d16c2f8
AL
2732} BounceBuffer;
2733
2734static BounceBuffer bounce;
2735
ba223c29 2736typedef struct MapClient {
e95205e1 2737 QEMUBH *bh;
72cf2d4f 2738 QLIST_ENTRY(MapClient) link;
ba223c29
AL
2739} MapClient;
2740
38e047b5 2741QemuMutex map_client_list_lock;
72cf2d4f
BS
2742static QLIST_HEAD(map_client_list, MapClient) map_client_list
2743 = QLIST_HEAD_INITIALIZER(map_client_list);
ba223c29 2744
e95205e1
FZ
2745static void cpu_unregister_map_client_do(MapClient *client)
2746{
2747 QLIST_REMOVE(client, link);
2748 g_free(client);
2749}
2750
33b6c2ed
FZ
2751static void cpu_notify_map_clients_locked(void)
2752{
2753 MapClient *client;
2754
2755 while (!QLIST_EMPTY(&map_client_list)) {
2756 client = QLIST_FIRST(&map_client_list);
e95205e1
FZ
2757 qemu_bh_schedule(client->bh);
2758 cpu_unregister_map_client_do(client);
33b6c2ed
FZ
2759 }
2760}
2761
e95205e1 2762void cpu_register_map_client(QEMUBH *bh)
ba223c29 2763{
7267c094 2764 MapClient *client = g_malloc(sizeof(*client));
ba223c29 2765
38e047b5 2766 qemu_mutex_lock(&map_client_list_lock);
e95205e1 2767 client->bh = bh;
72cf2d4f 2768 QLIST_INSERT_HEAD(&map_client_list, client, link);
33b6c2ed
FZ
2769 if (!atomic_read(&bounce.in_use)) {
2770 cpu_notify_map_clients_locked();
2771 }
38e047b5 2772 qemu_mutex_unlock(&map_client_list_lock);
ba223c29
AL
2773}
2774
38e047b5 2775void cpu_exec_init_all(void)
ba223c29 2776{
38e047b5 2777 qemu_mutex_init(&ram_list.mutex);
38e047b5 2778 io_mem_init();
680a4783 2779 memory_map_init();
38e047b5 2780 qemu_mutex_init(&map_client_list_lock);
ba223c29
AL
2781}
2782
e95205e1 2783void cpu_unregister_map_client(QEMUBH *bh)
ba223c29
AL
2784{
2785 MapClient *client;
2786
e95205e1
FZ
2787 qemu_mutex_lock(&map_client_list_lock);
2788 QLIST_FOREACH(client, &map_client_list, link) {
2789 if (client->bh == bh) {
2790 cpu_unregister_map_client_do(client);
2791 break;
2792 }
ba223c29 2793 }
e95205e1 2794 qemu_mutex_unlock(&map_client_list_lock);
ba223c29
AL
2795}
2796
2797static void cpu_notify_map_clients(void)
2798{
38e047b5 2799 qemu_mutex_lock(&map_client_list_lock);
33b6c2ed 2800 cpu_notify_map_clients_locked();
38e047b5 2801 qemu_mutex_unlock(&map_client_list_lock);
ba223c29
AL
2802}
2803
51644ab7
PB
2804bool address_space_access_valid(AddressSpace *as, hwaddr addr, int len, bool is_write)
2805{
5c8a00ce 2806 MemoryRegion *mr;
51644ab7
PB
2807 hwaddr l, xlat;
2808
41063e1e 2809 rcu_read_lock();
51644ab7
PB
2810 while (len > 0) {
2811 l = len;
5c8a00ce
PB
2812 mr = address_space_translate(as, addr, &xlat, &l, is_write);
2813 if (!memory_access_is_direct(mr, is_write)) {
2814 l = memory_access_size(mr, l, addr);
2815 if (!memory_region_access_valid(mr, xlat, l, is_write)) {
51644ab7
PB
2816 return false;
2817 }
2818 }
2819
2820 len -= l;
2821 addr += l;
2822 }
41063e1e 2823 rcu_read_unlock();
51644ab7
PB
2824 return true;
2825}
2826
6d16c2f8
AL
2827/* Map a physical memory region into a host virtual address.
2828 * May map a subset of the requested range, given by and returned in *plen.
2829 * May return NULL if resources needed to perform the mapping are exhausted.
2830 * Use only for reads OR writes - not for read-modify-write operations.
ba223c29
AL
2831 * Use cpu_register_map_client() to know when retrying the map operation is
2832 * likely to succeed.
6d16c2f8 2833 */
ac1970fb 2834void *address_space_map(AddressSpace *as,
a8170e5e
AK
2835 hwaddr addr,
2836 hwaddr *plen,
ac1970fb 2837 bool is_write)
6d16c2f8 2838{
a8170e5e 2839 hwaddr len = *plen;
e3127ae0
PB
2840 hwaddr done = 0;
2841 hwaddr l, xlat, base;
2842 MemoryRegion *mr, *this_mr;
2843 ram_addr_t raddr;
e81bcda5 2844 void *ptr;
6d16c2f8 2845
e3127ae0
PB
2846 if (len == 0) {
2847 return NULL;
2848 }
38bee5dc 2849
e3127ae0 2850 l = len;
41063e1e 2851 rcu_read_lock();
e3127ae0 2852 mr = address_space_translate(as, addr, &xlat, &l, is_write);
41063e1e 2853
e3127ae0 2854 if (!memory_access_is_direct(mr, is_write)) {
c2cba0ff 2855 if (atomic_xchg(&bounce.in_use, true)) {
41063e1e 2856 rcu_read_unlock();
e3127ae0 2857 return NULL;
6d16c2f8 2858 }
e85d9db5
KW
2859 /* Avoid unbounded allocations */
2860 l = MIN(l, TARGET_PAGE_SIZE);
2861 bounce.buffer = qemu_memalign(TARGET_PAGE_SIZE, l);
e3127ae0
PB
2862 bounce.addr = addr;
2863 bounce.len = l;
d3e71559
PB
2864
2865 memory_region_ref(mr);
2866 bounce.mr = mr;
e3127ae0 2867 if (!is_write) {
5c9eb028
PM
2868 address_space_read(as, addr, MEMTXATTRS_UNSPECIFIED,
2869 bounce.buffer, l);
8ab934f9 2870 }
6d16c2f8 2871
41063e1e 2872 rcu_read_unlock();
e3127ae0
PB
2873 *plen = l;
2874 return bounce.buffer;
2875 }
2876
2877 base = xlat;
2878 raddr = memory_region_get_ram_addr(mr);
2879
2880 for (;;) {
6d16c2f8
AL
2881 len -= l;
2882 addr += l;
e3127ae0
PB
2883 done += l;
2884 if (len == 0) {
2885 break;
2886 }
2887
2888 l = len;
2889 this_mr = address_space_translate(as, addr, &xlat, &l, is_write);
2890 if (this_mr != mr || xlat != base + done) {
2891 break;
2892 }
6d16c2f8 2893 }
e3127ae0 2894
d3e71559 2895 memory_region_ref(mr);
e3127ae0 2896 *plen = done;
e81bcda5
PB
2897 ptr = qemu_ram_ptr_length(raddr + base, plen);
2898 rcu_read_unlock();
2899
2900 return ptr;
6d16c2f8
AL
2901}
2902
ac1970fb 2903/* Unmaps a memory region previously mapped by address_space_map().
6d16c2f8
AL
2904 * Will also mark the memory as dirty if is_write == 1. access_len gives
2905 * the amount of memory that was actually read or written by the caller.
2906 */
a8170e5e
AK
2907void address_space_unmap(AddressSpace *as, void *buffer, hwaddr len,
2908 int is_write, hwaddr access_len)
6d16c2f8
AL
2909{
2910 if (buffer != bounce.buffer) {
d3e71559
PB
2911 MemoryRegion *mr;
2912 ram_addr_t addr1;
2913
2914 mr = qemu_ram_addr_from_host(buffer, &addr1);
2915 assert(mr != NULL);
6d16c2f8 2916 if (is_write) {
845b6214 2917 invalidate_and_set_dirty(mr, addr1, access_len);
6d16c2f8 2918 }
868bb33f 2919 if (xen_enabled()) {
e41d7c69 2920 xen_invalidate_map_cache_entry(buffer);
050a0ddf 2921 }
d3e71559 2922 memory_region_unref(mr);
6d16c2f8
AL
2923 return;
2924 }
2925 if (is_write) {
5c9eb028
PM
2926 address_space_write(as, bounce.addr, MEMTXATTRS_UNSPECIFIED,
2927 bounce.buffer, access_len);
6d16c2f8 2928 }
f8a83245 2929 qemu_vfree(bounce.buffer);
6d16c2f8 2930 bounce.buffer = NULL;
d3e71559 2931 memory_region_unref(bounce.mr);
c2cba0ff 2932 atomic_mb_set(&bounce.in_use, false);
ba223c29 2933 cpu_notify_map_clients();
6d16c2f8 2934}
d0ecd2aa 2935
a8170e5e
AK
2936void *cpu_physical_memory_map(hwaddr addr,
2937 hwaddr *plen,
ac1970fb
AK
2938 int is_write)
2939{
2940 return address_space_map(&address_space_memory, addr, plen, is_write);
2941}
2942
a8170e5e
AK
2943void cpu_physical_memory_unmap(void *buffer, hwaddr len,
2944 int is_write, hwaddr access_len)
ac1970fb
AK
2945{
2946 return address_space_unmap(&address_space_memory, buffer, len, is_write, access_len);
2947}
2948
8df1cd07 2949/* warning: addr must be aligned */
50013115
PM
2950static inline uint32_t address_space_ldl_internal(AddressSpace *as, hwaddr addr,
2951 MemTxAttrs attrs,
2952 MemTxResult *result,
2953 enum device_endian endian)
8df1cd07 2954{
8df1cd07 2955 uint8_t *ptr;
791af8c8 2956 uint64_t val;
5c8a00ce 2957 MemoryRegion *mr;
149f54b5
PB
2958 hwaddr l = 4;
2959 hwaddr addr1;
50013115 2960 MemTxResult r;
4840f10e 2961 bool release_lock = false;
8df1cd07 2962
41063e1e 2963 rcu_read_lock();
fdfba1a2 2964 mr = address_space_translate(as, addr, &addr1, &l, false);
5c8a00ce 2965 if (l < 4 || !memory_access_is_direct(mr, false)) {
4840f10e 2966 release_lock |= prepare_mmio_access(mr);
125b3806 2967
8df1cd07 2968 /* I/O case */
50013115 2969 r = memory_region_dispatch_read(mr, addr1, &val, 4, attrs);
1e78bcc1
AG
2970#if defined(TARGET_WORDS_BIGENDIAN)
2971 if (endian == DEVICE_LITTLE_ENDIAN) {
2972 val = bswap32(val);
2973 }
2974#else
2975 if (endian == DEVICE_BIG_ENDIAN) {
2976 val = bswap32(val);
2977 }
2978#endif
8df1cd07
FB
2979 } else {
2980 /* RAM case */
5c8a00ce 2981 ptr = qemu_get_ram_ptr((memory_region_get_ram_addr(mr)
06ef3525 2982 & TARGET_PAGE_MASK)
149f54b5 2983 + addr1);
1e78bcc1
AG
2984 switch (endian) {
2985 case DEVICE_LITTLE_ENDIAN:
2986 val = ldl_le_p(ptr);
2987 break;
2988 case DEVICE_BIG_ENDIAN:
2989 val = ldl_be_p(ptr);
2990 break;
2991 default:
2992 val = ldl_p(ptr);
2993 break;
2994 }
50013115
PM
2995 r = MEMTX_OK;
2996 }
2997 if (result) {
2998 *result = r;
8df1cd07 2999 }
4840f10e
JK
3000 if (release_lock) {
3001 qemu_mutex_unlock_iothread();
3002 }
41063e1e 3003 rcu_read_unlock();
8df1cd07
FB
3004 return val;
3005}
3006
50013115
PM
3007uint32_t address_space_ldl(AddressSpace *as, hwaddr addr,
3008 MemTxAttrs attrs, MemTxResult *result)
3009{
3010 return address_space_ldl_internal(as, addr, attrs, result,
3011 DEVICE_NATIVE_ENDIAN);
3012}
3013
3014uint32_t address_space_ldl_le(AddressSpace *as, hwaddr addr,
3015 MemTxAttrs attrs, MemTxResult *result)
3016{
3017 return address_space_ldl_internal(as, addr, attrs, result,
3018 DEVICE_LITTLE_ENDIAN);
3019}
3020
3021uint32_t address_space_ldl_be(AddressSpace *as, hwaddr addr,
3022 MemTxAttrs attrs, MemTxResult *result)
3023{
3024 return address_space_ldl_internal(as, addr, attrs, result,
3025 DEVICE_BIG_ENDIAN);
3026}
3027
fdfba1a2 3028uint32_t ldl_phys(AddressSpace *as, hwaddr addr)
1e78bcc1 3029{
50013115 3030 return address_space_ldl(as, addr, MEMTXATTRS_UNSPECIFIED, NULL);
1e78bcc1
AG
3031}
3032
fdfba1a2 3033uint32_t ldl_le_phys(AddressSpace *as, hwaddr addr)
1e78bcc1 3034{
50013115 3035 return address_space_ldl_le(as, addr, MEMTXATTRS_UNSPECIFIED, NULL);
1e78bcc1
AG
3036}
3037
fdfba1a2 3038uint32_t ldl_be_phys(AddressSpace *as, hwaddr addr)
1e78bcc1 3039{
50013115 3040 return address_space_ldl_be(as, addr, MEMTXATTRS_UNSPECIFIED, NULL);
1e78bcc1
AG
3041}
3042
84b7b8e7 3043/* warning: addr must be aligned */
50013115
PM
3044static inline uint64_t address_space_ldq_internal(AddressSpace *as, hwaddr addr,
3045 MemTxAttrs attrs,
3046 MemTxResult *result,
3047 enum device_endian endian)
84b7b8e7 3048{
84b7b8e7
FB
3049 uint8_t *ptr;
3050 uint64_t val;
5c8a00ce 3051 MemoryRegion *mr;
149f54b5
PB
3052 hwaddr l = 8;
3053 hwaddr addr1;
50013115 3054 MemTxResult r;
4840f10e 3055 bool release_lock = false;
84b7b8e7 3056
41063e1e 3057 rcu_read_lock();
2c17449b 3058 mr = address_space_translate(as, addr, &addr1, &l,
5c8a00ce
PB
3059 false);
3060 if (l < 8 || !memory_access_is_direct(mr, false)) {
4840f10e 3061 release_lock |= prepare_mmio_access(mr);
125b3806 3062
84b7b8e7 3063 /* I/O case */
50013115 3064 r = memory_region_dispatch_read(mr, addr1, &val, 8, attrs);
968a5627
PB
3065#if defined(TARGET_WORDS_BIGENDIAN)
3066 if (endian == DEVICE_LITTLE_ENDIAN) {
3067 val = bswap64(val);
3068 }
3069#else
3070 if (endian == DEVICE_BIG_ENDIAN) {
3071 val = bswap64(val);
3072 }
84b7b8e7
FB
3073#endif
3074 } else {
3075 /* RAM case */
5c8a00ce 3076 ptr = qemu_get_ram_ptr((memory_region_get_ram_addr(mr)
06ef3525 3077 & TARGET_PAGE_MASK)
149f54b5 3078 + addr1);
1e78bcc1
AG
3079 switch (endian) {
3080 case DEVICE_LITTLE_ENDIAN:
3081 val = ldq_le_p(ptr);
3082 break;
3083 case DEVICE_BIG_ENDIAN:
3084 val = ldq_be_p(ptr);
3085 break;
3086 default:
3087 val = ldq_p(ptr);
3088 break;
3089 }
50013115
PM
3090 r = MEMTX_OK;
3091 }
3092 if (result) {
3093 *result = r;
84b7b8e7 3094 }
4840f10e
JK
3095 if (release_lock) {
3096 qemu_mutex_unlock_iothread();
3097 }
41063e1e 3098 rcu_read_unlock();
84b7b8e7
FB
3099 return val;
3100}
3101
50013115
PM
3102uint64_t address_space_ldq(AddressSpace *as, hwaddr addr,
3103 MemTxAttrs attrs, MemTxResult *result)
3104{
3105 return address_space_ldq_internal(as, addr, attrs, result,
3106 DEVICE_NATIVE_ENDIAN);
3107}
3108
3109uint64_t address_space_ldq_le(AddressSpace *as, hwaddr addr,
3110 MemTxAttrs attrs, MemTxResult *result)
3111{
3112 return address_space_ldq_internal(as, addr, attrs, result,
3113 DEVICE_LITTLE_ENDIAN);
3114}
3115
3116uint64_t address_space_ldq_be(AddressSpace *as, hwaddr addr,
3117 MemTxAttrs attrs, MemTxResult *result)
3118{
3119 return address_space_ldq_internal(as, addr, attrs, result,
3120 DEVICE_BIG_ENDIAN);
3121}
3122
2c17449b 3123uint64_t ldq_phys(AddressSpace *as, hwaddr addr)
1e78bcc1 3124{
50013115 3125 return address_space_ldq(as, addr, MEMTXATTRS_UNSPECIFIED, NULL);
1e78bcc1
AG
3126}
3127
2c17449b 3128uint64_t ldq_le_phys(AddressSpace *as, hwaddr addr)
1e78bcc1 3129{
50013115 3130 return address_space_ldq_le(as, addr, MEMTXATTRS_UNSPECIFIED, NULL);
1e78bcc1
AG
3131}
3132
2c17449b 3133uint64_t ldq_be_phys(AddressSpace *as, hwaddr addr)
1e78bcc1 3134{
50013115 3135 return address_space_ldq_be(as, addr, MEMTXATTRS_UNSPECIFIED, NULL);
1e78bcc1
AG
3136}
3137
aab33094 3138/* XXX: optimize */
50013115
PM
3139uint32_t address_space_ldub(AddressSpace *as, hwaddr addr,
3140 MemTxAttrs attrs, MemTxResult *result)
aab33094
FB
3141{
3142 uint8_t val;
50013115
PM
3143 MemTxResult r;
3144
3145 r = address_space_rw(as, addr, attrs, &val, 1, 0);
3146 if (result) {
3147 *result = r;
3148 }
aab33094
FB
3149 return val;
3150}
3151
50013115
PM
3152uint32_t ldub_phys(AddressSpace *as, hwaddr addr)
3153{
3154 return address_space_ldub(as, addr, MEMTXATTRS_UNSPECIFIED, NULL);
3155}
3156
733f0b02 3157/* warning: addr must be aligned */
50013115
PM
3158static inline uint32_t address_space_lduw_internal(AddressSpace *as,
3159 hwaddr addr,
3160 MemTxAttrs attrs,
3161 MemTxResult *result,
3162 enum device_endian endian)
aab33094 3163{
733f0b02
MT
3164 uint8_t *ptr;
3165 uint64_t val;
5c8a00ce 3166 MemoryRegion *mr;
149f54b5
PB
3167 hwaddr l = 2;
3168 hwaddr addr1;
50013115 3169 MemTxResult r;
4840f10e 3170 bool release_lock = false;
733f0b02 3171
41063e1e 3172 rcu_read_lock();
41701aa4 3173 mr = address_space_translate(as, addr, &addr1, &l,
5c8a00ce
PB
3174 false);
3175 if (l < 2 || !memory_access_is_direct(mr, false)) {
4840f10e 3176 release_lock |= prepare_mmio_access(mr);
125b3806 3177
733f0b02 3178 /* I/O case */
50013115 3179 r = memory_region_dispatch_read(mr, addr1, &val, 2, attrs);
1e78bcc1
AG
3180#if defined(TARGET_WORDS_BIGENDIAN)
3181 if (endian == DEVICE_LITTLE_ENDIAN) {
3182 val = bswap16(val);
3183 }
3184#else
3185 if (endian == DEVICE_BIG_ENDIAN) {
3186 val = bswap16(val);
3187 }
3188#endif
733f0b02
MT
3189 } else {
3190 /* RAM case */
5c8a00ce 3191 ptr = qemu_get_ram_ptr((memory_region_get_ram_addr(mr)
06ef3525 3192 & TARGET_PAGE_MASK)
149f54b5 3193 + addr1);
1e78bcc1
AG
3194 switch (endian) {
3195 case DEVICE_LITTLE_ENDIAN:
3196 val = lduw_le_p(ptr);
3197 break;
3198 case DEVICE_BIG_ENDIAN:
3199 val = lduw_be_p(ptr);
3200 break;
3201 default:
3202 val = lduw_p(ptr);
3203 break;
3204 }
50013115
PM
3205 r = MEMTX_OK;
3206 }
3207 if (result) {
3208 *result = r;
733f0b02 3209 }
4840f10e
JK
3210 if (release_lock) {
3211 qemu_mutex_unlock_iothread();
3212 }
41063e1e 3213 rcu_read_unlock();
733f0b02 3214 return val;
aab33094
FB
3215}
3216
50013115
PM
3217uint32_t address_space_lduw(AddressSpace *as, hwaddr addr,
3218 MemTxAttrs attrs, MemTxResult *result)
3219{
3220 return address_space_lduw_internal(as, addr, attrs, result,
3221 DEVICE_NATIVE_ENDIAN);
3222}
3223
3224uint32_t address_space_lduw_le(AddressSpace *as, hwaddr addr,
3225 MemTxAttrs attrs, MemTxResult *result)
3226{
3227 return address_space_lduw_internal(as, addr, attrs, result,
3228 DEVICE_LITTLE_ENDIAN);
3229}
3230
3231uint32_t address_space_lduw_be(AddressSpace *as, hwaddr addr,
3232 MemTxAttrs attrs, MemTxResult *result)
3233{
3234 return address_space_lduw_internal(as, addr, attrs, result,
3235 DEVICE_BIG_ENDIAN);
3236}
3237
41701aa4 3238uint32_t lduw_phys(AddressSpace *as, hwaddr addr)
1e78bcc1 3239{
50013115 3240 return address_space_lduw(as, addr, MEMTXATTRS_UNSPECIFIED, NULL);
1e78bcc1
AG
3241}
3242
41701aa4 3243uint32_t lduw_le_phys(AddressSpace *as, hwaddr addr)
1e78bcc1 3244{
50013115 3245 return address_space_lduw_le(as, addr, MEMTXATTRS_UNSPECIFIED, NULL);
1e78bcc1
AG
3246}
3247
41701aa4 3248uint32_t lduw_be_phys(AddressSpace *as, hwaddr addr)
1e78bcc1 3249{
50013115 3250 return address_space_lduw_be(as, addr, MEMTXATTRS_UNSPECIFIED, NULL);
1e78bcc1
AG
3251}
3252
8df1cd07
FB
3253/* warning: addr must be aligned. The ram page is not masked as dirty
3254 and the code inside is not invalidated. It is useful if the dirty
3255 bits are used to track modified PTEs */
50013115
PM
3256void address_space_stl_notdirty(AddressSpace *as, hwaddr addr, uint32_t val,
3257 MemTxAttrs attrs, MemTxResult *result)
8df1cd07 3258{
8df1cd07 3259 uint8_t *ptr;
5c8a00ce 3260 MemoryRegion *mr;
149f54b5
PB
3261 hwaddr l = 4;
3262 hwaddr addr1;
50013115 3263 MemTxResult r;
845b6214 3264 uint8_t dirty_log_mask;
4840f10e 3265 bool release_lock = false;
8df1cd07 3266
41063e1e 3267 rcu_read_lock();
2198a121 3268 mr = address_space_translate(as, addr, &addr1, &l,
5c8a00ce
PB
3269 true);
3270 if (l < 4 || !memory_access_is_direct(mr, true)) {
4840f10e 3271 release_lock |= prepare_mmio_access(mr);
125b3806 3272
50013115 3273 r = memory_region_dispatch_write(mr, addr1, val, 4, attrs);
8df1cd07 3274 } else {
5c8a00ce 3275 addr1 += memory_region_get_ram_addr(mr) & TARGET_PAGE_MASK;
5579c7f3 3276 ptr = qemu_get_ram_ptr(addr1);
8df1cd07 3277 stl_p(ptr, val);
74576198 3278
845b6214
PB
3279 dirty_log_mask = memory_region_get_dirty_log_mask(mr);
3280 dirty_log_mask &= ~(1 << DIRTY_MEMORY_CODE);
58d2707e 3281 cpu_physical_memory_set_dirty_range(addr1, 4, dirty_log_mask);
50013115
PM
3282 r = MEMTX_OK;
3283 }
3284 if (result) {
3285 *result = r;
8df1cd07 3286 }
4840f10e
JK
3287 if (release_lock) {
3288 qemu_mutex_unlock_iothread();
3289 }
41063e1e 3290 rcu_read_unlock();
8df1cd07
FB
3291}
3292
50013115
PM
3293void stl_phys_notdirty(AddressSpace *as, hwaddr addr, uint32_t val)
3294{
3295 address_space_stl_notdirty(as, addr, val, MEMTXATTRS_UNSPECIFIED, NULL);
3296}
3297
8df1cd07 3298/* warning: addr must be aligned */
50013115
PM
3299static inline void address_space_stl_internal(AddressSpace *as,
3300 hwaddr addr, uint32_t val,
3301 MemTxAttrs attrs,
3302 MemTxResult *result,
3303 enum device_endian endian)
8df1cd07 3304{
8df1cd07 3305 uint8_t *ptr;
5c8a00ce 3306 MemoryRegion *mr;
149f54b5
PB
3307 hwaddr l = 4;
3308 hwaddr addr1;
50013115 3309 MemTxResult r;
4840f10e 3310 bool release_lock = false;
8df1cd07 3311
41063e1e 3312 rcu_read_lock();
ab1da857 3313 mr = address_space_translate(as, addr, &addr1, &l,
5c8a00ce
PB
3314 true);
3315 if (l < 4 || !memory_access_is_direct(mr, true)) {
4840f10e 3316 release_lock |= prepare_mmio_access(mr);
125b3806 3317
1e78bcc1
AG
3318#if defined(TARGET_WORDS_BIGENDIAN)
3319 if (endian == DEVICE_LITTLE_ENDIAN) {
3320 val = bswap32(val);
3321 }
3322#else
3323 if (endian == DEVICE_BIG_ENDIAN) {
3324 val = bswap32(val);
3325 }
3326#endif
50013115 3327 r = memory_region_dispatch_write(mr, addr1, val, 4, attrs);
8df1cd07 3328 } else {
8df1cd07 3329 /* RAM case */
5c8a00ce 3330 addr1 += memory_region_get_ram_addr(mr) & TARGET_PAGE_MASK;
5579c7f3 3331 ptr = qemu_get_ram_ptr(addr1);
1e78bcc1
AG
3332 switch (endian) {
3333 case DEVICE_LITTLE_ENDIAN:
3334 stl_le_p(ptr, val);
3335 break;
3336 case DEVICE_BIG_ENDIAN:
3337 stl_be_p(ptr, val);
3338 break;
3339 default:
3340 stl_p(ptr, val);
3341 break;
3342 }
845b6214 3343 invalidate_and_set_dirty(mr, addr1, 4);
50013115
PM
3344 r = MEMTX_OK;
3345 }
3346 if (result) {
3347 *result = r;
8df1cd07 3348 }
4840f10e
JK
3349 if (release_lock) {
3350 qemu_mutex_unlock_iothread();
3351 }
41063e1e 3352 rcu_read_unlock();
8df1cd07
FB
3353}
3354
50013115
PM
3355void address_space_stl(AddressSpace *as, hwaddr addr, uint32_t val,
3356 MemTxAttrs attrs, MemTxResult *result)
3357{
3358 address_space_stl_internal(as, addr, val, attrs, result,
3359 DEVICE_NATIVE_ENDIAN);
3360}
3361
3362void address_space_stl_le(AddressSpace *as, hwaddr addr, uint32_t val,
3363 MemTxAttrs attrs, MemTxResult *result)
3364{
3365 address_space_stl_internal(as, addr, val, attrs, result,
3366 DEVICE_LITTLE_ENDIAN);
3367}
3368
3369void address_space_stl_be(AddressSpace *as, hwaddr addr, uint32_t val,
3370 MemTxAttrs attrs, MemTxResult *result)
3371{
3372 address_space_stl_internal(as, addr, val, attrs, result,
3373 DEVICE_BIG_ENDIAN);
3374}
3375
ab1da857 3376void stl_phys(AddressSpace *as, hwaddr addr, uint32_t val)
1e78bcc1 3377{
50013115 3378 address_space_stl(as, addr, val, MEMTXATTRS_UNSPECIFIED, NULL);
1e78bcc1
AG
3379}
3380
ab1da857 3381void stl_le_phys(AddressSpace *as, hwaddr addr, uint32_t val)
1e78bcc1 3382{
50013115 3383 address_space_stl_le(as, addr, val, MEMTXATTRS_UNSPECIFIED, NULL);
1e78bcc1
AG
3384}
3385
ab1da857 3386void stl_be_phys(AddressSpace *as, hwaddr addr, uint32_t val)
1e78bcc1 3387{
50013115 3388 address_space_stl_be(as, addr, val, MEMTXATTRS_UNSPECIFIED, NULL);
1e78bcc1
AG
3389}
3390
aab33094 3391/* XXX: optimize */
50013115
PM
3392void address_space_stb(AddressSpace *as, hwaddr addr, uint32_t val,
3393 MemTxAttrs attrs, MemTxResult *result)
aab33094
FB
3394{
3395 uint8_t v = val;
50013115
PM
3396 MemTxResult r;
3397
3398 r = address_space_rw(as, addr, attrs, &v, 1, 1);
3399 if (result) {
3400 *result = r;
3401 }
3402}
3403
3404void stb_phys(AddressSpace *as, hwaddr addr, uint32_t val)
3405{
3406 address_space_stb(as, addr, val, MEMTXATTRS_UNSPECIFIED, NULL);
aab33094
FB
3407}
3408
733f0b02 3409/* warning: addr must be aligned */
50013115
PM
3410static inline void address_space_stw_internal(AddressSpace *as,
3411 hwaddr addr, uint32_t val,
3412 MemTxAttrs attrs,
3413 MemTxResult *result,
3414 enum device_endian endian)
aab33094 3415{
733f0b02 3416 uint8_t *ptr;
5c8a00ce 3417 MemoryRegion *mr;
149f54b5
PB
3418 hwaddr l = 2;
3419 hwaddr addr1;
50013115 3420 MemTxResult r;
4840f10e 3421 bool release_lock = false;
733f0b02 3422
41063e1e 3423 rcu_read_lock();
5ce5944d 3424 mr = address_space_translate(as, addr, &addr1, &l, true);
5c8a00ce 3425 if (l < 2 || !memory_access_is_direct(mr, true)) {
4840f10e 3426 release_lock |= prepare_mmio_access(mr);
125b3806 3427
1e78bcc1
AG
3428#if defined(TARGET_WORDS_BIGENDIAN)
3429 if (endian == DEVICE_LITTLE_ENDIAN) {
3430 val = bswap16(val);
3431 }
3432#else
3433 if (endian == DEVICE_BIG_ENDIAN) {
3434 val = bswap16(val);
3435 }
3436#endif
50013115 3437 r = memory_region_dispatch_write(mr, addr1, val, 2, attrs);
733f0b02 3438 } else {
733f0b02 3439 /* RAM case */
5c8a00ce 3440 addr1 += memory_region_get_ram_addr(mr) & TARGET_PAGE_MASK;
733f0b02 3441 ptr = qemu_get_ram_ptr(addr1);
1e78bcc1
AG
3442 switch (endian) {
3443 case DEVICE_LITTLE_ENDIAN:
3444 stw_le_p(ptr, val);
3445 break;
3446 case DEVICE_BIG_ENDIAN:
3447 stw_be_p(ptr, val);
3448 break;
3449 default:
3450 stw_p(ptr, val);
3451 break;
3452 }
845b6214 3453 invalidate_and_set_dirty(mr, addr1, 2);
50013115
PM
3454 r = MEMTX_OK;
3455 }
3456 if (result) {
3457 *result = r;
733f0b02 3458 }
4840f10e
JK
3459 if (release_lock) {
3460 qemu_mutex_unlock_iothread();
3461 }
41063e1e 3462 rcu_read_unlock();
aab33094
FB
3463}
3464
50013115
PM
3465void address_space_stw(AddressSpace *as, hwaddr addr, uint32_t val,
3466 MemTxAttrs attrs, MemTxResult *result)
3467{
3468 address_space_stw_internal(as, addr, val, attrs, result,
3469 DEVICE_NATIVE_ENDIAN);
3470}
3471
3472void address_space_stw_le(AddressSpace *as, hwaddr addr, uint32_t val,
3473 MemTxAttrs attrs, MemTxResult *result)
3474{
3475 address_space_stw_internal(as, addr, val, attrs, result,
3476 DEVICE_LITTLE_ENDIAN);
3477}
3478
3479void address_space_stw_be(AddressSpace *as, hwaddr addr, uint32_t val,
3480 MemTxAttrs attrs, MemTxResult *result)
3481{
3482 address_space_stw_internal(as, addr, val, attrs, result,
3483 DEVICE_BIG_ENDIAN);
3484}
3485
5ce5944d 3486void stw_phys(AddressSpace *as, hwaddr addr, uint32_t val)
1e78bcc1 3487{
50013115 3488 address_space_stw(as, addr, val, MEMTXATTRS_UNSPECIFIED, NULL);
1e78bcc1
AG
3489}
3490
5ce5944d 3491void stw_le_phys(AddressSpace *as, hwaddr addr, uint32_t val)
1e78bcc1 3492{
50013115 3493 address_space_stw_le(as, addr, val, MEMTXATTRS_UNSPECIFIED, NULL);
1e78bcc1
AG
3494}
3495
5ce5944d 3496void stw_be_phys(AddressSpace *as, hwaddr addr, uint32_t val)
1e78bcc1 3497{
50013115 3498 address_space_stw_be(as, addr, val, MEMTXATTRS_UNSPECIFIED, NULL);
1e78bcc1
AG
3499}
3500
aab33094 3501/* XXX: optimize */
50013115
PM
3502void address_space_stq(AddressSpace *as, hwaddr addr, uint64_t val,
3503 MemTxAttrs attrs, MemTxResult *result)
aab33094 3504{
50013115 3505 MemTxResult r;
aab33094 3506 val = tswap64(val);
50013115
PM
3507 r = address_space_rw(as, addr, attrs, (void *) &val, 8, 1);
3508 if (result) {
3509 *result = r;
3510 }
aab33094
FB
3511}
3512
50013115
PM
3513void address_space_stq_le(AddressSpace *as, hwaddr addr, uint64_t val,
3514 MemTxAttrs attrs, MemTxResult *result)
1e78bcc1 3515{
50013115 3516 MemTxResult r;
1e78bcc1 3517 val = cpu_to_le64(val);
50013115
PM
3518 r = address_space_rw(as, addr, attrs, (void *) &val, 8, 1);
3519 if (result) {
3520 *result = r;
3521 }
3522}
3523void address_space_stq_be(AddressSpace *as, hwaddr addr, uint64_t val,
3524 MemTxAttrs attrs, MemTxResult *result)
3525{
3526 MemTxResult r;
3527 val = cpu_to_be64(val);
3528 r = address_space_rw(as, addr, attrs, (void *) &val, 8, 1);
3529 if (result) {
3530 *result = r;
3531 }
3532}
3533
3534void stq_phys(AddressSpace *as, hwaddr addr, uint64_t val)
3535{
3536 address_space_stq(as, addr, val, MEMTXATTRS_UNSPECIFIED, NULL);
3537}
3538
3539void stq_le_phys(AddressSpace *as, hwaddr addr, uint64_t val)
3540{
3541 address_space_stq_le(as, addr, val, MEMTXATTRS_UNSPECIFIED, NULL);
1e78bcc1
AG
3542}
3543
f606604f 3544void stq_be_phys(AddressSpace *as, hwaddr addr, uint64_t val)
1e78bcc1 3545{
50013115 3546 address_space_stq_be(as, addr, val, MEMTXATTRS_UNSPECIFIED, NULL);
1e78bcc1
AG
3547}
3548
5e2972fd 3549/* virtual memory access for debug (includes writing to ROM) */
f17ec444 3550int cpu_memory_rw_debug(CPUState *cpu, target_ulong addr,
b448f2f3 3551 uint8_t *buf, int len, int is_write)
13eb76e0
FB
3552{
3553 int l;
a8170e5e 3554 hwaddr phys_addr;
9b3c35e0 3555 target_ulong page;
13eb76e0
FB
3556
3557 while (len > 0) {
3558 page = addr & TARGET_PAGE_MASK;
f17ec444 3559 phys_addr = cpu_get_phys_page_debug(cpu, page);
13eb76e0
FB
3560 /* if no physical page mapped, return an error */
3561 if (phys_addr == -1)
3562 return -1;
3563 l = (page + TARGET_PAGE_SIZE) - addr;
3564 if (l > len)
3565 l = len;
5e2972fd 3566 phys_addr += (addr & ~TARGET_PAGE_MASK);
2e38847b
EI
3567 if (is_write) {
3568 cpu_physical_memory_write_rom(cpu->as, phys_addr, buf, l);
3569 } else {
5c9eb028
PM
3570 address_space_rw(cpu->as, phys_addr, MEMTXATTRS_UNSPECIFIED,
3571 buf, l, 0);
2e38847b 3572 }
13eb76e0
FB
3573 len -= l;
3574 buf += l;
3575 addr += l;
3576 }
3577 return 0;
3578}
038629a6
DDAG
3579
3580/*
3581 * Allows code that needs to deal with migration bitmaps etc to still be built
3582 * target independent.
3583 */
3584size_t qemu_target_page_bits(void)
3585{
3586 return TARGET_PAGE_BITS;
3587}
3588
a68fe89c 3589#endif
13eb76e0 3590
8e4a424b
BS
3591/*
3592 * A helper function for the _utterly broken_ virtio device model to find out if
3593 * it's running on a big endian machine. Don't do this at home kids!
3594 */
98ed8ecf
GK
3595bool target_words_bigendian(void);
3596bool target_words_bigendian(void)
8e4a424b
BS
3597{
3598#if defined(TARGET_WORDS_BIGENDIAN)
3599 return true;
3600#else
3601 return false;
3602#endif
3603}
3604
76f35538 3605#ifndef CONFIG_USER_ONLY
a8170e5e 3606bool cpu_physical_memory_is_io(hwaddr phys_addr)
76f35538 3607{
5c8a00ce 3608 MemoryRegion*mr;
149f54b5 3609 hwaddr l = 1;
41063e1e 3610 bool res;
76f35538 3611
41063e1e 3612 rcu_read_lock();
5c8a00ce
PB
3613 mr = address_space_translate(&address_space_memory,
3614 phys_addr, &phys_addr, &l, false);
76f35538 3615
41063e1e
PB
3616 res = !(memory_region_is_ram(mr) || memory_region_is_romd(mr));
3617 rcu_read_unlock();
3618 return res;
76f35538 3619}
bd2fa51f 3620
e3807054 3621int qemu_ram_foreach_block(RAMBlockIterFunc func, void *opaque)
bd2fa51f
MH
3622{
3623 RAMBlock *block;
e3807054 3624 int ret = 0;
bd2fa51f 3625
0dc3f44a
MD
3626 rcu_read_lock();
3627 QLIST_FOREACH_RCU(block, &ram_list.blocks, next) {
e3807054
DDAG
3628 ret = func(block->idstr, block->host, block->offset,
3629 block->used_length, opaque);
3630 if (ret) {
3631 break;
3632 }
bd2fa51f 3633 }
0dc3f44a 3634 rcu_read_unlock();
e3807054 3635 return ret;
bd2fa51f 3636}
ec3f8c99 3637#endif