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