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