]> git.proxmox.com Git - mirror_qemu.git/blame - exec.c
hostmem: add merge and dump properties
[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"
cc9e98cb 29#include "hw/qdev.h"
1de7afc9 30#include "qemu/osdep.h"
9c17d615 31#include "sysemu/kvm.h"
2ff3de68 32#include "sysemu/sysemu.h"
0d09e41a 33#include "hw/xen/xen.h"
1de7afc9
PB
34#include "qemu/timer.h"
35#include "qemu/config-file.h"
75a34036 36#include "qemu/error-report.h"
022c62cb 37#include "exec/memory.h"
9c17d615 38#include "sysemu/dma.h"
022c62cb 39#include "exec/address-spaces.h"
53a5960a
PB
40#if defined(CONFIG_USER_ONLY)
41#include <qemu.h>
432d268c 42#else /* !CONFIG_USER_ONLY */
9c17d615 43#include "sysemu/xen-mapcache.h"
6506e4f9 44#include "trace.h"
53a5960a 45#endif
0d6d3c87 46#include "exec/cpu-all.h"
54936004 47
022c62cb 48#include "exec/cputlb.h"
5b6dd868 49#include "translate-all.h"
0cac1b66 50
022c62cb 51#include "exec/memory-internal.h"
220c3ebd 52#include "exec/ram_addr.h"
582b55a9 53#include "qemu/cache-utils.h"
67d95c15 54
b35ba30f
MT
55#include "qemu/range.h"
56
db7b5426 57//#define DEBUG_SUBPAGE
1196be37 58
e2eef170 59#if !defined(CONFIG_USER_ONLY)
981fdf23 60static bool in_migration;
94a6b54f 61
a3161038 62RAMList ram_list = { .blocks = QTAILQ_HEAD_INITIALIZER(ram_list.blocks) };
62152b8a
AK
63
64static MemoryRegion *system_memory;
309cb471 65static MemoryRegion *system_io;
62152b8a 66
f6790af6
AK
67AddressSpace address_space_io;
68AddressSpace address_space_memory;
2673a5da 69
0844e007 70MemoryRegion io_mem_rom, io_mem_notdirty;
acc9d80b 71static MemoryRegion io_mem_unassigned;
0e0df1e2 72
7bd4f430
PB
73/* RAM is pre-allocated and passed into qemu_ram_alloc_from_ptr */
74#define RAM_PREALLOC (1 << 0)
75
e2eef170 76#endif
9fa3e853 77
bdc44640 78struct CPUTailQ cpus = QTAILQ_HEAD_INITIALIZER(cpus);
6a00d601
FB
79/* current CPU in the current thread. It is only valid inside
80 cpu_exec() */
4917cf44 81DEFINE_TLS(CPUState *, current_cpu);
2e70f6ef 82/* 0 = Do not count executed instructions.
bf20dc07 83 1 = Precise instruction counting.
2e70f6ef 84 2 = Adaptive rate instruction counting. */
5708fc66 85int use_icount;
6a00d601 86
e2eef170 87#if !defined(CONFIG_USER_ONLY)
4346ae3e 88
1db8abb1
PB
89typedef struct PhysPageEntry PhysPageEntry;
90
91struct PhysPageEntry {
9736e55b 92 /* How many bits skip to next level (in units of L2_SIZE). 0 for a leaf. */
8b795765 93 uint32_t skip : 6;
9736e55b 94 /* index into phys_sections (!skip) or phys_map_nodes (skip) */
8b795765 95 uint32_t ptr : 26;
1db8abb1
PB
96};
97
8b795765
MT
98#define PHYS_MAP_NODE_NIL (((uint32_t)~0) >> 6)
99
03f49957 100/* Size of the L2 (and L3, etc) page tables. */
57271d63 101#define ADDR_SPACE_BITS 64
03f49957 102
026736ce 103#define P_L2_BITS 9
03f49957
PB
104#define P_L2_SIZE (1 << P_L2_BITS)
105
106#define P_L2_LEVELS (((ADDR_SPACE_BITS - TARGET_PAGE_BITS - 1) / P_L2_BITS) + 1)
107
108typedef PhysPageEntry Node[P_L2_SIZE];
0475d94f 109
53cb28cb
MA
110typedef struct PhysPageMap {
111 unsigned sections_nb;
112 unsigned sections_nb_alloc;
113 unsigned nodes_nb;
114 unsigned nodes_nb_alloc;
115 Node *nodes;
116 MemoryRegionSection *sections;
117} PhysPageMap;
118
1db8abb1
PB
119struct AddressSpaceDispatch {
120 /* This is a multi-level map on the physical address space.
121 * The bottom level has pointers to MemoryRegionSections.
122 */
123 PhysPageEntry phys_map;
53cb28cb 124 PhysPageMap map;
acc9d80b 125 AddressSpace *as;
1db8abb1
PB
126};
127
90260c6c
JK
128#define SUBPAGE_IDX(addr) ((addr) & ~TARGET_PAGE_MASK)
129typedef struct subpage_t {
130 MemoryRegion iomem;
acc9d80b 131 AddressSpace *as;
90260c6c
JK
132 hwaddr base;
133 uint16_t sub_section[TARGET_PAGE_SIZE];
134} subpage_t;
135
b41aac4f
LPF
136#define PHYS_SECTION_UNASSIGNED 0
137#define PHYS_SECTION_NOTDIRTY 1
138#define PHYS_SECTION_ROM 2
139#define PHYS_SECTION_WATCH 3
5312bd8b 140
e2eef170 141static void io_mem_init(void);
62152b8a 142static void memory_map_init(void);
09daed84 143static void tcg_commit(MemoryListener *listener);
e2eef170 144
1ec9b909 145static MemoryRegion io_mem_watch;
6658ffb8 146#endif
fd6ce8f6 147
6d9a1304 148#if !defined(CONFIG_USER_ONLY)
d6f2ea22 149
53cb28cb 150static void phys_map_node_reserve(PhysPageMap *map, unsigned nodes)
d6f2ea22 151{
53cb28cb
MA
152 if (map->nodes_nb + nodes > map->nodes_nb_alloc) {
153 map->nodes_nb_alloc = MAX(map->nodes_nb_alloc * 2, 16);
154 map->nodes_nb_alloc = MAX(map->nodes_nb_alloc, map->nodes_nb + nodes);
155 map->nodes = g_renew(Node, map->nodes, map->nodes_nb_alloc);
d6f2ea22 156 }
f7bf5461
AK
157}
158
53cb28cb 159static uint32_t phys_map_node_alloc(PhysPageMap *map)
f7bf5461
AK
160{
161 unsigned i;
8b795765 162 uint32_t ret;
f7bf5461 163
53cb28cb 164 ret = map->nodes_nb++;
f7bf5461 165 assert(ret != PHYS_MAP_NODE_NIL);
53cb28cb 166 assert(ret != map->nodes_nb_alloc);
03f49957 167 for (i = 0; i < P_L2_SIZE; ++i) {
53cb28cb
MA
168 map->nodes[ret][i].skip = 1;
169 map->nodes[ret][i].ptr = PHYS_MAP_NODE_NIL;
d6f2ea22 170 }
f7bf5461 171 return ret;
d6f2ea22
AK
172}
173
53cb28cb
MA
174static void phys_page_set_level(PhysPageMap *map, PhysPageEntry *lp,
175 hwaddr *index, hwaddr *nb, uint16_t leaf,
2999097b 176 int level)
f7bf5461
AK
177{
178 PhysPageEntry *p;
179 int i;
03f49957 180 hwaddr step = (hwaddr)1 << (level * P_L2_BITS);
108c49b8 181
9736e55b 182 if (lp->skip && lp->ptr == PHYS_MAP_NODE_NIL) {
53cb28cb
MA
183 lp->ptr = phys_map_node_alloc(map);
184 p = map->nodes[lp->ptr];
f7bf5461 185 if (level == 0) {
03f49957 186 for (i = 0; i < P_L2_SIZE; i++) {
9736e55b 187 p[i].skip = 0;
b41aac4f 188 p[i].ptr = PHYS_SECTION_UNASSIGNED;
4346ae3e 189 }
67c4d23c 190 }
f7bf5461 191 } else {
53cb28cb 192 p = map->nodes[lp->ptr];
92e873b9 193 }
03f49957 194 lp = &p[(*index >> (level * P_L2_BITS)) & (P_L2_SIZE - 1)];
f7bf5461 195
03f49957 196 while (*nb && lp < &p[P_L2_SIZE]) {
07f07b31 197 if ((*index & (step - 1)) == 0 && *nb >= step) {
9736e55b 198 lp->skip = 0;
c19e8800 199 lp->ptr = leaf;
07f07b31
AK
200 *index += step;
201 *nb -= step;
2999097b 202 } else {
53cb28cb 203 phys_page_set_level(map, lp, index, nb, leaf, level - 1);
2999097b
AK
204 }
205 ++lp;
f7bf5461
AK
206 }
207}
208
ac1970fb 209static void phys_page_set(AddressSpaceDispatch *d,
a8170e5e 210 hwaddr index, hwaddr nb,
2999097b 211 uint16_t leaf)
f7bf5461 212{
2999097b 213 /* Wildly overreserve - it doesn't matter much. */
53cb28cb 214 phys_map_node_reserve(&d->map, 3 * P_L2_LEVELS);
5cd2c5b6 215
53cb28cb 216 phys_page_set_level(&d->map, &d->phys_map, &index, &nb, leaf, P_L2_LEVELS - 1);
92e873b9
FB
217}
218
b35ba30f
MT
219/* Compact a non leaf page entry. Simply detect that the entry has a single child,
220 * and update our entry so we can skip it and go directly to the destination.
221 */
222static void phys_page_compact(PhysPageEntry *lp, Node *nodes, unsigned long *compacted)
223{
224 unsigned valid_ptr = P_L2_SIZE;
225 int valid = 0;
226 PhysPageEntry *p;
227 int i;
228
229 if (lp->ptr == PHYS_MAP_NODE_NIL) {
230 return;
231 }
232
233 p = nodes[lp->ptr];
234 for (i = 0; i < P_L2_SIZE; i++) {
235 if (p[i].ptr == PHYS_MAP_NODE_NIL) {
236 continue;
237 }
238
239 valid_ptr = i;
240 valid++;
241 if (p[i].skip) {
242 phys_page_compact(&p[i], nodes, compacted);
243 }
244 }
245
246 /* We can only compress if there's only one child. */
247 if (valid != 1) {
248 return;
249 }
250
251 assert(valid_ptr < P_L2_SIZE);
252
253 /* Don't compress if it won't fit in the # of bits we have. */
254 if (lp->skip + p[valid_ptr].skip >= (1 << 3)) {
255 return;
256 }
257
258 lp->ptr = p[valid_ptr].ptr;
259 if (!p[valid_ptr].skip) {
260 /* If our only child is a leaf, make this a leaf. */
261 /* By design, we should have made this node a leaf to begin with so we
262 * should never reach here.
263 * But since it's so simple to handle this, let's do it just in case we
264 * change this rule.
265 */
266 lp->skip = 0;
267 } else {
268 lp->skip += p[valid_ptr].skip;
269 }
270}
271
272static void phys_page_compact_all(AddressSpaceDispatch *d, int nodes_nb)
273{
274 DECLARE_BITMAP(compacted, nodes_nb);
275
276 if (d->phys_map.skip) {
53cb28cb 277 phys_page_compact(&d->phys_map, d->map.nodes, compacted);
b35ba30f
MT
278 }
279}
280
97115a8d 281static MemoryRegionSection *phys_page_find(PhysPageEntry lp, hwaddr addr,
9affd6fc 282 Node *nodes, MemoryRegionSection *sections)
92e873b9 283{
31ab2b4a 284 PhysPageEntry *p;
97115a8d 285 hwaddr index = addr >> TARGET_PAGE_BITS;
31ab2b4a 286 int i;
f1f6e3b8 287
9736e55b 288 for (i = P_L2_LEVELS; lp.skip && (i -= lp.skip) >= 0;) {
c19e8800 289 if (lp.ptr == PHYS_MAP_NODE_NIL) {
9affd6fc 290 return &sections[PHYS_SECTION_UNASSIGNED];
31ab2b4a 291 }
9affd6fc 292 p = nodes[lp.ptr];
03f49957 293 lp = p[(index >> (i * P_L2_BITS)) & (P_L2_SIZE - 1)];
5312bd8b 294 }
b35ba30f
MT
295
296 if (sections[lp.ptr].size.hi ||
297 range_covers_byte(sections[lp.ptr].offset_within_address_space,
298 sections[lp.ptr].size.lo, addr)) {
299 return &sections[lp.ptr];
300 } else {
301 return &sections[PHYS_SECTION_UNASSIGNED];
302 }
f3705d53
AK
303}
304
e5548617
BS
305bool memory_region_is_unassigned(MemoryRegion *mr)
306{
2a8e7499 307 return mr != &io_mem_rom && mr != &io_mem_notdirty && !mr->rom_device
5b6dd868 308 && mr != &io_mem_watch;
fd6ce8f6 309}
149f54b5 310
c7086b4a 311static MemoryRegionSection *address_space_lookup_region(AddressSpaceDispatch *d,
90260c6c
JK
312 hwaddr addr,
313 bool resolve_subpage)
9f029603 314{
90260c6c
JK
315 MemoryRegionSection *section;
316 subpage_t *subpage;
317
53cb28cb 318 section = phys_page_find(d->phys_map, addr, d->map.nodes, d->map.sections);
90260c6c
JK
319 if (resolve_subpage && section->mr->subpage) {
320 subpage = container_of(section->mr, subpage_t, iomem);
53cb28cb 321 section = &d->map.sections[subpage->sub_section[SUBPAGE_IDX(addr)]];
90260c6c
JK
322 }
323 return section;
9f029603
JK
324}
325
90260c6c 326static MemoryRegionSection *
c7086b4a 327address_space_translate_internal(AddressSpaceDispatch *d, hwaddr addr, hwaddr *xlat,
90260c6c 328 hwaddr *plen, bool resolve_subpage)
149f54b5
PB
329{
330 MemoryRegionSection *section;
a87f3954 331 Int128 diff;
149f54b5 332
c7086b4a 333 section = address_space_lookup_region(d, addr, resolve_subpage);
149f54b5
PB
334 /* Compute offset within MemoryRegionSection */
335 addr -= section->offset_within_address_space;
336
337 /* Compute offset within MemoryRegion */
338 *xlat = addr + section->offset_within_region;
339
340 diff = int128_sub(section->mr->size, int128_make64(addr));
3752a036 341 *plen = int128_get64(int128_min(diff, int128_make64(*plen)));
149f54b5
PB
342 return section;
343}
90260c6c 344
a87f3954
PB
345static inline bool memory_access_is_direct(MemoryRegion *mr, bool is_write)
346{
347 if (memory_region_is_ram(mr)) {
348 return !(is_write && mr->readonly);
349 }
350 if (memory_region_is_romd(mr)) {
351 return !is_write;
352 }
353
354 return false;
355}
356
5c8a00ce
PB
357MemoryRegion *address_space_translate(AddressSpace *as, hwaddr addr,
358 hwaddr *xlat, hwaddr *plen,
359 bool is_write)
90260c6c 360{
30951157
AK
361 IOMMUTLBEntry iotlb;
362 MemoryRegionSection *section;
363 MemoryRegion *mr;
364 hwaddr len = *plen;
365
366 for (;;) {
a87f3954 367 section = address_space_translate_internal(as->dispatch, addr, &addr, plen, true);
30951157
AK
368 mr = section->mr;
369
370 if (!mr->iommu_ops) {
371 break;
372 }
373
374 iotlb = mr->iommu_ops->translate(mr, addr);
375 addr = ((iotlb.translated_addr & ~iotlb.addr_mask)
376 | (addr & iotlb.addr_mask));
377 len = MIN(len, (addr | iotlb.addr_mask) - addr + 1);
378 if (!(iotlb.perm & (1 << is_write))) {
379 mr = &io_mem_unassigned;
380 break;
381 }
382
383 as = iotlb.target_as;
384 }
385
fe680d0d 386 if (xen_enabled() && memory_access_is_direct(mr, is_write)) {
a87f3954
PB
387 hwaddr page = ((addr & TARGET_PAGE_MASK) + TARGET_PAGE_SIZE) - addr;
388 len = MIN(page, len);
389 }
390
30951157
AK
391 *plen = len;
392 *xlat = addr;
393 return mr;
90260c6c
JK
394}
395
396MemoryRegionSection *
397address_space_translate_for_iotlb(AddressSpace *as, hwaddr addr, hwaddr *xlat,
398 hwaddr *plen)
399{
30951157 400 MemoryRegionSection *section;
c7086b4a 401 section = address_space_translate_internal(as->dispatch, addr, xlat, plen, false);
30951157
AK
402
403 assert(!section->mr->iommu_ops);
404 return section;
90260c6c 405}
5b6dd868 406#endif
fd6ce8f6 407
5b6dd868 408void cpu_exec_init_all(void)
fdbb84d1 409{
5b6dd868 410#if !defined(CONFIG_USER_ONLY)
b2a8658e 411 qemu_mutex_init(&ram_list.mutex);
5b6dd868
BS
412 memory_map_init();
413 io_mem_init();
fdbb84d1 414#endif
5b6dd868 415}
fdbb84d1 416
b170fce3 417#if !defined(CONFIG_USER_ONLY)
5b6dd868
BS
418
419static int cpu_common_post_load(void *opaque, int version_id)
fd6ce8f6 420{
259186a7 421 CPUState *cpu = opaque;
a513fe19 422
5b6dd868
BS
423 /* 0x01 was CPU_INTERRUPT_EXIT. This line can be removed when the
424 version_id is increased. */
259186a7 425 cpu->interrupt_request &= ~0x01;
c01a71c1 426 tlb_flush(cpu, 1);
5b6dd868
BS
427
428 return 0;
a513fe19 429}
7501267e 430
1a1562f5 431const VMStateDescription vmstate_cpu_common = {
5b6dd868
BS
432 .name = "cpu_common",
433 .version_id = 1,
434 .minimum_version_id = 1,
5b6dd868 435 .post_load = cpu_common_post_load,
35d08458 436 .fields = (VMStateField[]) {
259186a7
AF
437 VMSTATE_UINT32(halted, CPUState),
438 VMSTATE_UINT32(interrupt_request, CPUState),
5b6dd868
BS
439 VMSTATE_END_OF_LIST()
440 }
441};
1a1562f5 442
5b6dd868 443#endif
ea041c0e 444
38d8f5c8 445CPUState *qemu_get_cpu(int index)
ea041c0e 446{
bdc44640 447 CPUState *cpu;
ea041c0e 448
bdc44640 449 CPU_FOREACH(cpu) {
55e5c285 450 if (cpu->cpu_index == index) {
bdc44640 451 return cpu;
55e5c285 452 }
ea041c0e 453 }
5b6dd868 454
bdc44640 455 return NULL;
ea041c0e
FB
456}
457
09daed84
EI
458#if !defined(CONFIG_USER_ONLY)
459void tcg_cpu_address_space_init(CPUState *cpu, AddressSpace *as)
460{
461 /* We only support one address space per cpu at the moment. */
462 assert(cpu->as == as);
463
464 if (cpu->tcg_as_listener) {
465 memory_listener_unregister(cpu->tcg_as_listener);
466 } else {
467 cpu->tcg_as_listener = g_new0(MemoryListener, 1);
468 }
469 cpu->tcg_as_listener->commit = tcg_commit;
470 memory_listener_register(cpu->tcg_as_listener, as);
471}
472#endif
473
5b6dd868 474void cpu_exec_init(CPUArchState *env)
ea041c0e 475{
5b6dd868 476 CPUState *cpu = ENV_GET_CPU(env);
b170fce3 477 CPUClass *cc = CPU_GET_CLASS(cpu);
bdc44640 478 CPUState *some_cpu;
5b6dd868
BS
479 int cpu_index;
480
481#if defined(CONFIG_USER_ONLY)
482 cpu_list_lock();
483#endif
5b6dd868 484 cpu_index = 0;
bdc44640 485 CPU_FOREACH(some_cpu) {
5b6dd868
BS
486 cpu_index++;
487 }
55e5c285 488 cpu->cpu_index = cpu_index;
1b1ed8dc 489 cpu->numa_node = 0;
f0c3c505 490 QTAILQ_INIT(&cpu->breakpoints);
ff4700b0 491 QTAILQ_INIT(&cpu->watchpoints);
5b6dd868 492#ifndef CONFIG_USER_ONLY
09daed84 493 cpu->as = &address_space_memory;
5b6dd868
BS
494 cpu->thread_id = qemu_get_thread_id();
495#endif
bdc44640 496 QTAILQ_INSERT_TAIL(&cpus, cpu, node);
5b6dd868
BS
497#if defined(CONFIG_USER_ONLY)
498 cpu_list_unlock();
499#endif
e0d47944
AF
500 if (qdev_get_vmsd(DEVICE(cpu)) == NULL) {
501 vmstate_register(NULL, cpu_index, &vmstate_cpu_common, cpu);
502 }
5b6dd868 503#if defined(CPU_SAVE_VERSION) && !defined(CONFIG_USER_ONLY)
5b6dd868
BS
504 register_savevm(NULL, "cpu", cpu_index, CPU_SAVE_VERSION,
505 cpu_save, cpu_load, env);
b170fce3 506 assert(cc->vmsd == NULL);
e0d47944 507 assert(qdev_get_vmsd(DEVICE(cpu)) == NULL);
5b6dd868 508#endif
b170fce3
AF
509 if (cc->vmsd != NULL) {
510 vmstate_register(NULL, cpu_index, cc->vmsd, cpu);
511 }
ea041c0e
FB
512}
513
1fddef4b 514#if defined(TARGET_HAS_ICE)
94df27fd 515#if defined(CONFIG_USER_ONLY)
00b941e5 516static void breakpoint_invalidate(CPUState *cpu, target_ulong pc)
94df27fd
PB
517{
518 tb_invalidate_phys_page_range(pc, pc + 1, 0);
519}
520#else
00b941e5 521static void breakpoint_invalidate(CPUState *cpu, target_ulong pc)
1e7855a5 522{
e8262a1b
MF
523 hwaddr phys = cpu_get_phys_page_debug(cpu, pc);
524 if (phys != -1) {
09daed84 525 tb_invalidate_phys_addr(cpu->as,
29d8ec7b 526 phys | (pc & ~TARGET_PAGE_MASK));
e8262a1b 527 }
1e7855a5 528}
c27004ec 529#endif
94df27fd 530#endif /* TARGET_HAS_ICE */
d720b93d 531
c527ee8f 532#if defined(CONFIG_USER_ONLY)
75a34036 533void cpu_watchpoint_remove_all(CPUState *cpu, int mask)
c527ee8f
PB
534
535{
536}
537
75a34036 538int cpu_watchpoint_insert(CPUState *cpu, vaddr addr, vaddr len,
c527ee8f
PB
539 int flags, CPUWatchpoint **watchpoint)
540{
541 return -ENOSYS;
542}
543#else
6658ffb8 544/* Add a watchpoint. */
75a34036 545int cpu_watchpoint_insert(CPUState *cpu, vaddr addr, vaddr len,
a1d1bb31 546 int flags, CPUWatchpoint **watchpoint)
6658ffb8 547{
75a34036 548 vaddr len_mask = ~(len - 1);
c0ce998e 549 CPUWatchpoint *wp;
6658ffb8 550
b4051334 551 /* sanity checks: allow power-of-2 lengths, deny unaligned watchpoints */
0dc23828
MF
552 if ((len & (len - 1)) || (addr & ~len_mask) ||
553 len == 0 || len > TARGET_PAGE_SIZE) {
75a34036
AF
554 error_report("tried to set invalid watchpoint at %"
555 VADDR_PRIx ", len=%" VADDR_PRIu, addr, len);
b4051334
AL
556 return -EINVAL;
557 }
7267c094 558 wp = g_malloc(sizeof(*wp));
a1d1bb31
AL
559
560 wp->vaddr = addr;
b4051334 561 wp->len_mask = len_mask;
a1d1bb31
AL
562 wp->flags = flags;
563
2dc9f411 564 /* keep all GDB-injected watchpoints in front */
ff4700b0
AF
565 if (flags & BP_GDB) {
566 QTAILQ_INSERT_HEAD(&cpu->watchpoints, wp, entry);
567 } else {
568 QTAILQ_INSERT_TAIL(&cpu->watchpoints, wp, entry);
569 }
6658ffb8 570
31b030d4 571 tlb_flush_page(cpu, addr);
a1d1bb31
AL
572
573 if (watchpoint)
574 *watchpoint = wp;
575 return 0;
6658ffb8
PB
576}
577
a1d1bb31 578/* Remove a specific watchpoint. */
75a34036 579int cpu_watchpoint_remove(CPUState *cpu, vaddr addr, vaddr len,
a1d1bb31 580 int flags)
6658ffb8 581{
75a34036 582 vaddr len_mask = ~(len - 1);
a1d1bb31 583 CPUWatchpoint *wp;
6658ffb8 584
ff4700b0 585 QTAILQ_FOREACH(wp, &cpu->watchpoints, entry) {
b4051334 586 if (addr == wp->vaddr && len_mask == wp->len_mask
6e140f28 587 && flags == (wp->flags & ~BP_WATCHPOINT_HIT)) {
75a34036 588 cpu_watchpoint_remove_by_ref(cpu, wp);
6658ffb8
PB
589 return 0;
590 }
591 }
a1d1bb31 592 return -ENOENT;
6658ffb8
PB
593}
594
a1d1bb31 595/* Remove a specific watchpoint by reference. */
75a34036 596void cpu_watchpoint_remove_by_ref(CPUState *cpu, CPUWatchpoint *watchpoint)
a1d1bb31 597{
ff4700b0 598 QTAILQ_REMOVE(&cpu->watchpoints, watchpoint, entry);
7d03f82f 599
31b030d4 600 tlb_flush_page(cpu, watchpoint->vaddr);
a1d1bb31 601
7267c094 602 g_free(watchpoint);
a1d1bb31
AL
603}
604
605/* Remove all matching watchpoints. */
75a34036 606void cpu_watchpoint_remove_all(CPUState *cpu, int mask)
a1d1bb31 607{
c0ce998e 608 CPUWatchpoint *wp, *next;
a1d1bb31 609
ff4700b0 610 QTAILQ_FOREACH_SAFE(wp, &cpu->watchpoints, entry, next) {
75a34036
AF
611 if (wp->flags & mask) {
612 cpu_watchpoint_remove_by_ref(cpu, wp);
613 }
c0ce998e 614 }
7d03f82f 615}
c527ee8f 616#endif
7d03f82f 617
a1d1bb31 618/* Add a breakpoint. */
b3310ab3 619int cpu_breakpoint_insert(CPUState *cpu, vaddr pc, int flags,
a1d1bb31 620 CPUBreakpoint **breakpoint)
4c3a88a2 621{
1fddef4b 622#if defined(TARGET_HAS_ICE)
c0ce998e 623 CPUBreakpoint *bp;
3b46e624 624
7267c094 625 bp = g_malloc(sizeof(*bp));
4c3a88a2 626
a1d1bb31
AL
627 bp->pc = pc;
628 bp->flags = flags;
629
2dc9f411 630 /* keep all GDB-injected breakpoints in front */
00b941e5 631 if (flags & BP_GDB) {
f0c3c505 632 QTAILQ_INSERT_HEAD(&cpu->breakpoints, bp, entry);
00b941e5 633 } else {
f0c3c505 634 QTAILQ_INSERT_TAIL(&cpu->breakpoints, bp, entry);
00b941e5 635 }
3b46e624 636
f0c3c505 637 breakpoint_invalidate(cpu, pc);
a1d1bb31 638
00b941e5 639 if (breakpoint) {
a1d1bb31 640 *breakpoint = bp;
00b941e5 641 }
4c3a88a2
FB
642 return 0;
643#else
a1d1bb31 644 return -ENOSYS;
4c3a88a2
FB
645#endif
646}
647
a1d1bb31 648/* Remove a specific breakpoint. */
b3310ab3 649int cpu_breakpoint_remove(CPUState *cpu, vaddr pc, int flags)
a1d1bb31 650{
7d03f82f 651#if defined(TARGET_HAS_ICE)
a1d1bb31
AL
652 CPUBreakpoint *bp;
653
f0c3c505 654 QTAILQ_FOREACH(bp, &cpu->breakpoints, entry) {
a1d1bb31 655 if (bp->pc == pc && bp->flags == flags) {
b3310ab3 656 cpu_breakpoint_remove_by_ref(cpu, bp);
a1d1bb31
AL
657 return 0;
658 }
7d03f82f 659 }
a1d1bb31
AL
660 return -ENOENT;
661#else
662 return -ENOSYS;
7d03f82f
EI
663#endif
664}
665
a1d1bb31 666/* Remove a specific breakpoint by reference. */
b3310ab3 667void cpu_breakpoint_remove_by_ref(CPUState *cpu, CPUBreakpoint *breakpoint)
4c3a88a2 668{
1fddef4b 669#if defined(TARGET_HAS_ICE)
f0c3c505
AF
670 QTAILQ_REMOVE(&cpu->breakpoints, breakpoint, entry);
671
672 breakpoint_invalidate(cpu, breakpoint->pc);
a1d1bb31 673
7267c094 674 g_free(breakpoint);
a1d1bb31
AL
675#endif
676}
677
678/* Remove all matching breakpoints. */
b3310ab3 679void cpu_breakpoint_remove_all(CPUState *cpu, int mask)
a1d1bb31
AL
680{
681#if defined(TARGET_HAS_ICE)
c0ce998e 682 CPUBreakpoint *bp, *next;
a1d1bb31 683
f0c3c505 684 QTAILQ_FOREACH_SAFE(bp, &cpu->breakpoints, entry, next) {
b3310ab3
AF
685 if (bp->flags & mask) {
686 cpu_breakpoint_remove_by_ref(cpu, bp);
687 }
c0ce998e 688 }
4c3a88a2
FB
689#endif
690}
691
c33a346e
FB
692/* enable or disable single step mode. EXCP_DEBUG is returned by the
693 CPU loop after each instruction */
3825b28f 694void cpu_single_step(CPUState *cpu, int enabled)
c33a346e 695{
1fddef4b 696#if defined(TARGET_HAS_ICE)
ed2803da
AF
697 if (cpu->singlestep_enabled != enabled) {
698 cpu->singlestep_enabled = enabled;
699 if (kvm_enabled()) {
38e478ec 700 kvm_update_guest_debug(cpu, 0);
ed2803da 701 } else {
ccbb4d44 702 /* must flush all the translated code to avoid inconsistencies */
e22a25c9 703 /* XXX: only flush what is necessary */
38e478ec 704 CPUArchState *env = cpu->env_ptr;
e22a25c9
AL
705 tb_flush(env);
706 }
c33a346e
FB
707 }
708#endif
709}
710
a47dddd7 711void cpu_abort(CPUState *cpu, const char *fmt, ...)
7501267e
FB
712{
713 va_list ap;
493ae1f0 714 va_list ap2;
7501267e
FB
715
716 va_start(ap, fmt);
493ae1f0 717 va_copy(ap2, ap);
7501267e
FB
718 fprintf(stderr, "qemu: fatal: ");
719 vfprintf(stderr, fmt, ap);
720 fprintf(stderr, "\n");
878096ee 721 cpu_dump_state(cpu, stderr, fprintf, CPU_DUMP_FPU | CPU_DUMP_CCOP);
93fcfe39
AL
722 if (qemu_log_enabled()) {
723 qemu_log("qemu: fatal: ");
724 qemu_log_vprintf(fmt, ap2);
725 qemu_log("\n");
a0762859 726 log_cpu_state(cpu, CPU_DUMP_FPU | CPU_DUMP_CCOP);
31b1a7b4 727 qemu_log_flush();
93fcfe39 728 qemu_log_close();
924edcae 729 }
493ae1f0 730 va_end(ap2);
f9373291 731 va_end(ap);
fd052bf6
RV
732#if defined(CONFIG_USER_ONLY)
733 {
734 struct sigaction act;
735 sigfillset(&act.sa_mask);
736 act.sa_handler = SIG_DFL;
737 sigaction(SIGABRT, &act, NULL);
738 }
739#endif
7501267e
FB
740 abort();
741}
742
0124311e 743#if !defined(CONFIG_USER_ONLY)
041603fe
PB
744static RAMBlock *qemu_get_ram_block(ram_addr_t addr)
745{
746 RAMBlock *block;
747
748 /* The list is protected by the iothread lock here. */
749 block = ram_list.mru_block;
750 if (block && addr - block->offset < block->length) {
751 goto found;
752 }
753 QTAILQ_FOREACH(block, &ram_list.blocks, next) {
754 if (addr - block->offset < block->length) {
755 goto found;
756 }
757 }
758
759 fprintf(stderr, "Bad ram offset %" PRIx64 "\n", (uint64_t)addr);
760 abort();
761
762found:
763 ram_list.mru_block = block;
764 return block;
765}
766
a2f4d5be 767static void tlb_reset_dirty_range_all(ram_addr_t start, ram_addr_t length)
d24981d3 768{
041603fe 769 ram_addr_t start1;
a2f4d5be
JQ
770 RAMBlock *block;
771 ram_addr_t end;
772
773 end = TARGET_PAGE_ALIGN(start + length);
774 start &= TARGET_PAGE_MASK;
d24981d3 775
041603fe
PB
776 block = qemu_get_ram_block(start);
777 assert(block == qemu_get_ram_block(end - 1));
778 start1 = (uintptr_t)block->host + (start - block->offset);
779 cpu_tlb_reset_dirty_all(start1, length);
d24981d3
JQ
780}
781
5579c7f3 782/* Note: start and end must be within the same ram block. */
a2f4d5be 783void cpu_physical_memory_reset_dirty(ram_addr_t start, ram_addr_t length,
52159192 784 unsigned client)
1ccde1cb 785{
1ccde1cb
FB
786 if (length == 0)
787 return;
ace694cc 788 cpu_physical_memory_clear_dirty_range(start, length, client);
f23db169 789
d24981d3 790 if (tcg_enabled()) {
a2f4d5be 791 tlb_reset_dirty_range_all(start, length);
5579c7f3 792 }
1ccde1cb
FB
793}
794
981fdf23 795static void cpu_physical_memory_set_dirty_tracking(bool enable)
74576198
AL
796{
797 in_migration = enable;
74576198
AL
798}
799
bb0e627a 800hwaddr memory_region_section_get_iotlb(CPUState *cpu,
149f54b5
PB
801 MemoryRegionSection *section,
802 target_ulong vaddr,
803 hwaddr paddr, hwaddr xlat,
804 int prot,
805 target_ulong *address)
e5548617 806{
a8170e5e 807 hwaddr iotlb;
e5548617
BS
808 CPUWatchpoint *wp;
809
cc5bea60 810 if (memory_region_is_ram(section->mr)) {
e5548617
BS
811 /* Normal RAM. */
812 iotlb = (memory_region_get_ram_addr(section->mr) & TARGET_PAGE_MASK)
149f54b5 813 + xlat;
e5548617 814 if (!section->readonly) {
b41aac4f 815 iotlb |= PHYS_SECTION_NOTDIRTY;
e5548617 816 } else {
b41aac4f 817 iotlb |= PHYS_SECTION_ROM;
e5548617
BS
818 }
819 } else {
1b3fb98f 820 iotlb = section - section->address_space->dispatch->map.sections;
149f54b5 821 iotlb += xlat;
e5548617
BS
822 }
823
824 /* Make accesses to pages with watchpoints go via the
825 watchpoint trap routines. */
ff4700b0 826 QTAILQ_FOREACH(wp, &cpu->watchpoints, entry) {
e5548617
BS
827 if (vaddr == (wp->vaddr & TARGET_PAGE_MASK)) {
828 /* Avoid trapping reads of pages with a write breakpoint. */
829 if ((prot & PAGE_WRITE) || (wp->flags & BP_MEM_READ)) {
b41aac4f 830 iotlb = PHYS_SECTION_WATCH + paddr;
e5548617
BS
831 *address |= TLB_MMIO;
832 break;
833 }
834 }
835 }
836
837 return iotlb;
838}
9fa3e853
FB
839#endif /* defined(CONFIG_USER_ONLY) */
840
e2eef170 841#if !defined(CONFIG_USER_ONLY)
8da3ff18 842
c227f099 843static int subpage_register (subpage_t *mmio, uint32_t start, uint32_t end,
5312bd8b 844 uint16_t section);
acc9d80b 845static subpage_t *subpage_init(AddressSpace *as, hwaddr base);
54688b1e 846
575ddeb4 847static void *(*phys_mem_alloc)(size_t size) = qemu_anon_ram_alloc;
91138037
MA
848
849/*
850 * Set a custom physical guest memory alloator.
851 * Accelerators with unusual needs may need this. Hopefully, we can
852 * get rid of it eventually.
853 */
575ddeb4 854void phys_mem_set_alloc(void *(*alloc)(size_t))
91138037
MA
855{
856 phys_mem_alloc = alloc;
857}
858
53cb28cb
MA
859static uint16_t phys_section_add(PhysPageMap *map,
860 MemoryRegionSection *section)
5312bd8b 861{
68f3f65b
PB
862 /* The physical section number is ORed with a page-aligned
863 * pointer to produce the iotlb entries. Thus it should
864 * never overflow into the page-aligned value.
865 */
53cb28cb 866 assert(map->sections_nb < TARGET_PAGE_SIZE);
68f3f65b 867
53cb28cb
MA
868 if (map->sections_nb == map->sections_nb_alloc) {
869 map->sections_nb_alloc = MAX(map->sections_nb_alloc * 2, 16);
870 map->sections = g_renew(MemoryRegionSection, map->sections,
871 map->sections_nb_alloc);
5312bd8b 872 }
53cb28cb 873 map->sections[map->sections_nb] = *section;
dfde4e6e 874 memory_region_ref(section->mr);
53cb28cb 875 return map->sections_nb++;
5312bd8b
AK
876}
877
058bc4b5
PB
878static void phys_section_destroy(MemoryRegion *mr)
879{
dfde4e6e
PB
880 memory_region_unref(mr);
881
058bc4b5
PB
882 if (mr->subpage) {
883 subpage_t *subpage = container_of(mr, subpage_t, iomem);
884 memory_region_destroy(&subpage->iomem);
885 g_free(subpage);
886 }
887}
888
6092666e 889static void phys_sections_free(PhysPageMap *map)
5312bd8b 890{
9affd6fc
PB
891 while (map->sections_nb > 0) {
892 MemoryRegionSection *section = &map->sections[--map->sections_nb];
058bc4b5
PB
893 phys_section_destroy(section->mr);
894 }
9affd6fc
PB
895 g_free(map->sections);
896 g_free(map->nodes);
5312bd8b
AK
897}
898
ac1970fb 899static void register_subpage(AddressSpaceDispatch *d, MemoryRegionSection *section)
0f0cb164
AK
900{
901 subpage_t *subpage;
a8170e5e 902 hwaddr base = section->offset_within_address_space
0f0cb164 903 & TARGET_PAGE_MASK;
97115a8d 904 MemoryRegionSection *existing = phys_page_find(d->phys_map, base,
53cb28cb 905 d->map.nodes, d->map.sections);
0f0cb164
AK
906 MemoryRegionSection subsection = {
907 .offset_within_address_space = base,
052e87b0 908 .size = int128_make64(TARGET_PAGE_SIZE),
0f0cb164 909 };
a8170e5e 910 hwaddr start, end;
0f0cb164 911
f3705d53 912 assert(existing->mr->subpage || existing->mr == &io_mem_unassigned);
0f0cb164 913
f3705d53 914 if (!(existing->mr->subpage)) {
acc9d80b 915 subpage = subpage_init(d->as, base);
3be91e86 916 subsection.address_space = d->as;
0f0cb164 917 subsection.mr = &subpage->iomem;
ac1970fb 918 phys_page_set(d, base >> TARGET_PAGE_BITS, 1,
53cb28cb 919 phys_section_add(&d->map, &subsection));
0f0cb164 920 } else {
f3705d53 921 subpage = container_of(existing->mr, subpage_t, iomem);
0f0cb164
AK
922 }
923 start = section->offset_within_address_space & ~TARGET_PAGE_MASK;
052e87b0 924 end = start + int128_get64(section->size) - 1;
53cb28cb
MA
925 subpage_register(subpage, start, end,
926 phys_section_add(&d->map, section));
0f0cb164
AK
927}
928
929
052e87b0
PB
930static void register_multipage(AddressSpaceDispatch *d,
931 MemoryRegionSection *section)
33417e70 932{
a8170e5e 933 hwaddr start_addr = section->offset_within_address_space;
53cb28cb 934 uint16_t section_index = phys_section_add(&d->map, section);
052e87b0
PB
935 uint64_t num_pages = int128_get64(int128_rshift(section->size,
936 TARGET_PAGE_BITS));
dd81124b 937
733d5ef5
PB
938 assert(num_pages);
939 phys_page_set(d, start_addr >> TARGET_PAGE_BITS, num_pages, section_index);
33417e70
FB
940}
941
ac1970fb 942static void mem_add(MemoryListener *listener, MemoryRegionSection *section)
0f0cb164 943{
89ae337a 944 AddressSpace *as = container_of(listener, AddressSpace, dispatch_listener);
00752703 945 AddressSpaceDispatch *d = as->next_dispatch;
99b9cc06 946 MemoryRegionSection now = *section, remain = *section;
052e87b0 947 Int128 page_size = int128_make64(TARGET_PAGE_SIZE);
0f0cb164 948
733d5ef5
PB
949 if (now.offset_within_address_space & ~TARGET_PAGE_MASK) {
950 uint64_t left = TARGET_PAGE_ALIGN(now.offset_within_address_space)
951 - now.offset_within_address_space;
952
052e87b0 953 now.size = int128_min(int128_make64(left), now.size);
ac1970fb 954 register_subpage(d, &now);
733d5ef5 955 } else {
052e87b0 956 now.size = int128_zero();
733d5ef5 957 }
052e87b0
PB
958 while (int128_ne(remain.size, now.size)) {
959 remain.size = int128_sub(remain.size, now.size);
960 remain.offset_within_address_space += int128_get64(now.size);
961 remain.offset_within_region += int128_get64(now.size);
69b67646 962 now = remain;
052e87b0 963 if (int128_lt(remain.size, page_size)) {
733d5ef5 964 register_subpage(d, &now);
88266249 965 } else if (remain.offset_within_address_space & ~TARGET_PAGE_MASK) {
052e87b0 966 now.size = page_size;
ac1970fb 967 register_subpage(d, &now);
69b67646 968 } else {
052e87b0 969 now.size = int128_and(now.size, int128_neg(page_size));
ac1970fb 970 register_multipage(d, &now);
69b67646 971 }
0f0cb164
AK
972 }
973}
974
62a2744c
SY
975void qemu_flush_coalesced_mmio_buffer(void)
976{
977 if (kvm_enabled())
978 kvm_flush_coalesced_mmio_buffer();
979}
980
b2a8658e
UD
981void qemu_mutex_lock_ramlist(void)
982{
983 qemu_mutex_lock(&ram_list.mutex);
984}
985
986void qemu_mutex_unlock_ramlist(void)
987{
988 qemu_mutex_unlock(&ram_list.mutex);
989}
990
e1e84ba0 991#ifdef __linux__
c902760f
MT
992
993#include <sys/vfs.h>
994
995#define HUGETLBFS_MAGIC 0x958458f6
996
997static long gethugepagesize(const char *path)
998{
999 struct statfs fs;
1000 int ret;
1001
1002 do {
9742bf26 1003 ret = statfs(path, &fs);
c902760f
MT
1004 } while (ret != 0 && errno == EINTR);
1005
1006 if (ret != 0) {
9742bf26
YT
1007 perror(path);
1008 return 0;
c902760f
MT
1009 }
1010
1011 if (fs.f_type != HUGETLBFS_MAGIC)
9742bf26 1012 fprintf(stderr, "Warning: path not on HugeTLBFS: %s\n", path);
c902760f
MT
1013
1014 return fs.f_bsize;
1015}
1016
04b16653
AW
1017static void *file_ram_alloc(RAMBlock *block,
1018 ram_addr_t memory,
7f56e740
PB
1019 const char *path,
1020 Error **errp)
c902760f
MT
1021{
1022 char *filename;
8ca761f6
PF
1023 char *sanitized_name;
1024 char *c;
c902760f
MT
1025 void *area;
1026 int fd;
c902760f
MT
1027 unsigned long hpagesize;
1028
1029 hpagesize = gethugepagesize(path);
1030 if (!hpagesize) {
f9a49dfa 1031 goto error;
c902760f
MT
1032 }
1033
1034 if (memory < hpagesize) {
1035 return NULL;
1036 }
1037
1038 if (kvm_enabled() && !kvm_has_sync_mmu()) {
7f56e740
PB
1039 error_setg(errp,
1040 "host lacks kvm mmu notifiers, -mem-path unsupported");
f9a49dfa 1041 goto error;
c902760f
MT
1042 }
1043
8ca761f6
PF
1044 /* Make name safe to use with mkstemp by replacing '/' with '_'. */
1045 sanitized_name = g_strdup(block->mr->name);
1046 for (c = sanitized_name; *c != '\0'; c++) {
1047 if (*c == '/')
1048 *c = '_';
1049 }
1050
1051 filename = g_strdup_printf("%s/qemu_back_mem.%s.XXXXXX", path,
1052 sanitized_name);
1053 g_free(sanitized_name);
c902760f
MT
1054
1055 fd = mkstemp(filename);
1056 if (fd < 0) {
7f56e740
PB
1057 error_setg_errno(errp, errno,
1058 "unable to create backing store for hugepages");
e4ada482 1059 g_free(filename);
f9a49dfa 1060 goto error;
c902760f
MT
1061 }
1062 unlink(filename);
e4ada482 1063 g_free(filename);
c902760f
MT
1064
1065 memory = (memory+hpagesize-1) & ~(hpagesize-1);
1066
1067 /*
1068 * ftruncate is not supported by hugetlbfs in older
1069 * hosts, so don't bother bailing out on errors.
1070 * If anything goes wrong with it under other filesystems,
1071 * mmap will fail.
1072 */
7f56e740 1073 if (ftruncate(fd, memory)) {
9742bf26 1074 perror("ftruncate");
7f56e740 1075 }
c902760f 1076
c902760f 1077 area = mmap(0, memory, PROT_READ | PROT_WRITE, MAP_PRIVATE, fd, 0);
c902760f 1078 if (area == MAP_FAILED) {
7f56e740
PB
1079 error_setg_errno(errp, errno,
1080 "unable to map backing store for hugepages");
9742bf26 1081 close(fd);
f9a49dfa 1082 goto error;
c902760f 1083 }
ef36fa14
MT
1084
1085 if (mem_prealloc) {
38183310 1086 os_mem_prealloc(fd, area, memory);
ef36fa14
MT
1087 }
1088
04b16653 1089 block->fd = fd;
c902760f 1090 return area;
f9a49dfa
MT
1091
1092error:
1093 if (mem_prealloc) {
1094 exit(1);
1095 }
1096 return NULL;
c902760f
MT
1097}
1098#endif
1099
d17b5288 1100static ram_addr_t find_ram_offset(ram_addr_t size)
04b16653
AW
1101{
1102 RAMBlock *block, *next_block;
3e837b2c 1103 ram_addr_t offset = RAM_ADDR_MAX, mingap = RAM_ADDR_MAX;
04b16653 1104
49cd9ac6
SH
1105 assert(size != 0); /* it would hand out same offset multiple times */
1106
a3161038 1107 if (QTAILQ_EMPTY(&ram_list.blocks))
04b16653
AW
1108 return 0;
1109
a3161038 1110 QTAILQ_FOREACH(block, &ram_list.blocks, next) {
f15fbc4b 1111 ram_addr_t end, next = RAM_ADDR_MAX;
04b16653
AW
1112
1113 end = block->offset + block->length;
1114
a3161038 1115 QTAILQ_FOREACH(next_block, &ram_list.blocks, next) {
04b16653
AW
1116 if (next_block->offset >= end) {
1117 next = MIN(next, next_block->offset);
1118 }
1119 }
1120 if (next - end >= size && next - end < mingap) {
3e837b2c 1121 offset = end;
04b16653
AW
1122 mingap = next - end;
1123 }
1124 }
3e837b2c
AW
1125
1126 if (offset == RAM_ADDR_MAX) {
1127 fprintf(stderr, "Failed to find gap of requested size: %" PRIu64 "\n",
1128 (uint64_t)size);
1129 abort();
1130 }
1131
04b16653
AW
1132 return offset;
1133}
1134
652d7ec2 1135ram_addr_t last_ram_offset(void)
d17b5288
AW
1136{
1137 RAMBlock *block;
1138 ram_addr_t last = 0;
1139
a3161038 1140 QTAILQ_FOREACH(block, &ram_list.blocks, next)
d17b5288
AW
1141 last = MAX(last, block->offset + block->length);
1142
1143 return last;
1144}
1145
ddb97f1d
JB
1146static void qemu_ram_setup_dump(void *addr, ram_addr_t size)
1147{
1148 int ret;
ddb97f1d
JB
1149
1150 /* Use MADV_DONTDUMP, if user doesn't want the guest memory in the core */
2ff3de68
MA
1151 if (!qemu_opt_get_bool(qemu_get_machine_opts(),
1152 "dump-guest-core", true)) {
ddb97f1d
JB
1153 ret = qemu_madvise(addr, size, QEMU_MADV_DONTDUMP);
1154 if (ret) {
1155 perror("qemu_madvise");
1156 fprintf(stderr, "madvise doesn't support MADV_DONTDUMP, "
1157 "but dump_guest_core=off specified\n");
1158 }
1159 }
1160}
1161
20cfe881 1162static RAMBlock *find_ram_block(ram_addr_t addr)
84b89d78 1163{
20cfe881 1164 RAMBlock *block;
84b89d78 1165
a3161038 1166 QTAILQ_FOREACH(block, &ram_list.blocks, next) {
c5705a77 1167 if (block->offset == addr) {
20cfe881 1168 return block;
c5705a77
AK
1169 }
1170 }
20cfe881
HT
1171
1172 return NULL;
1173}
1174
1175void qemu_ram_set_idstr(ram_addr_t addr, const char *name, DeviceState *dev)
1176{
1177 RAMBlock *new_block = find_ram_block(addr);
1178 RAMBlock *block;
1179
c5705a77
AK
1180 assert(new_block);
1181 assert(!new_block->idstr[0]);
84b89d78 1182
09e5ab63
AL
1183 if (dev) {
1184 char *id = qdev_get_dev_path(dev);
84b89d78
CM
1185 if (id) {
1186 snprintf(new_block->idstr, sizeof(new_block->idstr), "%s/", id);
7267c094 1187 g_free(id);
84b89d78
CM
1188 }
1189 }
1190 pstrcat(new_block->idstr, sizeof(new_block->idstr), name);
1191
b2a8658e
UD
1192 /* This assumes the iothread lock is taken here too. */
1193 qemu_mutex_lock_ramlist();
a3161038 1194 QTAILQ_FOREACH(block, &ram_list.blocks, next) {
c5705a77 1195 if (block != new_block && !strcmp(block->idstr, new_block->idstr)) {
84b89d78
CM
1196 fprintf(stderr, "RAMBlock \"%s\" already registered, abort!\n",
1197 new_block->idstr);
1198 abort();
1199 }
1200 }
b2a8658e 1201 qemu_mutex_unlock_ramlist();
c5705a77
AK
1202}
1203
20cfe881
HT
1204void qemu_ram_unset_idstr(ram_addr_t addr)
1205{
1206 RAMBlock *block = find_ram_block(addr);
1207
1208 if (block) {
1209 memset(block->idstr, 0, sizeof(block->idstr));
1210 }
1211}
1212
8490fc78
LC
1213static int memory_try_enable_merging(void *addr, size_t len)
1214{
2ff3de68 1215 if (!qemu_opt_get_bool(qemu_get_machine_opts(), "mem-merge", true)) {
8490fc78
LC
1216 /* disabled by the user */
1217 return 0;
1218 }
1219
1220 return qemu_madvise(addr, len, QEMU_MADV_MERGEABLE);
1221}
1222
e1c57ab8 1223static ram_addr_t ram_block_add(RAMBlock *new_block)
c5705a77 1224{
e1c57ab8 1225 RAMBlock *block;
2152f5ca
JQ
1226 ram_addr_t old_ram_size, new_ram_size;
1227
1228 old_ram_size = last_ram_offset() >> TARGET_PAGE_BITS;
c5705a77 1229
b2a8658e
UD
1230 /* This assumes the iothread lock is taken here too. */
1231 qemu_mutex_lock_ramlist();
e1c57ab8
PB
1232 new_block->offset = find_ram_offset(new_block->length);
1233
1234 if (!new_block->host) {
1235 if (xen_enabled()) {
1236 xen_ram_alloc(new_block->offset, new_block->length, new_block->mr);
1237 } else {
1238 new_block->host = phys_mem_alloc(new_block->length);
39228250
MA
1239 if (!new_block->host) {
1240 fprintf(stderr, "Cannot set up guest memory '%s': %s\n",
1241 new_block->mr->name, strerror(errno));
1242 exit(1);
1243 }
e1c57ab8 1244 memory_try_enable_merging(new_block->host, new_block->length);
6977dfe6 1245 }
c902760f 1246 }
94a6b54f 1247
abb26d63
PB
1248 /* Keep the list sorted from biggest to smallest block. */
1249 QTAILQ_FOREACH(block, &ram_list.blocks, next) {
1250 if (block->length < new_block->length) {
1251 break;
1252 }
1253 }
1254 if (block) {
1255 QTAILQ_INSERT_BEFORE(block, new_block, next);
1256 } else {
1257 QTAILQ_INSERT_TAIL(&ram_list.blocks, new_block, next);
1258 }
0d6d3c87 1259 ram_list.mru_block = NULL;
94a6b54f 1260
f798b07f 1261 ram_list.version++;
b2a8658e 1262 qemu_mutex_unlock_ramlist();
f798b07f 1263
2152f5ca
JQ
1264 new_ram_size = last_ram_offset() >> TARGET_PAGE_BITS;
1265
1266 if (new_ram_size > old_ram_size) {
1ab4c8ce
JQ
1267 int i;
1268 for (i = 0; i < DIRTY_MEMORY_NUM; i++) {
1269 ram_list.dirty_memory[i] =
1270 bitmap_zero_extend(ram_list.dirty_memory[i],
1271 old_ram_size, new_ram_size);
1272 }
2152f5ca 1273 }
e1c57ab8 1274 cpu_physical_memory_set_dirty_range(new_block->offset, new_block->length);
94a6b54f 1275
e1c57ab8
PB
1276 qemu_ram_setup_dump(new_block->host, new_block->length);
1277 qemu_madvise(new_block->host, new_block->length, QEMU_MADV_HUGEPAGE);
1278 qemu_madvise(new_block->host, new_block->length, QEMU_MADV_DONTFORK);
ddb97f1d 1279
e1c57ab8
PB
1280 if (kvm_enabled()) {
1281 kvm_setup_guest_memory(new_block->host, new_block->length);
1282 }
6f0437e8 1283
94a6b54f
PB
1284 return new_block->offset;
1285}
e9a1ab19 1286
0b183fc8 1287#ifdef __linux__
e1c57ab8 1288ram_addr_t qemu_ram_alloc_from_file(ram_addr_t size, MemoryRegion *mr,
7f56e740
PB
1289 const char *mem_path,
1290 Error **errp)
e1c57ab8
PB
1291{
1292 RAMBlock *new_block;
1293
1294 if (xen_enabled()) {
7f56e740
PB
1295 error_setg(errp, "-mem-path not supported with Xen");
1296 return -1;
e1c57ab8
PB
1297 }
1298
1299 if (phys_mem_alloc != qemu_anon_ram_alloc) {
1300 /*
1301 * file_ram_alloc() needs to allocate just like
1302 * phys_mem_alloc, but we haven't bothered to provide
1303 * a hook there.
1304 */
7f56e740
PB
1305 error_setg(errp,
1306 "-mem-path not supported with this accelerator");
1307 return -1;
e1c57ab8
PB
1308 }
1309
1310 size = TARGET_PAGE_ALIGN(size);
1311 new_block = g_malloc0(sizeof(*new_block));
1312 new_block->mr = mr;
1313 new_block->length = size;
7f56e740
PB
1314 new_block->host = file_ram_alloc(new_block, size,
1315 mem_path, errp);
1316 if (!new_block->host) {
1317 g_free(new_block);
1318 return -1;
1319 }
1320
e1c57ab8
PB
1321 return ram_block_add(new_block);
1322}
0b183fc8 1323#endif
e1c57ab8
PB
1324
1325ram_addr_t qemu_ram_alloc_from_ptr(ram_addr_t size, void *host,
1326 MemoryRegion *mr)
1327{
1328 RAMBlock *new_block;
1329
1330 size = TARGET_PAGE_ALIGN(size);
1331 new_block = g_malloc0(sizeof(*new_block));
1332 new_block->mr = mr;
1333 new_block->length = size;
1334 new_block->fd = -1;
1335 new_block->host = host;
1336 if (host) {
7bd4f430 1337 new_block->flags |= RAM_PREALLOC;
e1c57ab8
PB
1338 }
1339 return ram_block_add(new_block);
1340}
1341
c5705a77 1342ram_addr_t qemu_ram_alloc(ram_addr_t size, MemoryRegion *mr)
6977dfe6 1343{
c5705a77 1344 return qemu_ram_alloc_from_ptr(size, NULL, mr);
6977dfe6
YT
1345}
1346
1f2e98b6
AW
1347void qemu_ram_free_from_ptr(ram_addr_t addr)
1348{
1349 RAMBlock *block;
1350
b2a8658e
UD
1351 /* This assumes the iothread lock is taken here too. */
1352 qemu_mutex_lock_ramlist();
a3161038 1353 QTAILQ_FOREACH(block, &ram_list.blocks, next) {
1f2e98b6 1354 if (addr == block->offset) {
a3161038 1355 QTAILQ_REMOVE(&ram_list.blocks, block, next);
0d6d3c87 1356 ram_list.mru_block = NULL;
f798b07f 1357 ram_list.version++;
7267c094 1358 g_free(block);
b2a8658e 1359 break;
1f2e98b6
AW
1360 }
1361 }
b2a8658e 1362 qemu_mutex_unlock_ramlist();
1f2e98b6
AW
1363}
1364
c227f099 1365void qemu_ram_free(ram_addr_t addr)
e9a1ab19 1366{
04b16653
AW
1367 RAMBlock *block;
1368
b2a8658e
UD
1369 /* This assumes the iothread lock is taken here too. */
1370 qemu_mutex_lock_ramlist();
a3161038 1371 QTAILQ_FOREACH(block, &ram_list.blocks, next) {
04b16653 1372 if (addr == block->offset) {
a3161038 1373 QTAILQ_REMOVE(&ram_list.blocks, block, next);
0d6d3c87 1374 ram_list.mru_block = NULL;
f798b07f 1375 ram_list.version++;
7bd4f430 1376 if (block->flags & RAM_PREALLOC) {
cd19cfa2 1377 ;
dfeaf2ab
MA
1378 } else if (xen_enabled()) {
1379 xen_invalidate_map_cache_entry(block->host);
089f3f76 1380#ifndef _WIN32
3435f395
MA
1381 } else if (block->fd >= 0) {
1382 munmap(block->host, block->length);
1383 close(block->fd);
089f3f76 1384#endif
04b16653 1385 } else {
dfeaf2ab 1386 qemu_anon_ram_free(block->host, block->length);
04b16653 1387 }
7267c094 1388 g_free(block);
b2a8658e 1389 break;
04b16653
AW
1390 }
1391 }
b2a8658e 1392 qemu_mutex_unlock_ramlist();
04b16653 1393
e9a1ab19
FB
1394}
1395
cd19cfa2
HY
1396#ifndef _WIN32
1397void qemu_ram_remap(ram_addr_t addr, ram_addr_t length)
1398{
1399 RAMBlock *block;
1400 ram_addr_t offset;
1401 int flags;
1402 void *area, *vaddr;
1403
a3161038 1404 QTAILQ_FOREACH(block, &ram_list.blocks, next) {
cd19cfa2
HY
1405 offset = addr - block->offset;
1406 if (offset < block->length) {
1407 vaddr = block->host + offset;
7bd4f430 1408 if (block->flags & RAM_PREALLOC) {
cd19cfa2 1409 ;
dfeaf2ab
MA
1410 } else if (xen_enabled()) {
1411 abort();
cd19cfa2
HY
1412 } else {
1413 flags = MAP_FIXED;
1414 munmap(vaddr, length);
3435f395 1415 if (block->fd >= 0) {
cd19cfa2 1416#ifdef MAP_POPULATE
3435f395
MA
1417 flags |= mem_prealloc ? MAP_POPULATE | MAP_SHARED :
1418 MAP_PRIVATE;
fd28aa13 1419#else
3435f395 1420 flags |= MAP_PRIVATE;
cd19cfa2 1421#endif
3435f395
MA
1422 area = mmap(vaddr, length, PROT_READ | PROT_WRITE,
1423 flags, block->fd, offset);
cd19cfa2 1424 } else {
2eb9fbaa
MA
1425 /*
1426 * Remap needs to match alloc. Accelerators that
1427 * set phys_mem_alloc never remap. If they did,
1428 * we'd need a remap hook here.
1429 */
1430 assert(phys_mem_alloc == qemu_anon_ram_alloc);
1431
cd19cfa2
HY
1432 flags |= MAP_PRIVATE | MAP_ANONYMOUS;
1433 area = mmap(vaddr, length, PROT_READ | PROT_WRITE,
1434 flags, -1, 0);
cd19cfa2
HY
1435 }
1436 if (area != vaddr) {
f15fbc4b
AP
1437 fprintf(stderr, "Could not remap addr: "
1438 RAM_ADDR_FMT "@" RAM_ADDR_FMT "\n",
cd19cfa2
HY
1439 length, addr);
1440 exit(1);
1441 }
8490fc78 1442 memory_try_enable_merging(vaddr, length);
ddb97f1d 1443 qemu_ram_setup_dump(vaddr, length);
cd19cfa2
HY
1444 }
1445 return;
1446 }
1447 }
1448}
1449#endif /* !_WIN32 */
1450
1b5ec234
PB
1451/* Return a host pointer to ram allocated with qemu_ram_alloc.
1452 With the exception of the softmmu code in this file, this should
1453 only be used for local memory (e.g. video ram) that the device owns,
1454 and knows it isn't going to access beyond the end of the block.
1455
1456 It should not be used for general purpose DMA.
1457 Use cpu_physical_memory_map/cpu_physical_memory_rw instead.
1458 */
1459void *qemu_get_ram_ptr(ram_addr_t addr)
1460{
1461 RAMBlock *block = qemu_get_ram_block(addr);
1462
0d6d3c87
PB
1463 if (xen_enabled()) {
1464 /* We need to check if the requested address is in the RAM
1465 * because we don't want to map the entire memory in QEMU.
1466 * In that case just map until the end of the page.
1467 */
1468 if (block->offset == 0) {
1469 return xen_map_cache(addr, 0, 0);
1470 } else if (block->host == NULL) {
1471 block->host =
1472 xen_map_cache(block->offset, block->length, 1);
1473 }
1474 }
1475 return block->host + (addr - block->offset);
dc828ca1
PB
1476}
1477
38bee5dc
SS
1478/* Return a host pointer to guest's ram. Similar to qemu_get_ram_ptr
1479 * but takes a size argument */
cb85f7ab 1480static void *qemu_ram_ptr_length(ram_addr_t addr, hwaddr *size)
38bee5dc 1481{
8ab934f9
SS
1482 if (*size == 0) {
1483 return NULL;
1484 }
868bb33f 1485 if (xen_enabled()) {
e41d7c69 1486 return xen_map_cache(addr, *size, 1);
868bb33f 1487 } else {
38bee5dc
SS
1488 RAMBlock *block;
1489
a3161038 1490 QTAILQ_FOREACH(block, &ram_list.blocks, next) {
38bee5dc
SS
1491 if (addr - block->offset < block->length) {
1492 if (addr - block->offset + *size > block->length)
1493 *size = block->length - addr + block->offset;
1494 return block->host + (addr - block->offset);
1495 }
1496 }
1497
1498 fprintf(stderr, "Bad ram offset %" PRIx64 "\n", (uint64_t)addr);
1499 abort();
38bee5dc
SS
1500 }
1501}
1502
7443b437
PB
1503/* Some of the softmmu routines need to translate from a host pointer
1504 (typically a TLB entry) back to a ram offset. */
1b5ec234 1505MemoryRegion *qemu_ram_addr_from_host(void *ptr, ram_addr_t *ram_addr)
5579c7f3 1506{
94a6b54f
PB
1507 RAMBlock *block;
1508 uint8_t *host = ptr;
1509
868bb33f 1510 if (xen_enabled()) {
e41d7c69 1511 *ram_addr = xen_ram_addr_from_mapcache(ptr);
1b5ec234 1512 return qemu_get_ram_block(*ram_addr)->mr;
712c2b41
SS
1513 }
1514
23887b79
PB
1515 block = ram_list.mru_block;
1516 if (block && block->host && host - block->host < block->length) {
1517 goto found;
1518 }
1519
a3161038 1520 QTAILQ_FOREACH(block, &ram_list.blocks, next) {
432d268c
JN
1521 /* This case append when the block is not mapped. */
1522 if (block->host == NULL) {
1523 continue;
1524 }
f471a17e 1525 if (host - block->host < block->length) {
23887b79 1526 goto found;
f471a17e 1527 }
94a6b54f 1528 }
432d268c 1529
1b5ec234 1530 return NULL;
23887b79
PB
1531
1532found:
1533 *ram_addr = block->offset + (host - block->host);
1b5ec234 1534 return block->mr;
e890261f 1535}
f471a17e 1536
a8170e5e 1537static void notdirty_mem_write(void *opaque, hwaddr ram_addr,
0e0df1e2 1538 uint64_t val, unsigned size)
9fa3e853 1539{
52159192 1540 if (!cpu_physical_memory_get_dirty_flag(ram_addr, DIRTY_MEMORY_CODE)) {
0e0df1e2 1541 tb_invalidate_phys_page_fast(ram_addr, size);
3a7d929e 1542 }
0e0df1e2
AK
1543 switch (size) {
1544 case 1:
1545 stb_p(qemu_get_ram_ptr(ram_addr), val);
1546 break;
1547 case 2:
1548 stw_p(qemu_get_ram_ptr(ram_addr), val);
1549 break;
1550 case 4:
1551 stl_p(qemu_get_ram_ptr(ram_addr), val);
1552 break;
1553 default:
1554 abort();
3a7d929e 1555 }
52159192
JQ
1556 cpu_physical_memory_set_dirty_flag(ram_addr, DIRTY_MEMORY_MIGRATION);
1557 cpu_physical_memory_set_dirty_flag(ram_addr, DIRTY_MEMORY_VGA);
f23db169
FB
1558 /* we remove the notdirty callback only if the code has been
1559 flushed */
a2cd8c85 1560 if (!cpu_physical_memory_is_clean(ram_addr)) {
4917cf44 1561 CPUArchState *env = current_cpu->env_ptr;
93afeade 1562 tlb_set_dirty(env, current_cpu->mem_io_vaddr);
4917cf44 1563 }
9fa3e853
FB
1564}
1565
b018ddf6
PB
1566static bool notdirty_mem_accepts(void *opaque, hwaddr addr,
1567 unsigned size, bool is_write)
1568{
1569 return is_write;
1570}
1571
0e0df1e2 1572static const MemoryRegionOps notdirty_mem_ops = {
0e0df1e2 1573 .write = notdirty_mem_write,
b018ddf6 1574 .valid.accepts = notdirty_mem_accepts,
0e0df1e2 1575 .endianness = DEVICE_NATIVE_ENDIAN,
1ccde1cb
FB
1576};
1577
0f459d16 1578/* Generate a debug exception if a watchpoint has been hit. */
b4051334 1579static void check_watchpoint(int offset, int len_mask, int flags)
0f459d16 1580{
93afeade
AF
1581 CPUState *cpu = current_cpu;
1582 CPUArchState *env = cpu->env_ptr;
06d55cc1 1583 target_ulong pc, cs_base;
0f459d16 1584 target_ulong vaddr;
a1d1bb31 1585 CPUWatchpoint *wp;
06d55cc1 1586 int cpu_flags;
0f459d16 1587
ff4700b0 1588 if (cpu->watchpoint_hit) {
06d55cc1
AL
1589 /* We re-entered the check after replacing the TB. Now raise
1590 * the debug interrupt so that is will trigger after the
1591 * current instruction. */
93afeade 1592 cpu_interrupt(cpu, CPU_INTERRUPT_DEBUG);
06d55cc1
AL
1593 return;
1594 }
93afeade 1595 vaddr = (cpu->mem_io_vaddr & TARGET_PAGE_MASK) + offset;
ff4700b0 1596 QTAILQ_FOREACH(wp, &cpu->watchpoints, entry) {
b4051334
AL
1597 if ((vaddr == (wp->vaddr & len_mask) ||
1598 (vaddr & wp->len_mask) == wp->vaddr) && (wp->flags & flags)) {
6e140f28 1599 wp->flags |= BP_WATCHPOINT_HIT;
ff4700b0
AF
1600 if (!cpu->watchpoint_hit) {
1601 cpu->watchpoint_hit = wp;
239c51a5 1602 tb_check_watchpoint(cpu);
6e140f28 1603 if (wp->flags & BP_STOP_BEFORE_ACCESS) {
27103424 1604 cpu->exception_index = EXCP_DEBUG;
5638d180 1605 cpu_loop_exit(cpu);
6e140f28
AL
1606 } else {
1607 cpu_get_tb_cpu_state(env, &pc, &cs_base, &cpu_flags);
648f034c 1608 tb_gen_code(cpu, pc, cs_base, cpu_flags, 1);
0ea8cb88 1609 cpu_resume_from_signal(cpu, NULL);
6e140f28 1610 }
06d55cc1 1611 }
6e140f28
AL
1612 } else {
1613 wp->flags &= ~BP_WATCHPOINT_HIT;
0f459d16
PB
1614 }
1615 }
1616}
1617
6658ffb8
PB
1618/* Watchpoint access routines. Watchpoints are inserted using TLB tricks,
1619 so these check for a hit then pass through to the normal out-of-line
1620 phys routines. */
a8170e5e 1621static uint64_t watch_mem_read(void *opaque, hwaddr addr,
1ec9b909 1622 unsigned size)
6658ffb8 1623{
1ec9b909
AK
1624 check_watchpoint(addr & ~TARGET_PAGE_MASK, ~(size - 1), BP_MEM_READ);
1625 switch (size) {
2c17449b 1626 case 1: return ldub_phys(&address_space_memory, addr);
41701aa4 1627 case 2: return lduw_phys(&address_space_memory, addr);
fdfba1a2 1628 case 4: return ldl_phys(&address_space_memory, addr);
1ec9b909
AK
1629 default: abort();
1630 }
6658ffb8
PB
1631}
1632
a8170e5e 1633static void watch_mem_write(void *opaque, hwaddr addr,
1ec9b909 1634 uint64_t val, unsigned size)
6658ffb8 1635{
1ec9b909
AK
1636 check_watchpoint(addr & ~TARGET_PAGE_MASK, ~(size - 1), BP_MEM_WRITE);
1637 switch (size) {
67364150 1638 case 1:
db3be60d 1639 stb_phys(&address_space_memory, addr, val);
67364150
MF
1640 break;
1641 case 2:
5ce5944d 1642 stw_phys(&address_space_memory, addr, val);
67364150
MF
1643 break;
1644 case 4:
ab1da857 1645 stl_phys(&address_space_memory, addr, val);
67364150 1646 break;
1ec9b909
AK
1647 default: abort();
1648 }
6658ffb8
PB
1649}
1650
1ec9b909
AK
1651static const MemoryRegionOps watch_mem_ops = {
1652 .read = watch_mem_read,
1653 .write = watch_mem_write,
1654 .endianness = DEVICE_NATIVE_ENDIAN,
6658ffb8 1655};
6658ffb8 1656
a8170e5e 1657static uint64_t subpage_read(void *opaque, hwaddr addr,
70c68e44 1658 unsigned len)
db7b5426 1659{
acc9d80b
JK
1660 subpage_t *subpage = opaque;
1661 uint8_t buf[4];
791af8c8 1662
db7b5426 1663#if defined(DEBUG_SUBPAGE)
016e9d62 1664 printf("%s: subpage %p len %u addr " TARGET_FMT_plx "\n", __func__,
acc9d80b 1665 subpage, len, addr);
db7b5426 1666#endif
acc9d80b
JK
1667 address_space_read(subpage->as, addr + subpage->base, buf, len);
1668 switch (len) {
1669 case 1:
1670 return ldub_p(buf);
1671 case 2:
1672 return lduw_p(buf);
1673 case 4:
1674 return ldl_p(buf);
1675 default:
1676 abort();
1677 }
db7b5426
BS
1678}
1679
a8170e5e 1680static void subpage_write(void *opaque, hwaddr addr,
70c68e44 1681 uint64_t value, unsigned len)
db7b5426 1682{
acc9d80b
JK
1683 subpage_t *subpage = opaque;
1684 uint8_t buf[4];
1685
db7b5426 1686#if defined(DEBUG_SUBPAGE)
016e9d62 1687 printf("%s: subpage %p len %u addr " TARGET_FMT_plx
acc9d80b
JK
1688 " value %"PRIx64"\n",
1689 __func__, subpage, len, addr, value);
db7b5426 1690#endif
acc9d80b
JK
1691 switch (len) {
1692 case 1:
1693 stb_p(buf, value);
1694 break;
1695 case 2:
1696 stw_p(buf, value);
1697 break;
1698 case 4:
1699 stl_p(buf, value);
1700 break;
1701 default:
1702 abort();
1703 }
1704 address_space_write(subpage->as, addr + subpage->base, buf, len);
db7b5426
BS
1705}
1706
c353e4cc 1707static bool subpage_accepts(void *opaque, hwaddr addr,
016e9d62 1708 unsigned len, bool is_write)
c353e4cc 1709{
acc9d80b 1710 subpage_t *subpage = opaque;
c353e4cc 1711#if defined(DEBUG_SUBPAGE)
016e9d62 1712 printf("%s: subpage %p %c len %u addr " TARGET_FMT_plx "\n",
acc9d80b 1713 __func__, subpage, is_write ? 'w' : 'r', len, addr);
c353e4cc
PB
1714#endif
1715
acc9d80b 1716 return address_space_access_valid(subpage->as, addr + subpage->base,
016e9d62 1717 len, is_write);
c353e4cc
PB
1718}
1719
70c68e44
AK
1720static const MemoryRegionOps subpage_ops = {
1721 .read = subpage_read,
1722 .write = subpage_write,
c353e4cc 1723 .valid.accepts = subpage_accepts,
70c68e44 1724 .endianness = DEVICE_NATIVE_ENDIAN,
db7b5426
BS
1725};
1726
c227f099 1727static int subpage_register (subpage_t *mmio, uint32_t start, uint32_t end,
5312bd8b 1728 uint16_t section)
db7b5426
BS
1729{
1730 int idx, eidx;
1731
1732 if (start >= TARGET_PAGE_SIZE || end >= TARGET_PAGE_SIZE)
1733 return -1;
1734 idx = SUBPAGE_IDX(start);
1735 eidx = SUBPAGE_IDX(end);
1736#if defined(DEBUG_SUBPAGE)
016e9d62
AK
1737 printf("%s: %p start %08x end %08x idx %08x eidx %08x section %d\n",
1738 __func__, mmio, start, end, idx, eidx, section);
db7b5426 1739#endif
db7b5426 1740 for (; idx <= eidx; idx++) {
5312bd8b 1741 mmio->sub_section[idx] = section;
db7b5426
BS
1742 }
1743
1744 return 0;
1745}
1746
acc9d80b 1747static subpage_t *subpage_init(AddressSpace *as, hwaddr base)
db7b5426 1748{
c227f099 1749 subpage_t *mmio;
db7b5426 1750
7267c094 1751 mmio = g_malloc0(sizeof(subpage_t));
1eec614b 1752
acc9d80b 1753 mmio->as = as;
1eec614b 1754 mmio->base = base;
2c9b15ca 1755 memory_region_init_io(&mmio->iomem, NULL, &subpage_ops, mmio,
70c68e44 1756 "subpage", TARGET_PAGE_SIZE);
b3b00c78 1757 mmio->iomem.subpage = true;
db7b5426 1758#if defined(DEBUG_SUBPAGE)
016e9d62
AK
1759 printf("%s: %p base " TARGET_FMT_plx " len %08x\n", __func__,
1760 mmio, base, TARGET_PAGE_SIZE);
db7b5426 1761#endif
b41aac4f 1762 subpage_register(mmio, 0, TARGET_PAGE_SIZE-1, PHYS_SECTION_UNASSIGNED);
db7b5426
BS
1763
1764 return mmio;
1765}
1766
a656e22f
PC
1767static uint16_t dummy_section(PhysPageMap *map, AddressSpace *as,
1768 MemoryRegion *mr)
5312bd8b 1769{
a656e22f 1770 assert(as);
5312bd8b 1771 MemoryRegionSection section = {
a656e22f 1772 .address_space = as,
5312bd8b
AK
1773 .mr = mr,
1774 .offset_within_address_space = 0,
1775 .offset_within_region = 0,
052e87b0 1776 .size = int128_2_64(),
5312bd8b
AK
1777 };
1778
53cb28cb 1779 return phys_section_add(map, &section);
5312bd8b
AK
1780}
1781
77717094 1782MemoryRegion *iotlb_to_region(AddressSpace *as, hwaddr index)
aa102231 1783{
77717094 1784 return as->dispatch->map.sections[index & ~TARGET_PAGE_MASK].mr;
aa102231
AK
1785}
1786
e9179ce1
AK
1787static void io_mem_init(void)
1788{
2c9b15ca
PB
1789 memory_region_init_io(&io_mem_rom, NULL, &unassigned_mem_ops, NULL, "rom", UINT64_MAX);
1790 memory_region_init_io(&io_mem_unassigned, NULL, &unassigned_mem_ops, NULL,
0e0df1e2 1791 "unassigned", UINT64_MAX);
2c9b15ca 1792 memory_region_init_io(&io_mem_notdirty, NULL, &notdirty_mem_ops, NULL,
0e0df1e2 1793 "notdirty", UINT64_MAX);
2c9b15ca 1794 memory_region_init_io(&io_mem_watch, NULL, &watch_mem_ops, NULL,
1ec9b909 1795 "watch", UINT64_MAX);
e9179ce1
AK
1796}
1797
ac1970fb 1798static void mem_begin(MemoryListener *listener)
00752703
PB
1799{
1800 AddressSpace *as = container_of(listener, AddressSpace, dispatch_listener);
53cb28cb
MA
1801 AddressSpaceDispatch *d = g_new0(AddressSpaceDispatch, 1);
1802 uint16_t n;
1803
a656e22f 1804 n = dummy_section(&d->map, as, &io_mem_unassigned);
53cb28cb 1805 assert(n == PHYS_SECTION_UNASSIGNED);
a656e22f 1806 n = dummy_section(&d->map, as, &io_mem_notdirty);
53cb28cb 1807 assert(n == PHYS_SECTION_NOTDIRTY);
a656e22f 1808 n = dummy_section(&d->map, as, &io_mem_rom);
53cb28cb 1809 assert(n == PHYS_SECTION_ROM);
a656e22f 1810 n = dummy_section(&d->map, as, &io_mem_watch);
53cb28cb 1811 assert(n == PHYS_SECTION_WATCH);
00752703 1812
9736e55b 1813 d->phys_map = (PhysPageEntry) { .ptr = PHYS_MAP_NODE_NIL, .skip = 1 };
00752703
PB
1814 d->as = as;
1815 as->next_dispatch = d;
1816}
1817
1818static void mem_commit(MemoryListener *listener)
ac1970fb 1819{
89ae337a 1820 AddressSpace *as = container_of(listener, AddressSpace, dispatch_listener);
0475d94f
PB
1821 AddressSpaceDispatch *cur = as->dispatch;
1822 AddressSpaceDispatch *next = as->next_dispatch;
1823
53cb28cb 1824 phys_page_compact_all(next, next->map.nodes_nb);
b35ba30f 1825
0475d94f 1826 as->dispatch = next;
b41aac4f 1827
53cb28cb
MA
1828 if (cur) {
1829 phys_sections_free(&cur->map);
1830 g_free(cur);
1831 }
9affd6fc
PB
1832}
1833
1d71148e 1834static void tcg_commit(MemoryListener *listener)
50c1e149 1835{
182735ef 1836 CPUState *cpu;
117712c3
AK
1837
1838 /* since each CPU stores ram addresses in its TLB cache, we must
1839 reset the modified entries */
1840 /* XXX: slow ! */
bdc44640 1841 CPU_FOREACH(cpu) {
33bde2e1
EI
1842 /* FIXME: Disentangle the cpu.h circular files deps so we can
1843 directly get the right CPU from listener. */
1844 if (cpu->tcg_as_listener != listener) {
1845 continue;
1846 }
00c8cb0a 1847 tlb_flush(cpu, 1);
117712c3 1848 }
50c1e149
AK
1849}
1850
93632747
AK
1851static void core_log_global_start(MemoryListener *listener)
1852{
981fdf23 1853 cpu_physical_memory_set_dirty_tracking(true);
93632747
AK
1854}
1855
1856static void core_log_global_stop(MemoryListener *listener)
1857{
981fdf23 1858 cpu_physical_memory_set_dirty_tracking(false);
93632747
AK
1859}
1860
93632747 1861static MemoryListener core_memory_listener = {
93632747
AK
1862 .log_global_start = core_log_global_start,
1863 .log_global_stop = core_log_global_stop,
ac1970fb 1864 .priority = 1,
93632747
AK
1865};
1866
ac1970fb
AK
1867void address_space_init_dispatch(AddressSpace *as)
1868{
00752703 1869 as->dispatch = NULL;
89ae337a 1870 as->dispatch_listener = (MemoryListener) {
ac1970fb 1871 .begin = mem_begin,
00752703 1872 .commit = mem_commit,
ac1970fb
AK
1873 .region_add = mem_add,
1874 .region_nop = mem_add,
1875 .priority = 0,
1876 };
89ae337a 1877 memory_listener_register(&as->dispatch_listener, as);
ac1970fb
AK
1878}
1879
83f3c251
AK
1880void address_space_destroy_dispatch(AddressSpace *as)
1881{
1882 AddressSpaceDispatch *d = as->dispatch;
1883
89ae337a 1884 memory_listener_unregister(&as->dispatch_listener);
83f3c251
AK
1885 g_free(d);
1886 as->dispatch = NULL;
1887}
1888
62152b8a
AK
1889static void memory_map_init(void)
1890{
7267c094 1891 system_memory = g_malloc(sizeof(*system_memory));
03f49957 1892
57271d63 1893 memory_region_init(system_memory, NULL, "system", UINT64_MAX);
7dca8043 1894 address_space_init(&address_space_memory, system_memory, "memory");
309cb471 1895
7267c094 1896 system_io = g_malloc(sizeof(*system_io));
3bb28b72
JK
1897 memory_region_init_io(system_io, NULL, &unassigned_io_ops, NULL, "io",
1898 65536);
7dca8043 1899 address_space_init(&address_space_io, system_io, "I/O");
93632747 1900
f6790af6 1901 memory_listener_register(&core_memory_listener, &address_space_memory);
62152b8a
AK
1902}
1903
1904MemoryRegion *get_system_memory(void)
1905{
1906 return system_memory;
1907}
1908
309cb471
AK
1909MemoryRegion *get_system_io(void)
1910{
1911 return system_io;
1912}
1913
e2eef170
PB
1914#endif /* !defined(CONFIG_USER_ONLY) */
1915
13eb76e0
FB
1916/* physical memory access (slow version, mainly for debug) */
1917#if defined(CONFIG_USER_ONLY)
f17ec444 1918int cpu_memory_rw_debug(CPUState *cpu, target_ulong addr,
a68fe89c 1919 uint8_t *buf, int len, int is_write)
13eb76e0
FB
1920{
1921 int l, flags;
1922 target_ulong page;
53a5960a 1923 void * p;
13eb76e0
FB
1924
1925 while (len > 0) {
1926 page = addr & TARGET_PAGE_MASK;
1927 l = (page + TARGET_PAGE_SIZE) - addr;
1928 if (l > len)
1929 l = len;
1930 flags = page_get_flags(page);
1931 if (!(flags & PAGE_VALID))
a68fe89c 1932 return -1;
13eb76e0
FB
1933 if (is_write) {
1934 if (!(flags & PAGE_WRITE))
a68fe89c 1935 return -1;
579a97f7 1936 /* XXX: this code should not depend on lock_user */
72fb7daa 1937 if (!(p = lock_user(VERIFY_WRITE, addr, l, 0)))
a68fe89c 1938 return -1;
72fb7daa
AJ
1939 memcpy(p, buf, l);
1940 unlock_user(p, addr, l);
13eb76e0
FB
1941 } else {
1942 if (!(flags & PAGE_READ))
a68fe89c 1943 return -1;
579a97f7 1944 /* XXX: this code should not depend on lock_user */
72fb7daa 1945 if (!(p = lock_user(VERIFY_READ, addr, l, 1)))
a68fe89c 1946 return -1;
72fb7daa 1947 memcpy(buf, p, l);
5b257578 1948 unlock_user(p, addr, 0);
13eb76e0
FB
1949 }
1950 len -= l;
1951 buf += l;
1952 addr += l;
1953 }
a68fe89c 1954 return 0;
13eb76e0 1955}
8df1cd07 1956
13eb76e0 1957#else
51d7a9eb 1958
a8170e5e
AK
1959static void invalidate_and_set_dirty(hwaddr addr,
1960 hwaddr length)
51d7a9eb 1961{
a2cd8c85 1962 if (cpu_physical_memory_is_clean(addr)) {
51d7a9eb
AP
1963 /* invalidate code */
1964 tb_invalidate_phys_page_range(addr, addr + length, 0);
1965 /* set dirty bit */
52159192
JQ
1966 cpu_physical_memory_set_dirty_flag(addr, DIRTY_MEMORY_VGA);
1967 cpu_physical_memory_set_dirty_flag(addr, DIRTY_MEMORY_MIGRATION);
51d7a9eb 1968 }
e226939d 1969 xen_modified_memory(addr, length);
51d7a9eb
AP
1970}
1971
23326164 1972static int memory_access_size(MemoryRegion *mr, unsigned l, hwaddr addr)
82f2563f 1973{
e1622f4b 1974 unsigned access_size_max = mr->ops->valid.max_access_size;
23326164
RH
1975
1976 /* Regions are assumed to support 1-4 byte accesses unless
1977 otherwise specified. */
23326164
RH
1978 if (access_size_max == 0) {
1979 access_size_max = 4;
1980 }
1981
1982 /* Bound the maximum access by the alignment of the address. */
1983 if (!mr->ops->impl.unaligned) {
1984 unsigned align_size_max = addr & -addr;
1985 if (align_size_max != 0 && align_size_max < access_size_max) {
1986 access_size_max = align_size_max;
1987 }
82f2563f 1988 }
23326164
RH
1989
1990 /* Don't attempt accesses larger than the maximum. */
1991 if (l > access_size_max) {
1992 l = access_size_max;
82f2563f 1993 }
098178f2
PB
1994 if (l & (l - 1)) {
1995 l = 1 << (qemu_fls(l) - 1);
1996 }
23326164
RH
1997
1998 return l;
82f2563f
PB
1999}
2000
fd8aaa76 2001bool address_space_rw(AddressSpace *as, hwaddr addr, uint8_t *buf,
ac1970fb 2002 int len, bool is_write)
13eb76e0 2003{
149f54b5 2004 hwaddr l;
13eb76e0 2005 uint8_t *ptr;
791af8c8 2006 uint64_t val;
149f54b5 2007 hwaddr addr1;
5c8a00ce 2008 MemoryRegion *mr;
fd8aaa76 2009 bool error = false;
3b46e624 2010
13eb76e0 2011 while (len > 0) {
149f54b5 2012 l = len;
5c8a00ce 2013 mr = address_space_translate(as, addr, &addr1, &l, is_write);
3b46e624 2014
13eb76e0 2015 if (is_write) {
5c8a00ce
PB
2016 if (!memory_access_is_direct(mr, is_write)) {
2017 l = memory_access_size(mr, l, addr1);
4917cf44 2018 /* XXX: could force current_cpu to NULL to avoid
6a00d601 2019 potential bugs */
23326164
RH
2020 switch (l) {
2021 case 8:
2022 /* 64 bit write access */
2023 val = ldq_p(buf);
2024 error |= io_mem_write(mr, addr1, val, 8);
2025 break;
2026 case 4:
1c213d19 2027 /* 32 bit write access */
c27004ec 2028 val = ldl_p(buf);
5c8a00ce 2029 error |= io_mem_write(mr, addr1, val, 4);
23326164
RH
2030 break;
2031 case 2:
1c213d19 2032 /* 16 bit write access */
c27004ec 2033 val = lduw_p(buf);
5c8a00ce 2034 error |= io_mem_write(mr, addr1, val, 2);
23326164
RH
2035 break;
2036 case 1:
1c213d19 2037 /* 8 bit write access */
c27004ec 2038 val = ldub_p(buf);
5c8a00ce 2039 error |= io_mem_write(mr, addr1, val, 1);
23326164
RH
2040 break;
2041 default:
2042 abort();
13eb76e0 2043 }
2bbfa05d 2044 } else {
5c8a00ce 2045 addr1 += memory_region_get_ram_addr(mr);
13eb76e0 2046 /* RAM case */
5579c7f3 2047 ptr = qemu_get_ram_ptr(addr1);
13eb76e0 2048 memcpy(ptr, buf, l);
51d7a9eb 2049 invalidate_and_set_dirty(addr1, l);
13eb76e0
FB
2050 }
2051 } else {
5c8a00ce 2052 if (!memory_access_is_direct(mr, is_write)) {
13eb76e0 2053 /* I/O case */
5c8a00ce 2054 l = memory_access_size(mr, l, addr1);
23326164
RH
2055 switch (l) {
2056 case 8:
2057 /* 64 bit read access */
2058 error |= io_mem_read(mr, addr1, &val, 8);
2059 stq_p(buf, val);
2060 break;
2061 case 4:
13eb76e0 2062 /* 32 bit read access */
5c8a00ce 2063 error |= io_mem_read(mr, addr1, &val, 4);
c27004ec 2064 stl_p(buf, val);
23326164
RH
2065 break;
2066 case 2:
13eb76e0 2067 /* 16 bit read access */
5c8a00ce 2068 error |= io_mem_read(mr, addr1, &val, 2);
c27004ec 2069 stw_p(buf, val);
23326164
RH
2070 break;
2071 case 1:
1c213d19 2072 /* 8 bit read access */
5c8a00ce 2073 error |= io_mem_read(mr, addr1, &val, 1);
c27004ec 2074 stb_p(buf, val);
23326164
RH
2075 break;
2076 default:
2077 abort();
13eb76e0
FB
2078 }
2079 } else {
2080 /* RAM case */
5c8a00ce 2081 ptr = qemu_get_ram_ptr(mr->ram_addr + addr1);
f3705d53 2082 memcpy(buf, ptr, l);
13eb76e0
FB
2083 }
2084 }
2085 len -= l;
2086 buf += l;
2087 addr += l;
2088 }
fd8aaa76
PB
2089
2090 return error;
13eb76e0 2091}
8df1cd07 2092
fd8aaa76 2093bool address_space_write(AddressSpace *as, hwaddr addr,
ac1970fb
AK
2094 const uint8_t *buf, int len)
2095{
fd8aaa76 2096 return address_space_rw(as, addr, (uint8_t *)buf, len, true);
ac1970fb
AK
2097}
2098
fd8aaa76 2099bool address_space_read(AddressSpace *as, hwaddr addr, uint8_t *buf, int len)
ac1970fb 2100{
fd8aaa76 2101 return address_space_rw(as, addr, buf, len, false);
ac1970fb
AK
2102}
2103
2104
a8170e5e 2105void cpu_physical_memory_rw(hwaddr addr, uint8_t *buf,
ac1970fb
AK
2106 int len, int is_write)
2107{
fd8aaa76 2108 address_space_rw(&address_space_memory, addr, buf, len, is_write);
ac1970fb
AK
2109}
2110
582b55a9
AG
2111enum write_rom_type {
2112 WRITE_DATA,
2113 FLUSH_CACHE,
2114};
2115
2a221651 2116static inline void cpu_physical_memory_write_rom_internal(AddressSpace *as,
582b55a9 2117 hwaddr addr, const uint8_t *buf, int len, enum write_rom_type type)
d0ecd2aa 2118{
149f54b5 2119 hwaddr l;
d0ecd2aa 2120 uint8_t *ptr;
149f54b5 2121 hwaddr addr1;
5c8a00ce 2122 MemoryRegion *mr;
3b46e624 2123
d0ecd2aa 2124 while (len > 0) {
149f54b5 2125 l = len;
2a221651 2126 mr = address_space_translate(as, addr, &addr1, &l, true);
3b46e624 2127
5c8a00ce
PB
2128 if (!(memory_region_is_ram(mr) ||
2129 memory_region_is_romd(mr))) {
d0ecd2aa
FB
2130 /* do nothing */
2131 } else {
5c8a00ce 2132 addr1 += memory_region_get_ram_addr(mr);
d0ecd2aa 2133 /* ROM/RAM case */
5579c7f3 2134 ptr = qemu_get_ram_ptr(addr1);
582b55a9
AG
2135 switch (type) {
2136 case WRITE_DATA:
2137 memcpy(ptr, buf, l);
2138 invalidate_and_set_dirty(addr1, l);
2139 break;
2140 case FLUSH_CACHE:
2141 flush_icache_range((uintptr_t)ptr, (uintptr_t)ptr + l);
2142 break;
2143 }
d0ecd2aa
FB
2144 }
2145 len -= l;
2146 buf += l;
2147 addr += l;
2148 }
2149}
2150
582b55a9 2151/* used for ROM loading : can write in RAM and ROM */
2a221651 2152void cpu_physical_memory_write_rom(AddressSpace *as, hwaddr addr,
582b55a9
AG
2153 const uint8_t *buf, int len)
2154{
2a221651 2155 cpu_physical_memory_write_rom_internal(as, addr, buf, len, WRITE_DATA);
582b55a9
AG
2156}
2157
2158void cpu_flush_icache_range(hwaddr start, int len)
2159{
2160 /*
2161 * This function should do the same thing as an icache flush that was
2162 * triggered from within the guest. For TCG we are always cache coherent,
2163 * so there is no need to flush anything. For KVM / Xen we need to flush
2164 * the host's instruction cache at least.
2165 */
2166 if (tcg_enabled()) {
2167 return;
2168 }
2169
2a221651
EI
2170 cpu_physical_memory_write_rom_internal(&address_space_memory,
2171 start, NULL, len, FLUSH_CACHE);
582b55a9
AG
2172}
2173
6d16c2f8 2174typedef struct {
d3e71559 2175 MemoryRegion *mr;
6d16c2f8 2176 void *buffer;
a8170e5e
AK
2177 hwaddr addr;
2178 hwaddr len;
6d16c2f8
AL
2179} BounceBuffer;
2180
2181static BounceBuffer bounce;
2182
ba223c29
AL
2183typedef struct MapClient {
2184 void *opaque;
2185 void (*callback)(void *opaque);
72cf2d4f 2186 QLIST_ENTRY(MapClient) link;
ba223c29
AL
2187} MapClient;
2188
72cf2d4f
BS
2189static QLIST_HEAD(map_client_list, MapClient) map_client_list
2190 = QLIST_HEAD_INITIALIZER(map_client_list);
ba223c29
AL
2191
2192void *cpu_register_map_client(void *opaque, void (*callback)(void *opaque))
2193{
7267c094 2194 MapClient *client = g_malloc(sizeof(*client));
ba223c29
AL
2195
2196 client->opaque = opaque;
2197 client->callback = callback;
72cf2d4f 2198 QLIST_INSERT_HEAD(&map_client_list, client, link);
ba223c29
AL
2199 return client;
2200}
2201
8b9c99d9 2202static void cpu_unregister_map_client(void *_client)
ba223c29
AL
2203{
2204 MapClient *client = (MapClient *)_client;
2205
72cf2d4f 2206 QLIST_REMOVE(client, link);
7267c094 2207 g_free(client);
ba223c29
AL
2208}
2209
2210static void cpu_notify_map_clients(void)
2211{
2212 MapClient *client;
2213
72cf2d4f
BS
2214 while (!QLIST_EMPTY(&map_client_list)) {
2215 client = QLIST_FIRST(&map_client_list);
ba223c29 2216 client->callback(client->opaque);
34d5e948 2217 cpu_unregister_map_client(client);
ba223c29
AL
2218 }
2219}
2220
51644ab7
PB
2221bool address_space_access_valid(AddressSpace *as, hwaddr addr, int len, bool is_write)
2222{
5c8a00ce 2223 MemoryRegion *mr;
51644ab7
PB
2224 hwaddr l, xlat;
2225
2226 while (len > 0) {
2227 l = len;
5c8a00ce
PB
2228 mr = address_space_translate(as, addr, &xlat, &l, is_write);
2229 if (!memory_access_is_direct(mr, is_write)) {
2230 l = memory_access_size(mr, l, addr);
2231 if (!memory_region_access_valid(mr, xlat, l, is_write)) {
51644ab7
PB
2232 return false;
2233 }
2234 }
2235
2236 len -= l;
2237 addr += l;
2238 }
2239 return true;
2240}
2241
6d16c2f8
AL
2242/* Map a physical memory region into a host virtual address.
2243 * May map a subset of the requested range, given by and returned in *plen.
2244 * May return NULL if resources needed to perform the mapping are exhausted.
2245 * Use only for reads OR writes - not for read-modify-write operations.
ba223c29
AL
2246 * Use cpu_register_map_client() to know when retrying the map operation is
2247 * likely to succeed.
6d16c2f8 2248 */
ac1970fb 2249void *address_space_map(AddressSpace *as,
a8170e5e
AK
2250 hwaddr addr,
2251 hwaddr *plen,
ac1970fb 2252 bool is_write)
6d16c2f8 2253{
a8170e5e 2254 hwaddr len = *plen;
e3127ae0
PB
2255 hwaddr done = 0;
2256 hwaddr l, xlat, base;
2257 MemoryRegion *mr, *this_mr;
2258 ram_addr_t raddr;
6d16c2f8 2259
e3127ae0
PB
2260 if (len == 0) {
2261 return NULL;
2262 }
38bee5dc 2263
e3127ae0
PB
2264 l = len;
2265 mr = address_space_translate(as, addr, &xlat, &l, is_write);
2266 if (!memory_access_is_direct(mr, is_write)) {
2267 if (bounce.buffer) {
2268 return NULL;
6d16c2f8 2269 }
e85d9db5
KW
2270 /* Avoid unbounded allocations */
2271 l = MIN(l, TARGET_PAGE_SIZE);
2272 bounce.buffer = qemu_memalign(TARGET_PAGE_SIZE, l);
e3127ae0
PB
2273 bounce.addr = addr;
2274 bounce.len = l;
d3e71559
PB
2275
2276 memory_region_ref(mr);
2277 bounce.mr = mr;
e3127ae0
PB
2278 if (!is_write) {
2279 address_space_read(as, addr, bounce.buffer, l);
8ab934f9 2280 }
6d16c2f8 2281
e3127ae0
PB
2282 *plen = l;
2283 return bounce.buffer;
2284 }
2285
2286 base = xlat;
2287 raddr = memory_region_get_ram_addr(mr);
2288
2289 for (;;) {
6d16c2f8
AL
2290 len -= l;
2291 addr += l;
e3127ae0
PB
2292 done += l;
2293 if (len == 0) {
2294 break;
2295 }
2296
2297 l = len;
2298 this_mr = address_space_translate(as, addr, &xlat, &l, is_write);
2299 if (this_mr != mr || xlat != base + done) {
2300 break;
2301 }
6d16c2f8 2302 }
e3127ae0 2303
d3e71559 2304 memory_region_ref(mr);
e3127ae0
PB
2305 *plen = done;
2306 return qemu_ram_ptr_length(raddr + base, plen);
6d16c2f8
AL
2307}
2308
ac1970fb 2309/* Unmaps a memory region previously mapped by address_space_map().
6d16c2f8
AL
2310 * Will also mark the memory as dirty if is_write == 1. access_len gives
2311 * the amount of memory that was actually read or written by the caller.
2312 */
a8170e5e
AK
2313void address_space_unmap(AddressSpace *as, void *buffer, hwaddr len,
2314 int is_write, hwaddr access_len)
6d16c2f8
AL
2315{
2316 if (buffer != bounce.buffer) {
d3e71559
PB
2317 MemoryRegion *mr;
2318 ram_addr_t addr1;
2319
2320 mr = qemu_ram_addr_from_host(buffer, &addr1);
2321 assert(mr != NULL);
6d16c2f8 2322 if (is_write) {
6d16c2f8
AL
2323 while (access_len) {
2324 unsigned l;
2325 l = TARGET_PAGE_SIZE;
2326 if (l > access_len)
2327 l = access_len;
51d7a9eb 2328 invalidate_and_set_dirty(addr1, l);
6d16c2f8
AL
2329 addr1 += l;
2330 access_len -= l;
2331 }
2332 }
868bb33f 2333 if (xen_enabled()) {
e41d7c69 2334 xen_invalidate_map_cache_entry(buffer);
050a0ddf 2335 }
d3e71559 2336 memory_region_unref(mr);
6d16c2f8
AL
2337 return;
2338 }
2339 if (is_write) {
ac1970fb 2340 address_space_write(as, bounce.addr, bounce.buffer, access_len);
6d16c2f8 2341 }
f8a83245 2342 qemu_vfree(bounce.buffer);
6d16c2f8 2343 bounce.buffer = NULL;
d3e71559 2344 memory_region_unref(bounce.mr);
ba223c29 2345 cpu_notify_map_clients();
6d16c2f8 2346}
d0ecd2aa 2347
a8170e5e
AK
2348void *cpu_physical_memory_map(hwaddr addr,
2349 hwaddr *plen,
ac1970fb
AK
2350 int is_write)
2351{
2352 return address_space_map(&address_space_memory, addr, plen, is_write);
2353}
2354
a8170e5e
AK
2355void cpu_physical_memory_unmap(void *buffer, hwaddr len,
2356 int is_write, hwaddr access_len)
ac1970fb
AK
2357{
2358 return address_space_unmap(&address_space_memory, buffer, len, is_write, access_len);
2359}
2360
8df1cd07 2361/* warning: addr must be aligned */
fdfba1a2 2362static inline uint32_t ldl_phys_internal(AddressSpace *as, hwaddr addr,
1e78bcc1 2363 enum device_endian endian)
8df1cd07 2364{
8df1cd07 2365 uint8_t *ptr;
791af8c8 2366 uint64_t val;
5c8a00ce 2367 MemoryRegion *mr;
149f54b5
PB
2368 hwaddr l = 4;
2369 hwaddr addr1;
8df1cd07 2370
fdfba1a2 2371 mr = address_space_translate(as, addr, &addr1, &l, false);
5c8a00ce 2372 if (l < 4 || !memory_access_is_direct(mr, false)) {
8df1cd07 2373 /* I/O case */
5c8a00ce 2374 io_mem_read(mr, addr1, &val, 4);
1e78bcc1
AG
2375#if defined(TARGET_WORDS_BIGENDIAN)
2376 if (endian == DEVICE_LITTLE_ENDIAN) {
2377 val = bswap32(val);
2378 }
2379#else
2380 if (endian == DEVICE_BIG_ENDIAN) {
2381 val = bswap32(val);
2382 }
2383#endif
8df1cd07
FB
2384 } else {
2385 /* RAM case */
5c8a00ce 2386 ptr = qemu_get_ram_ptr((memory_region_get_ram_addr(mr)
06ef3525 2387 & TARGET_PAGE_MASK)
149f54b5 2388 + addr1);
1e78bcc1
AG
2389 switch (endian) {
2390 case DEVICE_LITTLE_ENDIAN:
2391 val = ldl_le_p(ptr);
2392 break;
2393 case DEVICE_BIG_ENDIAN:
2394 val = ldl_be_p(ptr);
2395 break;
2396 default:
2397 val = ldl_p(ptr);
2398 break;
2399 }
8df1cd07
FB
2400 }
2401 return val;
2402}
2403
fdfba1a2 2404uint32_t ldl_phys(AddressSpace *as, hwaddr addr)
1e78bcc1 2405{
fdfba1a2 2406 return ldl_phys_internal(as, addr, DEVICE_NATIVE_ENDIAN);
1e78bcc1
AG
2407}
2408
fdfba1a2 2409uint32_t ldl_le_phys(AddressSpace *as, hwaddr addr)
1e78bcc1 2410{
fdfba1a2 2411 return ldl_phys_internal(as, addr, DEVICE_LITTLE_ENDIAN);
1e78bcc1
AG
2412}
2413
fdfba1a2 2414uint32_t ldl_be_phys(AddressSpace *as, hwaddr addr)
1e78bcc1 2415{
fdfba1a2 2416 return ldl_phys_internal(as, addr, DEVICE_BIG_ENDIAN);
1e78bcc1
AG
2417}
2418
84b7b8e7 2419/* warning: addr must be aligned */
2c17449b 2420static inline uint64_t ldq_phys_internal(AddressSpace *as, hwaddr addr,
1e78bcc1 2421 enum device_endian endian)
84b7b8e7 2422{
84b7b8e7
FB
2423 uint8_t *ptr;
2424 uint64_t val;
5c8a00ce 2425 MemoryRegion *mr;
149f54b5
PB
2426 hwaddr l = 8;
2427 hwaddr addr1;
84b7b8e7 2428
2c17449b 2429 mr = address_space_translate(as, addr, &addr1, &l,
5c8a00ce
PB
2430 false);
2431 if (l < 8 || !memory_access_is_direct(mr, false)) {
84b7b8e7 2432 /* I/O case */
5c8a00ce 2433 io_mem_read(mr, addr1, &val, 8);
968a5627
PB
2434#if defined(TARGET_WORDS_BIGENDIAN)
2435 if (endian == DEVICE_LITTLE_ENDIAN) {
2436 val = bswap64(val);
2437 }
2438#else
2439 if (endian == DEVICE_BIG_ENDIAN) {
2440 val = bswap64(val);
2441 }
84b7b8e7
FB
2442#endif
2443 } else {
2444 /* RAM case */
5c8a00ce 2445 ptr = qemu_get_ram_ptr((memory_region_get_ram_addr(mr)
06ef3525 2446 & TARGET_PAGE_MASK)
149f54b5 2447 + addr1);
1e78bcc1
AG
2448 switch (endian) {
2449 case DEVICE_LITTLE_ENDIAN:
2450 val = ldq_le_p(ptr);
2451 break;
2452 case DEVICE_BIG_ENDIAN:
2453 val = ldq_be_p(ptr);
2454 break;
2455 default:
2456 val = ldq_p(ptr);
2457 break;
2458 }
84b7b8e7
FB
2459 }
2460 return val;
2461}
2462
2c17449b 2463uint64_t ldq_phys(AddressSpace *as, hwaddr addr)
1e78bcc1 2464{
2c17449b 2465 return ldq_phys_internal(as, addr, DEVICE_NATIVE_ENDIAN);
1e78bcc1
AG
2466}
2467
2c17449b 2468uint64_t ldq_le_phys(AddressSpace *as, hwaddr addr)
1e78bcc1 2469{
2c17449b 2470 return ldq_phys_internal(as, addr, DEVICE_LITTLE_ENDIAN);
1e78bcc1
AG
2471}
2472
2c17449b 2473uint64_t ldq_be_phys(AddressSpace *as, hwaddr addr)
1e78bcc1 2474{
2c17449b 2475 return ldq_phys_internal(as, addr, DEVICE_BIG_ENDIAN);
1e78bcc1
AG
2476}
2477
aab33094 2478/* XXX: optimize */
2c17449b 2479uint32_t ldub_phys(AddressSpace *as, hwaddr addr)
aab33094
FB
2480{
2481 uint8_t val;
2c17449b 2482 address_space_rw(as, addr, &val, 1, 0);
aab33094
FB
2483 return val;
2484}
2485
733f0b02 2486/* warning: addr must be aligned */
41701aa4 2487static inline uint32_t lduw_phys_internal(AddressSpace *as, hwaddr addr,
1e78bcc1 2488 enum device_endian endian)
aab33094 2489{
733f0b02
MT
2490 uint8_t *ptr;
2491 uint64_t val;
5c8a00ce 2492 MemoryRegion *mr;
149f54b5
PB
2493 hwaddr l = 2;
2494 hwaddr addr1;
733f0b02 2495
41701aa4 2496 mr = address_space_translate(as, addr, &addr1, &l,
5c8a00ce
PB
2497 false);
2498 if (l < 2 || !memory_access_is_direct(mr, false)) {
733f0b02 2499 /* I/O case */
5c8a00ce 2500 io_mem_read(mr, addr1, &val, 2);
1e78bcc1
AG
2501#if defined(TARGET_WORDS_BIGENDIAN)
2502 if (endian == DEVICE_LITTLE_ENDIAN) {
2503 val = bswap16(val);
2504 }
2505#else
2506 if (endian == DEVICE_BIG_ENDIAN) {
2507 val = bswap16(val);
2508 }
2509#endif
733f0b02
MT
2510 } else {
2511 /* RAM case */
5c8a00ce 2512 ptr = qemu_get_ram_ptr((memory_region_get_ram_addr(mr)
06ef3525 2513 & TARGET_PAGE_MASK)
149f54b5 2514 + addr1);
1e78bcc1
AG
2515 switch (endian) {
2516 case DEVICE_LITTLE_ENDIAN:
2517 val = lduw_le_p(ptr);
2518 break;
2519 case DEVICE_BIG_ENDIAN:
2520 val = lduw_be_p(ptr);
2521 break;
2522 default:
2523 val = lduw_p(ptr);
2524 break;
2525 }
733f0b02
MT
2526 }
2527 return val;
aab33094
FB
2528}
2529
41701aa4 2530uint32_t lduw_phys(AddressSpace *as, hwaddr addr)
1e78bcc1 2531{
41701aa4 2532 return lduw_phys_internal(as, addr, DEVICE_NATIVE_ENDIAN);
1e78bcc1
AG
2533}
2534
41701aa4 2535uint32_t lduw_le_phys(AddressSpace *as, hwaddr addr)
1e78bcc1 2536{
41701aa4 2537 return lduw_phys_internal(as, addr, DEVICE_LITTLE_ENDIAN);
1e78bcc1
AG
2538}
2539
41701aa4 2540uint32_t lduw_be_phys(AddressSpace *as, hwaddr addr)
1e78bcc1 2541{
41701aa4 2542 return lduw_phys_internal(as, addr, DEVICE_BIG_ENDIAN);
1e78bcc1
AG
2543}
2544
8df1cd07
FB
2545/* warning: addr must be aligned. The ram page is not masked as dirty
2546 and the code inside is not invalidated. It is useful if the dirty
2547 bits are used to track modified PTEs */
2198a121 2548void stl_phys_notdirty(AddressSpace *as, hwaddr addr, uint32_t val)
8df1cd07 2549{
8df1cd07 2550 uint8_t *ptr;
5c8a00ce 2551 MemoryRegion *mr;
149f54b5
PB
2552 hwaddr l = 4;
2553 hwaddr addr1;
8df1cd07 2554
2198a121 2555 mr = address_space_translate(as, addr, &addr1, &l,
5c8a00ce
PB
2556 true);
2557 if (l < 4 || !memory_access_is_direct(mr, true)) {
2558 io_mem_write(mr, addr1, val, 4);
8df1cd07 2559 } else {
5c8a00ce 2560 addr1 += memory_region_get_ram_addr(mr) & TARGET_PAGE_MASK;
5579c7f3 2561 ptr = qemu_get_ram_ptr(addr1);
8df1cd07 2562 stl_p(ptr, val);
74576198
AL
2563
2564 if (unlikely(in_migration)) {
a2cd8c85 2565 if (cpu_physical_memory_is_clean(addr1)) {
74576198
AL
2566 /* invalidate code */
2567 tb_invalidate_phys_page_range(addr1, addr1 + 4, 0);
2568 /* set dirty bit */
52159192
JQ
2569 cpu_physical_memory_set_dirty_flag(addr1,
2570 DIRTY_MEMORY_MIGRATION);
2571 cpu_physical_memory_set_dirty_flag(addr1, DIRTY_MEMORY_VGA);
74576198
AL
2572 }
2573 }
8df1cd07
FB
2574 }
2575}
2576
2577/* warning: addr must be aligned */
ab1da857
EI
2578static inline void stl_phys_internal(AddressSpace *as,
2579 hwaddr addr, uint32_t val,
1e78bcc1 2580 enum device_endian endian)
8df1cd07 2581{
8df1cd07 2582 uint8_t *ptr;
5c8a00ce 2583 MemoryRegion *mr;
149f54b5
PB
2584 hwaddr l = 4;
2585 hwaddr addr1;
8df1cd07 2586
ab1da857 2587 mr = address_space_translate(as, addr, &addr1, &l,
5c8a00ce
PB
2588 true);
2589 if (l < 4 || !memory_access_is_direct(mr, true)) {
1e78bcc1
AG
2590#if defined(TARGET_WORDS_BIGENDIAN)
2591 if (endian == DEVICE_LITTLE_ENDIAN) {
2592 val = bswap32(val);
2593 }
2594#else
2595 if (endian == DEVICE_BIG_ENDIAN) {
2596 val = bswap32(val);
2597 }
2598#endif
5c8a00ce 2599 io_mem_write(mr, addr1, val, 4);
8df1cd07 2600 } else {
8df1cd07 2601 /* RAM case */
5c8a00ce 2602 addr1 += memory_region_get_ram_addr(mr) & TARGET_PAGE_MASK;
5579c7f3 2603 ptr = qemu_get_ram_ptr(addr1);
1e78bcc1
AG
2604 switch (endian) {
2605 case DEVICE_LITTLE_ENDIAN:
2606 stl_le_p(ptr, val);
2607 break;
2608 case DEVICE_BIG_ENDIAN:
2609 stl_be_p(ptr, val);
2610 break;
2611 default:
2612 stl_p(ptr, val);
2613 break;
2614 }
51d7a9eb 2615 invalidate_and_set_dirty(addr1, 4);
8df1cd07
FB
2616 }
2617}
2618
ab1da857 2619void stl_phys(AddressSpace *as, hwaddr addr, uint32_t val)
1e78bcc1 2620{
ab1da857 2621 stl_phys_internal(as, addr, val, DEVICE_NATIVE_ENDIAN);
1e78bcc1
AG
2622}
2623
ab1da857 2624void stl_le_phys(AddressSpace *as, hwaddr addr, uint32_t val)
1e78bcc1 2625{
ab1da857 2626 stl_phys_internal(as, addr, val, DEVICE_LITTLE_ENDIAN);
1e78bcc1
AG
2627}
2628
ab1da857 2629void stl_be_phys(AddressSpace *as, hwaddr addr, uint32_t val)
1e78bcc1 2630{
ab1da857 2631 stl_phys_internal(as, addr, val, DEVICE_BIG_ENDIAN);
1e78bcc1
AG
2632}
2633
aab33094 2634/* XXX: optimize */
db3be60d 2635void stb_phys(AddressSpace *as, hwaddr addr, uint32_t val)
aab33094
FB
2636{
2637 uint8_t v = val;
db3be60d 2638 address_space_rw(as, addr, &v, 1, 1);
aab33094
FB
2639}
2640
733f0b02 2641/* warning: addr must be aligned */
5ce5944d
EI
2642static inline void stw_phys_internal(AddressSpace *as,
2643 hwaddr addr, uint32_t val,
1e78bcc1 2644 enum device_endian endian)
aab33094 2645{
733f0b02 2646 uint8_t *ptr;
5c8a00ce 2647 MemoryRegion *mr;
149f54b5
PB
2648 hwaddr l = 2;
2649 hwaddr addr1;
733f0b02 2650
5ce5944d 2651 mr = address_space_translate(as, addr, &addr1, &l, true);
5c8a00ce 2652 if (l < 2 || !memory_access_is_direct(mr, true)) {
1e78bcc1
AG
2653#if defined(TARGET_WORDS_BIGENDIAN)
2654 if (endian == DEVICE_LITTLE_ENDIAN) {
2655 val = bswap16(val);
2656 }
2657#else
2658 if (endian == DEVICE_BIG_ENDIAN) {
2659 val = bswap16(val);
2660 }
2661#endif
5c8a00ce 2662 io_mem_write(mr, addr1, val, 2);
733f0b02 2663 } else {
733f0b02 2664 /* RAM case */
5c8a00ce 2665 addr1 += memory_region_get_ram_addr(mr) & TARGET_PAGE_MASK;
733f0b02 2666 ptr = qemu_get_ram_ptr(addr1);
1e78bcc1
AG
2667 switch (endian) {
2668 case DEVICE_LITTLE_ENDIAN:
2669 stw_le_p(ptr, val);
2670 break;
2671 case DEVICE_BIG_ENDIAN:
2672 stw_be_p(ptr, val);
2673 break;
2674 default:
2675 stw_p(ptr, val);
2676 break;
2677 }
51d7a9eb 2678 invalidate_and_set_dirty(addr1, 2);
733f0b02 2679 }
aab33094
FB
2680}
2681
5ce5944d 2682void stw_phys(AddressSpace *as, hwaddr addr, uint32_t val)
1e78bcc1 2683{
5ce5944d 2684 stw_phys_internal(as, addr, val, DEVICE_NATIVE_ENDIAN);
1e78bcc1
AG
2685}
2686
5ce5944d 2687void stw_le_phys(AddressSpace *as, hwaddr addr, uint32_t val)
1e78bcc1 2688{
5ce5944d 2689 stw_phys_internal(as, addr, val, DEVICE_LITTLE_ENDIAN);
1e78bcc1
AG
2690}
2691
5ce5944d 2692void stw_be_phys(AddressSpace *as, hwaddr addr, uint32_t val)
1e78bcc1 2693{
5ce5944d 2694 stw_phys_internal(as, addr, val, DEVICE_BIG_ENDIAN);
1e78bcc1
AG
2695}
2696
aab33094 2697/* XXX: optimize */
f606604f 2698void stq_phys(AddressSpace *as, hwaddr addr, uint64_t val)
aab33094
FB
2699{
2700 val = tswap64(val);
f606604f 2701 address_space_rw(as, addr, (void *) &val, 8, 1);
aab33094
FB
2702}
2703
f606604f 2704void stq_le_phys(AddressSpace *as, hwaddr addr, uint64_t val)
1e78bcc1
AG
2705{
2706 val = cpu_to_le64(val);
f606604f 2707 address_space_rw(as, addr, (void *) &val, 8, 1);
1e78bcc1
AG
2708}
2709
f606604f 2710void stq_be_phys(AddressSpace *as, hwaddr addr, uint64_t val)
1e78bcc1
AG
2711{
2712 val = cpu_to_be64(val);
f606604f 2713 address_space_rw(as, addr, (void *) &val, 8, 1);
1e78bcc1
AG
2714}
2715
5e2972fd 2716/* virtual memory access for debug (includes writing to ROM) */
f17ec444 2717int cpu_memory_rw_debug(CPUState *cpu, target_ulong addr,
b448f2f3 2718 uint8_t *buf, int len, int is_write)
13eb76e0
FB
2719{
2720 int l;
a8170e5e 2721 hwaddr phys_addr;
9b3c35e0 2722 target_ulong page;
13eb76e0
FB
2723
2724 while (len > 0) {
2725 page = addr & TARGET_PAGE_MASK;
f17ec444 2726 phys_addr = cpu_get_phys_page_debug(cpu, page);
13eb76e0
FB
2727 /* if no physical page mapped, return an error */
2728 if (phys_addr == -1)
2729 return -1;
2730 l = (page + TARGET_PAGE_SIZE) - addr;
2731 if (l > len)
2732 l = len;
5e2972fd 2733 phys_addr += (addr & ~TARGET_PAGE_MASK);
2e38847b
EI
2734 if (is_write) {
2735 cpu_physical_memory_write_rom(cpu->as, phys_addr, buf, l);
2736 } else {
2737 address_space_rw(cpu->as, phys_addr, buf, l, 0);
2738 }
13eb76e0
FB
2739 len -= l;
2740 buf += l;
2741 addr += l;
2742 }
2743 return 0;
2744}
a68fe89c 2745#endif
13eb76e0 2746
8e4a424b
BS
2747#if !defined(CONFIG_USER_ONLY)
2748
2749/*
2750 * A helper function for the _utterly broken_ virtio device model to find out if
2751 * it's running on a big endian machine. Don't do this at home kids!
2752 */
2753bool virtio_is_big_endian(void);
2754bool virtio_is_big_endian(void)
2755{
2756#if defined(TARGET_WORDS_BIGENDIAN)
2757 return true;
2758#else
2759 return false;
2760#endif
2761}
2762
2763#endif
2764
76f35538 2765#ifndef CONFIG_USER_ONLY
a8170e5e 2766bool cpu_physical_memory_is_io(hwaddr phys_addr)
76f35538 2767{
5c8a00ce 2768 MemoryRegion*mr;
149f54b5 2769 hwaddr l = 1;
76f35538 2770
5c8a00ce
PB
2771 mr = address_space_translate(&address_space_memory,
2772 phys_addr, &phys_addr, &l, false);
76f35538 2773
5c8a00ce
PB
2774 return !(memory_region_is_ram(mr) ||
2775 memory_region_is_romd(mr));
76f35538 2776}
bd2fa51f
MH
2777
2778void qemu_ram_foreach_block(RAMBlockIterFunc func, void *opaque)
2779{
2780 RAMBlock *block;
2781
2782 QTAILQ_FOREACH(block, &ram_list.blocks, next) {
2783 func(block->host, block->offset, block->length, opaque);
2784 }
2785}
ec3f8c99 2786#endif