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