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