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