2 * virtual page mapping and translated block handling
4 * Copyright (c) 2003 Fabrice Bellard
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.
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.
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/>.
23 #include <sys/types.h>
27 #include "qemu-common.h"
35 #include "qemu-timer.h"
37 #include "exec-memory.h"
38 #if defined(CONFIG_USER_ONLY)
40 #if defined(__FreeBSD__) || defined(__FreeBSD_kernel__)
41 #include <sys/param.h>
42 #if __FreeBSD_version >= 700104
43 #define HAVE_KINFO_GETVMMAP
44 #define sigqueue sigqueue_freebsd /* avoid redefinition */
47 #include <machine/profile.h>
55 #else /* !CONFIG_USER_ONLY */
56 #include "xen-mapcache.h"
62 #include "memory-internal.h"
64 //#define DEBUG_TB_INVALIDATE
66 //#define DEBUG_UNASSIGNED
68 /* make various TB consistency checks */
69 //#define DEBUG_TB_CHECK
71 //#define DEBUG_IOPORT
72 //#define DEBUG_SUBPAGE
74 #if !defined(CONFIG_USER_ONLY)
75 /* TB consistency checks only implemented for usermode emulation. */
79 #define SMC_BITMAP_USE_THRESHOLD 10
81 static TranslationBlock
*tbs
;
82 static int code_gen_max_blocks
;
83 TranslationBlock
*tb_phys_hash
[CODE_GEN_PHYS_HASH_SIZE
];
85 /* any access to the tbs or the page table must use this lock */
86 spinlock_t tb_lock
= SPIN_LOCK_UNLOCKED
;
88 uint8_t *code_gen_prologue
;
89 static uint8_t *code_gen_buffer
;
90 static size_t code_gen_buffer_size
;
91 /* threshold to flush the translated code buffer */
92 static size_t code_gen_buffer_max_size
;
93 static uint8_t *code_gen_ptr
;
95 #if !defined(CONFIG_USER_ONLY)
97 static int in_migration
;
99 RAMList ram_list
= { .blocks
= QLIST_HEAD_INITIALIZER(ram_list
.blocks
) };
101 static MemoryRegion
*system_memory
;
102 static MemoryRegion
*system_io
;
104 AddressSpace address_space_io
;
105 AddressSpace address_space_memory
;
107 MemoryRegion io_mem_ram
, io_mem_rom
, io_mem_unassigned
, io_mem_notdirty
;
108 static MemoryRegion io_mem_subpage_ram
;
112 CPUArchState
*first_cpu
;
113 /* current CPU in the current thread. It is only valid inside
115 DEFINE_TLS(CPUArchState
*,cpu_single_env
);
116 /* 0 = Do not count executed instructions.
117 1 = Precise instruction counting.
118 2 = Adaptive rate instruction counting. */
121 typedef struct PageDesc
{
122 /* list of TBs intersecting this ram page */
123 TranslationBlock
*first_tb
;
124 /* in order to optimize self modifying code, we count the number
125 of lookups we do to a given page to use a bitmap */
126 unsigned int code_write_count
;
127 uint8_t *code_bitmap
;
128 #if defined(CONFIG_USER_ONLY)
133 /* In system mode we want L1_MAP to be based on ram offsets,
134 while in user mode we want it to be based on virtual addresses. */
135 #if !defined(CONFIG_USER_ONLY)
136 #if HOST_LONG_BITS < TARGET_PHYS_ADDR_SPACE_BITS
137 # define L1_MAP_ADDR_SPACE_BITS HOST_LONG_BITS
139 # define L1_MAP_ADDR_SPACE_BITS TARGET_PHYS_ADDR_SPACE_BITS
142 # define L1_MAP_ADDR_SPACE_BITS TARGET_VIRT_ADDR_SPACE_BITS
145 /* Size of the L2 (and L3, etc) page tables. */
147 #define L2_SIZE (1 << L2_BITS)
149 #define P_L2_LEVELS \
150 (((TARGET_PHYS_ADDR_SPACE_BITS - TARGET_PAGE_BITS - 1) / L2_BITS) + 1)
152 /* The bits remaining after N lower levels of page tables. */
153 #define V_L1_BITS_REM \
154 ((L1_MAP_ADDR_SPACE_BITS - TARGET_PAGE_BITS) % L2_BITS)
156 #if V_L1_BITS_REM < 4
157 #define V_L1_BITS (V_L1_BITS_REM + L2_BITS)
159 #define V_L1_BITS V_L1_BITS_REM
162 #define V_L1_SIZE ((target_ulong)1 << V_L1_BITS)
164 #define V_L1_SHIFT (L1_MAP_ADDR_SPACE_BITS - TARGET_PAGE_BITS - V_L1_BITS)
166 uintptr_t qemu_real_host_page_size
;
167 uintptr_t qemu_host_page_size
;
168 uintptr_t qemu_host_page_mask
;
170 /* This is a multi-level map on the virtual address space.
171 The bottom level has pointers to PageDesc. */
172 static void *l1_map
[V_L1_SIZE
];
174 #if !defined(CONFIG_USER_ONLY)
176 static MemoryRegionSection
*phys_sections
;
177 static unsigned phys_sections_nb
, phys_sections_nb_alloc
;
178 static uint16_t phys_section_unassigned
;
179 static uint16_t phys_section_notdirty
;
180 static uint16_t phys_section_rom
;
181 static uint16_t phys_section_watch
;
183 /* Simple allocator for PhysPageEntry nodes */
184 static PhysPageEntry (*phys_map_nodes
)[L2_SIZE
];
185 static unsigned phys_map_nodes_nb
, phys_map_nodes_nb_alloc
;
187 #define PHYS_MAP_NODE_NIL (((uint16_t)~0) >> 1)
189 static void io_mem_init(void);
190 static void memory_map_init(void);
191 static void *qemu_safe_ram_ptr(ram_addr_t addr
);
193 static MemoryRegion io_mem_watch
;
195 static void tb_link_page(TranslationBlock
*tb
, tb_page_addr_t phys_pc
,
196 tb_page_addr_t phys_page2
);
199 static int tb_flush_count
;
200 static int tb_phys_invalidate_count
;
203 static inline void map_exec(void *addr
, long size
)
206 VirtualProtect(addr
, size
,
207 PAGE_EXECUTE_READWRITE
, &old_protect
);
211 static inline void map_exec(void *addr
, long size
)
213 unsigned long start
, end
, page_size
;
215 page_size
= getpagesize();
216 start
= (unsigned long)addr
;
217 start
&= ~(page_size
- 1);
219 end
= (unsigned long)addr
+ size
;
220 end
+= page_size
- 1;
221 end
&= ~(page_size
- 1);
223 mprotect((void *)start
, end
- start
,
224 PROT_READ
| PROT_WRITE
| PROT_EXEC
);
228 static void page_init(void)
230 /* NOTE: we can always suppose that qemu_host_page_size >=
234 SYSTEM_INFO system_info
;
236 GetSystemInfo(&system_info
);
237 qemu_real_host_page_size
= system_info
.dwPageSize
;
240 qemu_real_host_page_size
= getpagesize();
242 if (qemu_host_page_size
== 0)
243 qemu_host_page_size
= qemu_real_host_page_size
;
244 if (qemu_host_page_size
< TARGET_PAGE_SIZE
)
245 qemu_host_page_size
= TARGET_PAGE_SIZE
;
246 qemu_host_page_mask
= ~(qemu_host_page_size
- 1);
248 #if defined(CONFIG_BSD) && defined(CONFIG_USER_ONLY)
250 #ifdef HAVE_KINFO_GETVMMAP
251 struct kinfo_vmentry
*freep
;
254 freep
= kinfo_getvmmap(getpid(), &cnt
);
257 for (i
= 0; i
< cnt
; i
++) {
258 unsigned long startaddr
, endaddr
;
260 startaddr
= freep
[i
].kve_start
;
261 endaddr
= freep
[i
].kve_end
;
262 if (h2g_valid(startaddr
)) {
263 startaddr
= h2g(startaddr
) & TARGET_PAGE_MASK
;
265 if (h2g_valid(endaddr
)) {
266 endaddr
= h2g(endaddr
);
267 page_set_flags(startaddr
, endaddr
, PAGE_RESERVED
);
269 #if TARGET_ABI_BITS <= L1_MAP_ADDR_SPACE_BITS
271 page_set_flags(startaddr
, endaddr
, PAGE_RESERVED
);
282 last_brk
= (unsigned long)sbrk(0);
284 f
= fopen("/compat/linux/proc/self/maps", "r");
289 unsigned long startaddr
, endaddr
;
292 n
= fscanf (f
, "%lx-%lx %*[^\n]\n", &startaddr
, &endaddr
);
294 if (n
== 2 && h2g_valid(startaddr
)) {
295 startaddr
= h2g(startaddr
) & TARGET_PAGE_MASK
;
297 if (h2g_valid(endaddr
)) {
298 endaddr
= h2g(endaddr
);
302 page_set_flags(startaddr
, endaddr
, PAGE_RESERVED
);
314 static PageDesc
*page_find_alloc(tb_page_addr_t index
, int alloc
)
320 #if defined(CONFIG_USER_ONLY)
321 /* We can't use g_malloc because it may recurse into a locked mutex. */
322 # define ALLOC(P, SIZE) \
324 P = mmap(NULL, SIZE, PROT_READ | PROT_WRITE, \
325 MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); \
328 # define ALLOC(P, SIZE) \
329 do { P = g_malloc0(SIZE); } while (0)
332 /* Level 1. Always allocated. */
333 lp
= l1_map
+ ((index
>> V_L1_SHIFT
) & (V_L1_SIZE
- 1));
336 for (i
= V_L1_SHIFT
/ L2_BITS
- 1; i
> 0; i
--) {
343 ALLOC(p
, sizeof(void *) * L2_SIZE
);
347 lp
= p
+ ((index
>> (i
* L2_BITS
)) & (L2_SIZE
- 1));
355 ALLOC(pd
, sizeof(PageDesc
) * L2_SIZE
);
361 return pd
+ (index
& (L2_SIZE
- 1));
364 static inline PageDesc
*page_find(tb_page_addr_t index
)
366 return page_find_alloc(index
, 0);
369 #if !defined(CONFIG_USER_ONLY)
371 static void phys_map_node_reserve(unsigned nodes
)
373 if (phys_map_nodes_nb
+ nodes
> phys_map_nodes_nb_alloc
) {
374 typedef PhysPageEntry Node
[L2_SIZE
];
375 phys_map_nodes_nb_alloc
= MAX(phys_map_nodes_nb_alloc
* 2, 16);
376 phys_map_nodes_nb_alloc
= MAX(phys_map_nodes_nb_alloc
,
377 phys_map_nodes_nb
+ nodes
);
378 phys_map_nodes
= g_renew(Node
, phys_map_nodes
,
379 phys_map_nodes_nb_alloc
);
383 static uint16_t phys_map_node_alloc(void)
388 ret
= phys_map_nodes_nb
++;
389 assert(ret
!= PHYS_MAP_NODE_NIL
);
390 assert(ret
!= phys_map_nodes_nb_alloc
);
391 for (i
= 0; i
< L2_SIZE
; ++i
) {
392 phys_map_nodes
[ret
][i
].is_leaf
= 0;
393 phys_map_nodes
[ret
][i
].ptr
= PHYS_MAP_NODE_NIL
;
398 static void phys_map_nodes_reset(void)
400 phys_map_nodes_nb
= 0;
404 static void phys_page_set_level(PhysPageEntry
*lp
, hwaddr
*index
,
405 hwaddr
*nb
, uint16_t leaf
,
410 hwaddr step
= (hwaddr
)1 << (level
* L2_BITS
);
412 if (!lp
->is_leaf
&& lp
->ptr
== PHYS_MAP_NODE_NIL
) {
413 lp
->ptr
= phys_map_node_alloc();
414 p
= phys_map_nodes
[lp
->ptr
];
416 for (i
= 0; i
< L2_SIZE
; i
++) {
418 p
[i
].ptr
= phys_section_unassigned
;
422 p
= phys_map_nodes
[lp
->ptr
];
424 lp
= &p
[(*index
>> (level
* L2_BITS
)) & (L2_SIZE
- 1)];
426 while (*nb
&& lp
< &p
[L2_SIZE
]) {
427 if ((*index
& (step
- 1)) == 0 && *nb
>= step
) {
433 phys_page_set_level(lp
, index
, nb
, leaf
, level
- 1);
439 static void phys_page_set(AddressSpaceDispatch
*d
,
440 hwaddr index
, hwaddr nb
,
443 /* Wildly overreserve - it doesn't matter much. */
444 phys_map_node_reserve(3 * P_L2_LEVELS
);
446 phys_page_set_level(&d
->phys_map
, &index
, &nb
, leaf
, P_L2_LEVELS
- 1);
449 MemoryRegionSection
*phys_page_find(AddressSpaceDispatch
*d
, hwaddr index
)
451 PhysPageEntry lp
= d
->phys_map
;
454 uint16_t s_index
= phys_section_unassigned
;
456 for (i
= P_L2_LEVELS
- 1; i
>= 0 && !lp
.is_leaf
; i
--) {
457 if (lp
.ptr
== PHYS_MAP_NODE_NIL
) {
460 p
= phys_map_nodes
[lp
.ptr
];
461 lp
= p
[(index
>> (i
* L2_BITS
)) & (L2_SIZE
- 1)];
466 return &phys_sections
[s_index
];
469 bool memory_region_is_unassigned(MemoryRegion
*mr
)
471 return mr
!= &io_mem_ram
&& mr
!= &io_mem_rom
472 && mr
!= &io_mem_notdirty
&& !mr
->rom_device
473 && mr
!= &io_mem_watch
;
476 #define mmap_lock() do { } while(0)
477 #define mmap_unlock() do { } while(0)
480 #if defined(CONFIG_USER_ONLY)
481 /* Currently it is not recommended to allocate big chunks of data in
482 user mode. It will change when a dedicated libc will be used. */
483 /* ??? 64-bit hosts ought to have no problem mmaping data outside the
484 region in which the guest needs to run. Revisit this. */
485 #define USE_STATIC_CODE_GEN_BUFFER
488 /* ??? Should configure for this, not list operating systems here. */
489 #if (defined(__linux__) \
490 || defined(__FreeBSD__) || defined(__FreeBSD_kernel__) \
491 || defined(__DragonFly__) || defined(__OpenBSD__) \
492 || defined(__NetBSD__))
496 /* Minimum size of the code gen buffer. This number is randomly chosen,
497 but not so small that we can't have a fair number of TB's live. */
498 #define MIN_CODE_GEN_BUFFER_SIZE (1024u * 1024)
500 /* Maximum size of the code gen buffer we'd like to use. Unless otherwise
501 indicated, this is constrained by the range of direct branches on the
502 host cpu, as used by the TCG implementation of goto_tb. */
503 #if defined(__x86_64__)
504 # define MAX_CODE_GEN_BUFFER_SIZE (2ul * 1024 * 1024 * 1024)
505 #elif defined(__sparc__)
506 # define MAX_CODE_GEN_BUFFER_SIZE (2ul * 1024 * 1024 * 1024)
507 #elif defined(__arm__)
508 # define MAX_CODE_GEN_BUFFER_SIZE (16u * 1024 * 1024)
509 #elif defined(__s390x__)
510 /* We have a +- 4GB range on the branches; leave some slop. */
511 # define MAX_CODE_GEN_BUFFER_SIZE (3ul * 1024 * 1024 * 1024)
513 # define MAX_CODE_GEN_BUFFER_SIZE ((size_t)-1)
516 #define DEFAULT_CODE_GEN_BUFFER_SIZE_1 (32u * 1024 * 1024)
518 #define DEFAULT_CODE_GEN_BUFFER_SIZE \
519 (DEFAULT_CODE_GEN_BUFFER_SIZE_1 < MAX_CODE_GEN_BUFFER_SIZE \
520 ? DEFAULT_CODE_GEN_BUFFER_SIZE_1 : MAX_CODE_GEN_BUFFER_SIZE)
522 static inline size_t size_code_gen_buffer(size_t tb_size
)
524 /* Size the buffer. */
526 #ifdef USE_STATIC_CODE_GEN_BUFFER
527 tb_size
= DEFAULT_CODE_GEN_BUFFER_SIZE
;
529 /* ??? Needs adjustments. */
530 /* ??? If we relax the requirement that CONFIG_USER_ONLY use the
531 static buffer, we could size this on RESERVED_VA, on the text
532 segment size of the executable, or continue to use the default. */
533 tb_size
= (unsigned long)(ram_size
/ 4);
536 if (tb_size
< MIN_CODE_GEN_BUFFER_SIZE
) {
537 tb_size
= MIN_CODE_GEN_BUFFER_SIZE
;
539 if (tb_size
> MAX_CODE_GEN_BUFFER_SIZE
) {
540 tb_size
= MAX_CODE_GEN_BUFFER_SIZE
;
542 code_gen_buffer_size
= tb_size
;
546 #ifdef USE_STATIC_CODE_GEN_BUFFER
547 static uint8_t static_code_gen_buffer
[DEFAULT_CODE_GEN_BUFFER_SIZE
]
548 __attribute__((aligned(CODE_GEN_ALIGN
)));
550 static inline void *alloc_code_gen_buffer(void)
552 map_exec(static_code_gen_buffer
, code_gen_buffer_size
);
553 return static_code_gen_buffer
;
555 #elif defined(USE_MMAP)
556 static inline void *alloc_code_gen_buffer(void)
558 int flags
= MAP_PRIVATE
| MAP_ANONYMOUS
;
562 /* Constrain the position of the buffer based on the host cpu.
563 Note that these addresses are chosen in concert with the
564 addresses assigned in the relevant linker script file. */
565 # if defined(__PIE__) || defined(__PIC__)
566 /* Don't bother setting a preferred location if we're building
567 a position-independent executable. We're more likely to get
568 an address near the main executable if we let the kernel
569 choose the address. */
570 # elif defined(__x86_64__) && defined(MAP_32BIT)
571 /* Force the memory down into low memory with the executable.
572 Leave the choice of exact location with the kernel. */
574 /* Cannot expect to map more than 800MB in low memory. */
575 if (code_gen_buffer_size
> 800u * 1024 * 1024) {
576 code_gen_buffer_size
= 800u * 1024 * 1024;
578 # elif defined(__sparc__)
579 start
= 0x40000000ul
;
580 # elif defined(__s390x__)
581 start
= 0x90000000ul
;
584 buf
= mmap((void *)start
, code_gen_buffer_size
,
585 PROT_WRITE
| PROT_READ
| PROT_EXEC
, flags
, -1, 0);
586 return buf
== MAP_FAILED
? NULL
: buf
;
589 static inline void *alloc_code_gen_buffer(void)
591 void *buf
= g_malloc(code_gen_buffer_size
);
593 map_exec(buf
, code_gen_buffer_size
);
597 #endif /* USE_STATIC_CODE_GEN_BUFFER, USE_MMAP */
599 static inline void code_gen_alloc(size_t tb_size
)
601 code_gen_buffer_size
= size_code_gen_buffer(tb_size
);
602 code_gen_buffer
= alloc_code_gen_buffer();
603 if (code_gen_buffer
== NULL
) {
604 fprintf(stderr
, "Could not allocate dynamic translator buffer\n");
608 /* Steal room for the prologue at the end of the buffer. This ensures
609 (via the MAX_CODE_GEN_BUFFER_SIZE limits above) that direct branches
610 from TB's to the prologue are going to be in range. It also means
611 that we don't need to mark (additional) portions of the data segment
613 code_gen_prologue
= code_gen_buffer
+ code_gen_buffer_size
- 1024;
614 code_gen_buffer_size
-= 1024;
616 code_gen_buffer_max_size
= code_gen_buffer_size
-
617 (TCG_MAX_OP_SIZE
* OPC_BUF_SIZE
);
618 code_gen_max_blocks
= code_gen_buffer_size
/ CODE_GEN_AVG_BLOCK_SIZE
;
619 tbs
= g_malloc(code_gen_max_blocks
* sizeof(TranslationBlock
));
622 /* Must be called before using the QEMU cpus. 'tb_size' is the size
623 (in bytes) allocated to the translation buffer. Zero means default
625 void tcg_exec_init(unsigned long tb_size
)
628 code_gen_alloc(tb_size
);
629 code_gen_ptr
= code_gen_buffer
;
630 tcg_register_jit(code_gen_buffer
, code_gen_buffer_size
);
632 #if !defined(CONFIG_USER_ONLY) || !defined(CONFIG_USE_GUEST_BASE)
633 /* There's no guest base to take into account, so go ahead and
634 initialize the prologue now. */
635 tcg_prologue_init(&tcg_ctx
);
639 bool tcg_enabled(void)
641 return code_gen_buffer
!= NULL
;
644 void cpu_exec_init_all(void)
646 #if !defined(CONFIG_USER_ONLY)
652 #if defined(CPU_SAVE_VERSION) && !defined(CONFIG_USER_ONLY)
654 static int cpu_common_post_load(void *opaque
, int version_id
)
656 CPUArchState
*env
= opaque
;
658 /* 0x01 was CPU_INTERRUPT_EXIT. This line can be removed when the
659 version_id is increased. */
660 env
->interrupt_request
&= ~0x01;
666 static const VMStateDescription vmstate_cpu_common
= {
667 .name
= "cpu_common",
669 .minimum_version_id
= 1,
670 .minimum_version_id_old
= 1,
671 .post_load
= cpu_common_post_load
,
672 .fields
= (VMStateField
[]) {
673 VMSTATE_UINT32(halted
, CPUArchState
),
674 VMSTATE_UINT32(interrupt_request
, CPUArchState
),
675 VMSTATE_END_OF_LIST()
680 CPUArchState
*qemu_get_cpu(int cpu
)
682 CPUArchState
*env
= first_cpu
;
685 if (env
->cpu_index
== cpu
)
693 void cpu_exec_init(CPUArchState
*env
)
695 #ifndef CONFIG_USER_ONLY
696 CPUState
*cpu
= ENV_GET_CPU(env
);
701 #if defined(CONFIG_USER_ONLY)
704 env
->next_cpu
= NULL
;
707 while (*penv
!= NULL
) {
708 penv
= &(*penv
)->next_cpu
;
711 env
->cpu_index
= cpu_index
;
713 QTAILQ_INIT(&env
->breakpoints
);
714 QTAILQ_INIT(&env
->watchpoints
);
715 #ifndef CONFIG_USER_ONLY
716 cpu
->thread_id
= qemu_get_thread_id();
719 #if defined(CONFIG_USER_ONLY)
722 #if defined(CPU_SAVE_VERSION) && !defined(CONFIG_USER_ONLY)
723 vmstate_register(NULL
, cpu_index
, &vmstate_cpu_common
, env
);
724 register_savevm(NULL
, "cpu", cpu_index
, CPU_SAVE_VERSION
,
725 cpu_save
, cpu_load
, env
);
729 /* Allocate a new translation block. Flush the translation buffer if
730 too many translation blocks or too much generated code. */
731 static TranslationBlock
*tb_alloc(target_ulong pc
)
733 TranslationBlock
*tb
;
735 if (nb_tbs
>= code_gen_max_blocks
||
736 (code_gen_ptr
- code_gen_buffer
) >= code_gen_buffer_max_size
)
744 void tb_free(TranslationBlock
*tb
)
746 /* In practice this is mostly used for single use temporary TB
747 Ignore the hard cases and just back up if this TB happens to
748 be the last one generated. */
749 if (nb_tbs
> 0 && tb
== &tbs
[nb_tbs
- 1]) {
750 code_gen_ptr
= tb
->tc_ptr
;
755 static inline void invalidate_page_bitmap(PageDesc
*p
)
757 if (p
->code_bitmap
) {
758 g_free(p
->code_bitmap
);
759 p
->code_bitmap
= NULL
;
761 p
->code_write_count
= 0;
764 /* Set to NULL all the 'first_tb' fields in all PageDescs. */
766 static void page_flush_tb_1 (int level
, void **lp
)
775 for (i
= 0; i
< L2_SIZE
; ++i
) {
776 pd
[i
].first_tb
= NULL
;
777 invalidate_page_bitmap(pd
+ i
);
781 for (i
= 0; i
< L2_SIZE
; ++i
) {
782 page_flush_tb_1 (level
- 1, pp
+ i
);
787 static void page_flush_tb(void)
790 for (i
= 0; i
< V_L1_SIZE
; i
++) {
791 page_flush_tb_1(V_L1_SHIFT
/ L2_BITS
- 1, l1_map
+ i
);
795 /* flush all the translation blocks */
796 /* XXX: tb_flush is currently not thread safe */
797 void tb_flush(CPUArchState
*env1
)
800 #if defined(DEBUG_FLUSH)
801 printf("qemu: flush code_size=%ld nb_tbs=%d avg_tb_size=%ld\n",
802 (unsigned long)(code_gen_ptr
- code_gen_buffer
),
804 ((unsigned long)(code_gen_ptr
- code_gen_buffer
)) / nb_tbs
: 0);
806 if ((unsigned long)(code_gen_ptr
- code_gen_buffer
) > code_gen_buffer_size
)
807 cpu_abort(env1
, "Internal error: code buffer overflow\n");
811 for(env
= first_cpu
; env
!= NULL
; env
= env
->next_cpu
) {
812 memset (env
->tb_jmp_cache
, 0, TB_JMP_CACHE_SIZE
* sizeof (void *));
815 memset (tb_phys_hash
, 0, CODE_GEN_PHYS_HASH_SIZE
* sizeof (void *));
818 code_gen_ptr
= code_gen_buffer
;
819 /* XXX: flush processor icache at this point if cache flush is
824 #ifdef DEBUG_TB_CHECK
826 static void tb_invalidate_check(target_ulong address
)
828 TranslationBlock
*tb
;
830 address
&= TARGET_PAGE_MASK
;
831 for(i
= 0;i
< CODE_GEN_PHYS_HASH_SIZE
; i
++) {
832 for(tb
= tb_phys_hash
[i
]; tb
!= NULL
; tb
= tb
->phys_hash_next
) {
833 if (!(address
+ TARGET_PAGE_SIZE
<= tb
->pc
||
834 address
>= tb
->pc
+ tb
->size
)) {
835 printf("ERROR invalidate: address=" TARGET_FMT_lx
836 " PC=%08lx size=%04x\n",
837 address
, (long)tb
->pc
, tb
->size
);
843 /* verify that all the pages have correct rights for code */
844 static void tb_page_check(void)
846 TranslationBlock
*tb
;
847 int i
, flags1
, flags2
;
849 for(i
= 0;i
< CODE_GEN_PHYS_HASH_SIZE
; i
++) {
850 for(tb
= tb_phys_hash
[i
]; tb
!= NULL
; tb
= tb
->phys_hash_next
) {
851 flags1
= page_get_flags(tb
->pc
);
852 flags2
= page_get_flags(tb
->pc
+ tb
->size
- 1);
853 if ((flags1
& PAGE_WRITE
) || (flags2
& PAGE_WRITE
)) {
854 printf("ERROR page flags: PC=%08lx size=%04x f1=%x f2=%x\n",
855 (long)tb
->pc
, tb
->size
, flags1
, flags2
);
863 /* invalidate one TB */
864 static inline void tb_remove(TranslationBlock
**ptb
, TranslationBlock
*tb
,
867 TranslationBlock
*tb1
;
871 *ptb
= *(TranslationBlock
**)((char *)tb1
+ next_offset
);
874 ptb
= (TranslationBlock
**)((char *)tb1
+ next_offset
);
878 static inline void tb_page_remove(TranslationBlock
**ptb
, TranslationBlock
*tb
)
880 TranslationBlock
*tb1
;
885 n1
= (uintptr_t)tb1
& 3;
886 tb1
= (TranslationBlock
*)((uintptr_t)tb1
& ~3);
888 *ptb
= tb1
->page_next
[n1
];
891 ptb
= &tb1
->page_next
[n1
];
895 static inline void tb_jmp_remove(TranslationBlock
*tb
, int n
)
897 TranslationBlock
*tb1
, **ptb
;
900 ptb
= &tb
->jmp_next
[n
];
903 /* find tb(n) in circular list */
906 n1
= (uintptr_t)tb1
& 3;
907 tb1
= (TranslationBlock
*)((uintptr_t)tb1
& ~3);
908 if (n1
== n
&& tb1
== tb
)
911 ptb
= &tb1
->jmp_first
;
913 ptb
= &tb1
->jmp_next
[n1
];
916 /* now we can suppress tb(n) from the list */
917 *ptb
= tb
->jmp_next
[n
];
919 tb
->jmp_next
[n
] = NULL
;
923 /* reset the jump entry 'n' of a TB so that it is not chained to
925 static inline void tb_reset_jump(TranslationBlock
*tb
, int n
)
927 tb_set_jmp_target(tb
, n
, (uintptr_t)(tb
->tc_ptr
+ tb
->tb_next_offset
[n
]));
930 void tb_phys_invalidate(TranslationBlock
*tb
, tb_page_addr_t page_addr
)
935 tb_page_addr_t phys_pc
;
936 TranslationBlock
*tb1
, *tb2
;
938 /* remove the TB from the hash list */
939 phys_pc
= tb
->page_addr
[0] + (tb
->pc
& ~TARGET_PAGE_MASK
);
940 h
= tb_phys_hash_func(phys_pc
);
941 tb_remove(&tb_phys_hash
[h
], tb
,
942 offsetof(TranslationBlock
, phys_hash_next
));
944 /* remove the TB from the page list */
945 if (tb
->page_addr
[0] != page_addr
) {
946 p
= page_find(tb
->page_addr
[0] >> TARGET_PAGE_BITS
);
947 tb_page_remove(&p
->first_tb
, tb
);
948 invalidate_page_bitmap(p
);
950 if (tb
->page_addr
[1] != -1 && tb
->page_addr
[1] != page_addr
) {
951 p
= page_find(tb
->page_addr
[1] >> TARGET_PAGE_BITS
);
952 tb_page_remove(&p
->first_tb
, tb
);
953 invalidate_page_bitmap(p
);
956 tb_invalidated_flag
= 1;
958 /* remove the TB from the hash list */
959 h
= tb_jmp_cache_hash_func(tb
->pc
);
960 for(env
= first_cpu
; env
!= NULL
; env
= env
->next_cpu
) {
961 if (env
->tb_jmp_cache
[h
] == tb
)
962 env
->tb_jmp_cache
[h
] = NULL
;
965 /* suppress this TB from the two jump lists */
966 tb_jmp_remove(tb
, 0);
967 tb_jmp_remove(tb
, 1);
969 /* suppress any remaining jumps to this TB */
972 n1
= (uintptr_t)tb1
& 3;
975 tb1
= (TranslationBlock
*)((uintptr_t)tb1
& ~3);
976 tb2
= tb1
->jmp_next
[n1
];
977 tb_reset_jump(tb1
, n1
);
978 tb1
->jmp_next
[n1
] = NULL
;
981 tb
->jmp_first
= (TranslationBlock
*)((uintptr_t)tb
| 2); /* fail safe */
983 tb_phys_invalidate_count
++;
986 static inline void set_bits(uint8_t *tab
, int start
, int len
)
992 mask
= 0xff << (start
& 7);
993 if ((start
& ~7) == (end
& ~7)) {
995 mask
&= ~(0xff << (end
& 7));
1000 start
= (start
+ 8) & ~7;
1002 while (start
< end1
) {
1007 mask
= ~(0xff << (end
& 7));
1013 static void build_page_bitmap(PageDesc
*p
)
1015 int n
, tb_start
, tb_end
;
1016 TranslationBlock
*tb
;
1018 p
->code_bitmap
= g_malloc0(TARGET_PAGE_SIZE
/ 8);
1021 while (tb
!= NULL
) {
1022 n
= (uintptr_t)tb
& 3;
1023 tb
= (TranslationBlock
*)((uintptr_t)tb
& ~3);
1024 /* NOTE: this is subtle as a TB may span two physical pages */
1026 /* NOTE: tb_end may be after the end of the page, but
1027 it is not a problem */
1028 tb_start
= tb
->pc
& ~TARGET_PAGE_MASK
;
1029 tb_end
= tb_start
+ tb
->size
;
1030 if (tb_end
> TARGET_PAGE_SIZE
)
1031 tb_end
= TARGET_PAGE_SIZE
;
1034 tb_end
= ((tb
->pc
+ tb
->size
) & ~TARGET_PAGE_MASK
);
1036 set_bits(p
->code_bitmap
, tb_start
, tb_end
- tb_start
);
1037 tb
= tb
->page_next
[n
];
1041 TranslationBlock
*tb_gen_code(CPUArchState
*env
,
1042 target_ulong pc
, target_ulong cs_base
,
1043 int flags
, int cflags
)
1045 TranslationBlock
*tb
;
1047 tb_page_addr_t phys_pc
, phys_page2
;
1048 target_ulong virt_page2
;
1051 phys_pc
= get_page_addr_code(env
, pc
);
1054 /* flush must be done */
1056 /* cannot fail at this point */
1058 /* Don't forget to invalidate previous TB info. */
1059 tb_invalidated_flag
= 1;
1061 tc_ptr
= code_gen_ptr
;
1062 tb
->tc_ptr
= tc_ptr
;
1063 tb
->cs_base
= cs_base
;
1065 tb
->cflags
= cflags
;
1066 cpu_gen_code(env
, tb
, &code_gen_size
);
1067 code_gen_ptr
= (void *)(((uintptr_t)code_gen_ptr
+ code_gen_size
+
1068 CODE_GEN_ALIGN
- 1) & ~(CODE_GEN_ALIGN
- 1));
1070 /* check next page if needed */
1071 virt_page2
= (pc
+ tb
->size
- 1) & TARGET_PAGE_MASK
;
1073 if ((pc
& TARGET_PAGE_MASK
) != virt_page2
) {
1074 phys_page2
= get_page_addr_code(env
, virt_page2
);
1076 tb_link_page(tb
, phys_pc
, phys_page2
);
1081 * Invalidate all TBs which intersect with the target physical address range
1082 * [start;end[. NOTE: start and end may refer to *different* physical pages.
1083 * 'is_cpu_write_access' should be true if called from a real cpu write
1084 * access: the virtual CPU will exit the current TB if code is modified inside
1087 void tb_invalidate_phys_range(tb_page_addr_t start
, tb_page_addr_t end
,
1088 int is_cpu_write_access
)
1090 while (start
< end
) {
1091 tb_invalidate_phys_page_range(start
, end
, is_cpu_write_access
);
1092 start
&= TARGET_PAGE_MASK
;
1093 start
+= TARGET_PAGE_SIZE
;
1098 * Invalidate all TBs which intersect with the target physical address range
1099 * [start;end[. NOTE: start and end must refer to the *same* physical page.
1100 * 'is_cpu_write_access' should be true if called from a real cpu write
1101 * access: the virtual CPU will exit the current TB if code is modified inside
1104 void tb_invalidate_phys_page_range(tb_page_addr_t start
, tb_page_addr_t end
,
1105 int is_cpu_write_access
)
1107 TranslationBlock
*tb
, *tb_next
, *saved_tb
;
1108 CPUArchState
*env
= cpu_single_env
;
1109 tb_page_addr_t tb_start
, tb_end
;
1112 #ifdef TARGET_HAS_PRECISE_SMC
1113 int current_tb_not_found
= is_cpu_write_access
;
1114 TranslationBlock
*current_tb
= NULL
;
1115 int current_tb_modified
= 0;
1116 target_ulong current_pc
= 0;
1117 target_ulong current_cs_base
= 0;
1118 int current_flags
= 0;
1119 #endif /* TARGET_HAS_PRECISE_SMC */
1121 p
= page_find(start
>> TARGET_PAGE_BITS
);
1124 if (!p
->code_bitmap
&&
1125 ++p
->code_write_count
>= SMC_BITMAP_USE_THRESHOLD
&&
1126 is_cpu_write_access
) {
1127 /* build code bitmap */
1128 build_page_bitmap(p
);
1131 /* we remove all the TBs in the range [start, end[ */
1132 /* XXX: see if in some cases it could be faster to invalidate all the code */
1134 while (tb
!= NULL
) {
1135 n
= (uintptr_t)tb
& 3;
1136 tb
= (TranslationBlock
*)((uintptr_t)tb
& ~3);
1137 tb_next
= tb
->page_next
[n
];
1138 /* NOTE: this is subtle as a TB may span two physical pages */
1140 /* NOTE: tb_end may be after the end of the page, but
1141 it is not a problem */
1142 tb_start
= tb
->page_addr
[0] + (tb
->pc
& ~TARGET_PAGE_MASK
);
1143 tb_end
= tb_start
+ tb
->size
;
1145 tb_start
= tb
->page_addr
[1];
1146 tb_end
= tb_start
+ ((tb
->pc
+ tb
->size
) & ~TARGET_PAGE_MASK
);
1148 if (!(tb_end
<= start
|| tb_start
>= end
)) {
1149 #ifdef TARGET_HAS_PRECISE_SMC
1150 if (current_tb_not_found
) {
1151 current_tb_not_found
= 0;
1153 if (env
->mem_io_pc
) {
1154 /* now we have a real cpu fault */
1155 current_tb
= tb_find_pc(env
->mem_io_pc
);
1158 if (current_tb
== tb
&&
1159 (current_tb
->cflags
& CF_COUNT_MASK
) != 1) {
1160 /* If we are modifying the current TB, we must stop
1161 its execution. We could be more precise by checking
1162 that the modification is after the current PC, but it
1163 would require a specialized function to partially
1164 restore the CPU state */
1166 current_tb_modified
= 1;
1167 cpu_restore_state(current_tb
, env
, env
->mem_io_pc
);
1168 cpu_get_tb_cpu_state(env
, ¤t_pc
, ¤t_cs_base
,
1171 #endif /* TARGET_HAS_PRECISE_SMC */
1172 /* we need to do that to handle the case where a signal
1173 occurs while doing tb_phys_invalidate() */
1176 saved_tb
= env
->current_tb
;
1177 env
->current_tb
= NULL
;
1179 tb_phys_invalidate(tb
, -1);
1181 env
->current_tb
= saved_tb
;
1182 if (env
->interrupt_request
&& env
->current_tb
)
1183 cpu_interrupt(env
, env
->interrupt_request
);
1188 #if !defined(CONFIG_USER_ONLY)
1189 /* if no code remaining, no need to continue to use slow writes */
1191 invalidate_page_bitmap(p
);
1192 if (is_cpu_write_access
) {
1193 tlb_unprotect_code_phys(env
, start
, env
->mem_io_vaddr
);
1197 #ifdef TARGET_HAS_PRECISE_SMC
1198 if (current_tb_modified
) {
1199 /* we generate a block containing just the instruction
1200 modifying the memory. It will ensure that it cannot modify
1202 env
->current_tb
= NULL
;
1203 tb_gen_code(env
, current_pc
, current_cs_base
, current_flags
, 1);
1204 cpu_resume_from_signal(env
, NULL
);
1209 /* len must be <= 8 and start must be a multiple of len */
1210 static inline void tb_invalidate_phys_page_fast(tb_page_addr_t start
, int len
)
1216 qemu_log("modifying code at 0x%x size=%d EIP=%x PC=%08x\n",
1217 cpu_single_env
->mem_io_vaddr
, len
,
1218 cpu_single_env
->eip
,
1219 cpu_single_env
->eip
+
1220 (intptr_t)cpu_single_env
->segs
[R_CS
].base
);
1223 p
= page_find(start
>> TARGET_PAGE_BITS
);
1226 if (p
->code_bitmap
) {
1227 offset
= start
& ~TARGET_PAGE_MASK
;
1228 b
= p
->code_bitmap
[offset
>> 3] >> (offset
& 7);
1229 if (b
& ((1 << len
) - 1))
1233 tb_invalidate_phys_page_range(start
, start
+ len
, 1);
1237 #if !defined(CONFIG_SOFTMMU)
1238 static void tb_invalidate_phys_page(tb_page_addr_t addr
,
1239 uintptr_t pc
, void *puc
)
1241 TranslationBlock
*tb
;
1244 #ifdef TARGET_HAS_PRECISE_SMC
1245 TranslationBlock
*current_tb
= NULL
;
1246 CPUArchState
*env
= cpu_single_env
;
1247 int current_tb_modified
= 0;
1248 target_ulong current_pc
= 0;
1249 target_ulong current_cs_base
= 0;
1250 int current_flags
= 0;
1253 addr
&= TARGET_PAGE_MASK
;
1254 p
= page_find(addr
>> TARGET_PAGE_BITS
);
1258 #ifdef TARGET_HAS_PRECISE_SMC
1259 if (tb
&& pc
!= 0) {
1260 current_tb
= tb_find_pc(pc
);
1263 while (tb
!= NULL
) {
1264 n
= (uintptr_t)tb
& 3;
1265 tb
= (TranslationBlock
*)((uintptr_t)tb
& ~3);
1266 #ifdef TARGET_HAS_PRECISE_SMC
1267 if (current_tb
== tb
&&
1268 (current_tb
->cflags
& CF_COUNT_MASK
) != 1) {
1269 /* If we are modifying the current TB, we must stop
1270 its execution. We could be more precise by checking
1271 that the modification is after the current PC, but it
1272 would require a specialized function to partially
1273 restore the CPU state */
1275 current_tb_modified
= 1;
1276 cpu_restore_state(current_tb
, env
, pc
);
1277 cpu_get_tb_cpu_state(env
, ¤t_pc
, ¤t_cs_base
,
1280 #endif /* TARGET_HAS_PRECISE_SMC */
1281 tb_phys_invalidate(tb
, addr
);
1282 tb
= tb
->page_next
[n
];
1285 #ifdef TARGET_HAS_PRECISE_SMC
1286 if (current_tb_modified
) {
1287 /* we generate a block containing just the instruction
1288 modifying the memory. It will ensure that it cannot modify
1290 env
->current_tb
= NULL
;
1291 tb_gen_code(env
, current_pc
, current_cs_base
, current_flags
, 1);
1292 cpu_resume_from_signal(env
, puc
);
1298 /* add the tb in the target page and protect it if necessary */
1299 static inline void tb_alloc_page(TranslationBlock
*tb
,
1300 unsigned int n
, tb_page_addr_t page_addr
)
1303 #ifndef CONFIG_USER_ONLY
1304 bool page_already_protected
;
1307 tb
->page_addr
[n
] = page_addr
;
1308 p
= page_find_alloc(page_addr
>> TARGET_PAGE_BITS
, 1);
1309 tb
->page_next
[n
] = p
->first_tb
;
1310 #ifndef CONFIG_USER_ONLY
1311 page_already_protected
= p
->first_tb
!= NULL
;
1313 p
->first_tb
= (TranslationBlock
*)((uintptr_t)tb
| n
);
1314 invalidate_page_bitmap(p
);
1316 #if defined(TARGET_HAS_SMC) || 1
1318 #if defined(CONFIG_USER_ONLY)
1319 if (p
->flags
& PAGE_WRITE
) {
1324 /* force the host page as non writable (writes will have a
1325 page fault + mprotect overhead) */
1326 page_addr
&= qemu_host_page_mask
;
1328 for(addr
= page_addr
; addr
< page_addr
+ qemu_host_page_size
;
1329 addr
+= TARGET_PAGE_SIZE
) {
1331 p2
= page_find (addr
>> TARGET_PAGE_BITS
);
1335 p2
->flags
&= ~PAGE_WRITE
;
1337 mprotect(g2h(page_addr
), qemu_host_page_size
,
1338 (prot
& PAGE_BITS
) & ~PAGE_WRITE
);
1339 #ifdef DEBUG_TB_INVALIDATE
1340 printf("protecting code page: 0x" TARGET_FMT_lx
"\n",
1345 /* if some code is already present, then the pages are already
1346 protected. So we handle the case where only the first TB is
1347 allocated in a physical page */
1348 if (!page_already_protected
) {
1349 tlb_protect_code(page_addr
);
1353 #endif /* TARGET_HAS_SMC */
1356 /* add a new TB and link it to the physical page tables. phys_page2 is
1357 (-1) to indicate that only one page contains the TB. */
1358 static void tb_link_page(TranslationBlock
*tb
, tb_page_addr_t phys_pc
,
1359 tb_page_addr_t phys_page2
)
1362 TranslationBlock
**ptb
;
1364 /* Grab the mmap lock to stop another thread invalidating this TB
1365 before we are done. */
1367 /* add in the physical hash table */
1368 h
= tb_phys_hash_func(phys_pc
);
1369 ptb
= &tb_phys_hash
[h
];
1370 tb
->phys_hash_next
= *ptb
;
1373 /* add in the page list */
1374 tb_alloc_page(tb
, 0, phys_pc
& TARGET_PAGE_MASK
);
1375 if (phys_page2
!= -1)
1376 tb_alloc_page(tb
, 1, phys_page2
);
1378 tb
->page_addr
[1] = -1;
1380 tb
->jmp_first
= (TranslationBlock
*)((uintptr_t)tb
| 2);
1381 tb
->jmp_next
[0] = NULL
;
1382 tb
->jmp_next
[1] = NULL
;
1384 /* init original jump addresses */
1385 if (tb
->tb_next_offset
[0] != 0xffff)
1386 tb_reset_jump(tb
, 0);
1387 if (tb
->tb_next_offset
[1] != 0xffff)
1388 tb_reset_jump(tb
, 1);
1390 #ifdef DEBUG_TB_CHECK
1396 #if defined(CONFIG_QEMU_LDST_OPTIMIZATION) && defined(CONFIG_SOFTMMU)
1397 /* check whether the given addr is in TCG generated code buffer or not */
1398 bool is_tcg_gen_code(uintptr_t tc_ptr
)
1400 /* This can be called during code generation, code_gen_buffer_max_size
1401 is used instead of code_gen_ptr for upper boundary checking */
1402 return (tc_ptr
>= (uintptr_t)code_gen_buffer
&&
1403 tc_ptr
< (uintptr_t)(code_gen_buffer
+ code_gen_buffer_max_size
));
1407 /* find the TB 'tb' such that tb[0].tc_ptr <= tc_ptr <
1408 tb[1].tc_ptr. Return NULL if not found */
1409 TranslationBlock
*tb_find_pc(uintptr_t tc_ptr
)
1411 int m_min
, m_max
, m
;
1413 TranslationBlock
*tb
;
1417 if (tc_ptr
< (uintptr_t)code_gen_buffer
||
1418 tc_ptr
>= (uintptr_t)code_gen_ptr
) {
1421 /* binary search (cf Knuth) */
1424 while (m_min
<= m_max
) {
1425 m
= (m_min
+ m_max
) >> 1;
1427 v
= (uintptr_t)tb
->tc_ptr
;
1430 else if (tc_ptr
< v
) {
1439 static void tb_reset_jump_recursive(TranslationBlock
*tb
);
1441 static inline void tb_reset_jump_recursive2(TranslationBlock
*tb
, int n
)
1443 TranslationBlock
*tb1
, *tb_next
, **ptb
;
1446 tb1
= tb
->jmp_next
[n
];
1448 /* find head of list */
1450 n1
= (uintptr_t)tb1
& 3;
1451 tb1
= (TranslationBlock
*)((uintptr_t)tb1
& ~3);
1454 tb1
= tb1
->jmp_next
[n1
];
1456 /* we are now sure now that tb jumps to tb1 */
1459 /* remove tb from the jmp_first list */
1460 ptb
= &tb_next
->jmp_first
;
1463 n1
= (uintptr_t)tb1
& 3;
1464 tb1
= (TranslationBlock
*)((uintptr_t)tb1
& ~3);
1465 if (n1
== n
&& tb1
== tb
)
1467 ptb
= &tb1
->jmp_next
[n1
];
1469 *ptb
= tb
->jmp_next
[n
];
1470 tb
->jmp_next
[n
] = NULL
;
1472 /* suppress the jump to next tb in generated code */
1473 tb_reset_jump(tb
, n
);
1475 /* suppress jumps in the tb on which we could have jumped */
1476 tb_reset_jump_recursive(tb_next
);
1480 static void tb_reset_jump_recursive(TranslationBlock
*tb
)
1482 tb_reset_jump_recursive2(tb
, 0);
1483 tb_reset_jump_recursive2(tb
, 1);
1486 #if defined(TARGET_HAS_ICE)
1487 #if defined(CONFIG_USER_ONLY)
1488 static void breakpoint_invalidate(CPUArchState
*env
, target_ulong pc
)
1490 tb_invalidate_phys_page_range(pc
, pc
+ 1, 0);
1493 void tb_invalidate_phys_addr(hwaddr addr
)
1495 ram_addr_t ram_addr
;
1496 MemoryRegionSection
*section
;
1498 section
= phys_page_find(address_space_memory
.dispatch
, addr
>> TARGET_PAGE_BITS
);
1499 if (!(memory_region_is_ram(section
->mr
)
1500 || (section
->mr
->rom_device
&& section
->mr
->readable
))) {
1503 ram_addr
= (memory_region_get_ram_addr(section
->mr
) & TARGET_PAGE_MASK
)
1504 + memory_region_section_addr(section
, addr
);
1505 tb_invalidate_phys_page_range(ram_addr
, ram_addr
+ 1, 0);
1508 static void breakpoint_invalidate(CPUArchState
*env
, target_ulong pc
)
1510 tb_invalidate_phys_addr(cpu_get_phys_page_debug(env
, pc
) |
1511 (pc
& ~TARGET_PAGE_MASK
));
1514 #endif /* TARGET_HAS_ICE */
1516 #if defined(CONFIG_USER_ONLY)
1517 void cpu_watchpoint_remove_all(CPUArchState
*env
, int mask
)
1522 int cpu_watchpoint_insert(CPUArchState
*env
, target_ulong addr
, target_ulong len
,
1523 int flags
, CPUWatchpoint
**watchpoint
)
1528 /* Add a watchpoint. */
1529 int cpu_watchpoint_insert(CPUArchState
*env
, target_ulong addr
, target_ulong len
,
1530 int flags
, CPUWatchpoint
**watchpoint
)
1532 target_ulong len_mask
= ~(len
- 1);
1535 /* sanity checks: allow power-of-2 lengths, deny unaligned watchpoints */
1536 if ((len
& (len
- 1)) || (addr
& ~len_mask
) ||
1537 len
== 0 || len
> TARGET_PAGE_SIZE
) {
1538 fprintf(stderr
, "qemu: tried to set invalid watchpoint at "
1539 TARGET_FMT_lx
", len=" TARGET_FMT_lu
"\n", addr
, len
);
1542 wp
= g_malloc(sizeof(*wp
));
1545 wp
->len_mask
= len_mask
;
1548 /* keep all GDB-injected watchpoints in front */
1550 QTAILQ_INSERT_HEAD(&env
->watchpoints
, wp
, entry
);
1552 QTAILQ_INSERT_TAIL(&env
->watchpoints
, wp
, entry
);
1554 tlb_flush_page(env
, addr
);
1561 /* Remove a specific watchpoint. */
1562 int cpu_watchpoint_remove(CPUArchState
*env
, target_ulong addr
, target_ulong len
,
1565 target_ulong len_mask
= ~(len
- 1);
1568 QTAILQ_FOREACH(wp
, &env
->watchpoints
, entry
) {
1569 if (addr
== wp
->vaddr
&& len_mask
== wp
->len_mask
1570 && flags
== (wp
->flags
& ~BP_WATCHPOINT_HIT
)) {
1571 cpu_watchpoint_remove_by_ref(env
, wp
);
1578 /* Remove a specific watchpoint by reference. */
1579 void cpu_watchpoint_remove_by_ref(CPUArchState
*env
, CPUWatchpoint
*watchpoint
)
1581 QTAILQ_REMOVE(&env
->watchpoints
, watchpoint
, entry
);
1583 tlb_flush_page(env
, watchpoint
->vaddr
);
1588 /* Remove all matching watchpoints. */
1589 void cpu_watchpoint_remove_all(CPUArchState
*env
, int mask
)
1591 CPUWatchpoint
*wp
, *next
;
1593 QTAILQ_FOREACH_SAFE(wp
, &env
->watchpoints
, entry
, next
) {
1594 if (wp
->flags
& mask
)
1595 cpu_watchpoint_remove_by_ref(env
, wp
);
1600 /* Add a breakpoint. */
1601 int cpu_breakpoint_insert(CPUArchState
*env
, target_ulong pc
, int flags
,
1602 CPUBreakpoint
**breakpoint
)
1604 #if defined(TARGET_HAS_ICE)
1607 bp
= g_malloc(sizeof(*bp
));
1612 /* keep all GDB-injected breakpoints in front */
1614 QTAILQ_INSERT_HEAD(&env
->breakpoints
, bp
, entry
);
1616 QTAILQ_INSERT_TAIL(&env
->breakpoints
, bp
, entry
);
1618 breakpoint_invalidate(env
, pc
);
1628 /* Remove a specific breakpoint. */
1629 int cpu_breakpoint_remove(CPUArchState
*env
, target_ulong pc
, int flags
)
1631 #if defined(TARGET_HAS_ICE)
1634 QTAILQ_FOREACH(bp
, &env
->breakpoints
, entry
) {
1635 if (bp
->pc
== pc
&& bp
->flags
== flags
) {
1636 cpu_breakpoint_remove_by_ref(env
, bp
);
1646 /* Remove a specific breakpoint by reference. */
1647 void cpu_breakpoint_remove_by_ref(CPUArchState
*env
, CPUBreakpoint
*breakpoint
)
1649 #if defined(TARGET_HAS_ICE)
1650 QTAILQ_REMOVE(&env
->breakpoints
, breakpoint
, entry
);
1652 breakpoint_invalidate(env
, breakpoint
->pc
);
1658 /* Remove all matching breakpoints. */
1659 void cpu_breakpoint_remove_all(CPUArchState
*env
, int mask
)
1661 #if defined(TARGET_HAS_ICE)
1662 CPUBreakpoint
*bp
, *next
;
1664 QTAILQ_FOREACH_SAFE(bp
, &env
->breakpoints
, entry
, next
) {
1665 if (bp
->flags
& mask
)
1666 cpu_breakpoint_remove_by_ref(env
, bp
);
1671 /* enable or disable single step mode. EXCP_DEBUG is returned by the
1672 CPU loop after each instruction */
1673 void cpu_single_step(CPUArchState
*env
, int enabled
)
1675 #if defined(TARGET_HAS_ICE)
1676 if (env
->singlestep_enabled
!= enabled
) {
1677 env
->singlestep_enabled
= enabled
;
1679 kvm_update_guest_debug(env
, 0);
1681 /* must flush all the translated code to avoid inconsistencies */
1682 /* XXX: only flush what is necessary */
1689 static void cpu_unlink_tb(CPUArchState
*env
)
1691 /* FIXME: TB unchaining isn't SMP safe. For now just ignore the
1692 problem and hope the cpu will stop of its own accord. For userspace
1693 emulation this often isn't actually as bad as it sounds. Often
1694 signals are used primarily to interrupt blocking syscalls. */
1695 TranslationBlock
*tb
;
1696 static spinlock_t interrupt_lock
= SPIN_LOCK_UNLOCKED
;
1698 spin_lock(&interrupt_lock
);
1699 tb
= env
->current_tb
;
1700 /* if the cpu is currently executing code, we must unlink it and
1701 all the potentially executing TB */
1703 env
->current_tb
= NULL
;
1704 tb_reset_jump_recursive(tb
);
1706 spin_unlock(&interrupt_lock
);
1709 #ifndef CONFIG_USER_ONLY
1710 /* mask must never be zero, except for A20 change call */
1711 static void tcg_handle_interrupt(CPUArchState
*env
, int mask
)
1713 CPUState
*cpu
= ENV_GET_CPU(env
);
1716 old_mask
= env
->interrupt_request
;
1717 env
->interrupt_request
|= mask
;
1720 * If called from iothread context, wake the target cpu in
1723 if (!qemu_cpu_is_self(cpu
)) {
1729 env
->icount_decr
.u16
.high
= 0xffff;
1731 && (mask
& ~old_mask
) != 0) {
1732 cpu_abort(env
, "Raised interrupt while not in I/O function");
1739 CPUInterruptHandler cpu_interrupt_handler
= tcg_handle_interrupt
;
1741 #else /* CONFIG_USER_ONLY */
1743 void cpu_interrupt(CPUArchState
*env
, int mask
)
1745 env
->interrupt_request
|= mask
;
1748 #endif /* CONFIG_USER_ONLY */
1750 void cpu_reset_interrupt(CPUArchState
*env
, int mask
)
1752 env
->interrupt_request
&= ~mask
;
1755 void cpu_exit(CPUArchState
*env
)
1757 env
->exit_request
= 1;
1761 void cpu_abort(CPUArchState
*env
, const char *fmt
, ...)
1768 fprintf(stderr
, "qemu: fatal: ");
1769 vfprintf(stderr
, fmt
, ap
);
1770 fprintf(stderr
, "\n");
1771 cpu_dump_state(env
, stderr
, fprintf
, CPU_DUMP_FPU
| CPU_DUMP_CCOP
);
1772 if (qemu_log_enabled()) {
1773 qemu_log("qemu: fatal: ");
1774 qemu_log_vprintf(fmt
, ap2
);
1776 log_cpu_state(env
, CPU_DUMP_FPU
| CPU_DUMP_CCOP
);
1782 #if defined(CONFIG_USER_ONLY)
1784 struct sigaction act
;
1785 sigfillset(&act
.sa_mask
);
1786 act
.sa_handler
= SIG_DFL
;
1787 sigaction(SIGABRT
, &act
, NULL
);
1793 CPUArchState
*cpu_copy(CPUArchState
*env
)
1795 CPUArchState
*new_env
= cpu_init(env
->cpu_model_str
);
1796 CPUArchState
*next_cpu
= new_env
->next_cpu
;
1797 int cpu_index
= new_env
->cpu_index
;
1798 #if defined(TARGET_HAS_ICE)
1803 memcpy(new_env
, env
, sizeof(CPUArchState
));
1805 /* Preserve chaining and index. */
1806 new_env
->next_cpu
= next_cpu
;
1807 new_env
->cpu_index
= cpu_index
;
1809 /* Clone all break/watchpoints.
1810 Note: Once we support ptrace with hw-debug register access, make sure
1811 BP_CPU break/watchpoints are handled correctly on clone. */
1812 QTAILQ_INIT(&env
->breakpoints
);
1813 QTAILQ_INIT(&env
->watchpoints
);
1814 #if defined(TARGET_HAS_ICE)
1815 QTAILQ_FOREACH(bp
, &env
->breakpoints
, entry
) {
1816 cpu_breakpoint_insert(new_env
, bp
->pc
, bp
->flags
, NULL
);
1818 QTAILQ_FOREACH(wp
, &env
->watchpoints
, entry
) {
1819 cpu_watchpoint_insert(new_env
, wp
->vaddr
, (~wp
->len_mask
) + 1,
1827 #if !defined(CONFIG_USER_ONLY)
1828 void tb_flush_jmp_cache(CPUArchState
*env
, target_ulong addr
)
1832 /* Discard jump cache entries for any tb which might potentially
1833 overlap the flushed page. */
1834 i
= tb_jmp_cache_hash_page(addr
- TARGET_PAGE_SIZE
);
1835 memset (&env
->tb_jmp_cache
[i
], 0,
1836 TB_JMP_PAGE_SIZE
* sizeof(TranslationBlock
*));
1838 i
= tb_jmp_cache_hash_page(addr
);
1839 memset (&env
->tb_jmp_cache
[i
], 0,
1840 TB_JMP_PAGE_SIZE
* sizeof(TranslationBlock
*));
1843 static void tlb_reset_dirty_range_all(ram_addr_t start
, ram_addr_t end
,
1848 /* we modify the TLB cache so that the dirty bit will be set again
1849 when accessing the range */
1850 start1
= (uintptr_t)qemu_safe_ram_ptr(start
);
1851 /* Check that we don't span multiple blocks - this breaks the
1852 address comparisons below. */
1853 if ((uintptr_t)qemu_safe_ram_ptr(end
- 1) - start1
1854 != (end
- 1) - start
) {
1857 cpu_tlb_reset_dirty_all(start1
, length
);
1861 /* Note: start and end must be within the same ram block. */
1862 void cpu_physical_memory_reset_dirty(ram_addr_t start
, ram_addr_t end
,
1867 start
&= TARGET_PAGE_MASK
;
1868 end
= TARGET_PAGE_ALIGN(end
);
1870 length
= end
- start
;
1873 cpu_physical_memory_mask_dirty_range(start
, length
, dirty_flags
);
1875 if (tcg_enabled()) {
1876 tlb_reset_dirty_range_all(start
, end
, length
);
1880 static int cpu_physical_memory_set_dirty_tracking(int enable
)
1883 in_migration
= enable
;
1887 hwaddr
memory_region_section_get_iotlb(CPUArchState
*env
,
1888 MemoryRegionSection
*section
,
1892 target_ulong
*address
)
1897 if (memory_region_is_ram(section
->mr
)) {
1899 iotlb
= (memory_region_get_ram_addr(section
->mr
) & TARGET_PAGE_MASK
)
1900 + memory_region_section_addr(section
, paddr
);
1901 if (!section
->readonly
) {
1902 iotlb
|= phys_section_notdirty
;
1904 iotlb
|= phys_section_rom
;
1907 /* IO handlers are currently passed a physical address.
1908 It would be nice to pass an offset from the base address
1909 of that region. This would avoid having to special case RAM,
1910 and avoid full address decoding in every device.
1911 We can't use the high bits of pd for this because
1912 IO_MEM_ROMD uses these as a ram address. */
1913 iotlb
= section
- phys_sections
;
1914 iotlb
+= memory_region_section_addr(section
, paddr
);
1917 /* Make accesses to pages with watchpoints go via the
1918 watchpoint trap routines. */
1919 QTAILQ_FOREACH(wp
, &env
->watchpoints
, entry
) {
1920 if (vaddr
== (wp
->vaddr
& TARGET_PAGE_MASK
)) {
1921 /* Avoid trapping reads of pages with a write breakpoint. */
1922 if ((prot
& PAGE_WRITE
) || (wp
->flags
& BP_MEM_READ
)) {
1923 iotlb
= phys_section_watch
+ paddr
;
1924 *address
|= TLB_MMIO
;
1935 * Walks guest process memory "regions" one by one
1936 * and calls callback function 'fn' for each region.
1939 struct walk_memory_regions_data
1941 walk_memory_regions_fn fn
;
1947 static int walk_memory_regions_end(struct walk_memory_regions_data
*data
,
1948 abi_ulong end
, int new_prot
)
1950 if (data
->start
!= -1ul) {
1951 int rc
= data
->fn(data
->priv
, data
->start
, end
, data
->prot
);
1957 data
->start
= (new_prot
? end
: -1ul);
1958 data
->prot
= new_prot
;
1963 static int walk_memory_regions_1(struct walk_memory_regions_data
*data
,
1964 abi_ulong base
, int level
, void **lp
)
1970 return walk_memory_regions_end(data
, base
, 0);
1975 for (i
= 0; i
< L2_SIZE
; ++i
) {
1976 int prot
= pd
[i
].flags
;
1978 pa
= base
| (i
<< TARGET_PAGE_BITS
);
1979 if (prot
!= data
->prot
) {
1980 rc
= walk_memory_regions_end(data
, pa
, prot
);
1988 for (i
= 0; i
< L2_SIZE
; ++i
) {
1989 pa
= base
| ((abi_ulong
)i
<<
1990 (TARGET_PAGE_BITS
+ L2_BITS
* level
));
1991 rc
= walk_memory_regions_1(data
, pa
, level
- 1, pp
+ i
);
2001 int walk_memory_regions(void *priv
, walk_memory_regions_fn fn
)
2003 struct walk_memory_regions_data data
;
2011 for (i
= 0; i
< V_L1_SIZE
; i
++) {
2012 int rc
= walk_memory_regions_1(&data
, (abi_ulong
)i
<< V_L1_SHIFT
,
2013 V_L1_SHIFT
/ L2_BITS
- 1, l1_map
+ i
);
2019 return walk_memory_regions_end(&data
, 0, 0);
2022 static int dump_region(void *priv
, abi_ulong start
,
2023 abi_ulong end
, unsigned long prot
)
2025 FILE *f
= (FILE *)priv
;
2027 (void) fprintf(f
, TARGET_ABI_FMT_lx
"-"TARGET_ABI_FMT_lx
2028 " "TARGET_ABI_FMT_lx
" %c%c%c\n",
2029 start
, end
, end
- start
,
2030 ((prot
& PAGE_READ
) ? 'r' : '-'),
2031 ((prot
& PAGE_WRITE
) ? 'w' : '-'),
2032 ((prot
& PAGE_EXEC
) ? 'x' : '-'));
2037 /* dump memory mappings */
2038 void page_dump(FILE *f
)
2040 (void) fprintf(f
, "%-8s %-8s %-8s %s\n",
2041 "start", "end", "size", "prot");
2042 walk_memory_regions(f
, dump_region
);
2045 int page_get_flags(target_ulong address
)
2049 p
= page_find(address
>> TARGET_PAGE_BITS
);
2055 /* Modify the flags of a page and invalidate the code if necessary.
2056 The flag PAGE_WRITE_ORG is positioned automatically depending
2057 on PAGE_WRITE. The mmap_lock should already be held. */
2058 void page_set_flags(target_ulong start
, target_ulong end
, int flags
)
2060 target_ulong addr
, len
;
2062 /* This function should never be called with addresses outside the
2063 guest address space. If this assert fires, it probably indicates
2064 a missing call to h2g_valid. */
2065 #if TARGET_ABI_BITS > L1_MAP_ADDR_SPACE_BITS
2066 assert(end
< ((abi_ulong
)1 << L1_MAP_ADDR_SPACE_BITS
));
2068 assert(start
< end
);
2070 start
= start
& TARGET_PAGE_MASK
;
2071 end
= TARGET_PAGE_ALIGN(end
);
2073 if (flags
& PAGE_WRITE
) {
2074 flags
|= PAGE_WRITE_ORG
;
2077 for (addr
= start
, len
= end
- start
;
2079 len
-= TARGET_PAGE_SIZE
, addr
+= TARGET_PAGE_SIZE
) {
2080 PageDesc
*p
= page_find_alloc(addr
>> TARGET_PAGE_BITS
, 1);
2082 /* If the write protection bit is set, then we invalidate
2084 if (!(p
->flags
& PAGE_WRITE
) &&
2085 (flags
& PAGE_WRITE
) &&
2087 tb_invalidate_phys_page(addr
, 0, NULL
);
2093 int page_check_range(target_ulong start
, target_ulong len
, int flags
)
2099 /* This function should never be called with addresses outside the
2100 guest address space. If this assert fires, it probably indicates
2101 a missing call to h2g_valid. */
2102 #if TARGET_ABI_BITS > L1_MAP_ADDR_SPACE_BITS
2103 assert(start
< ((abi_ulong
)1 << L1_MAP_ADDR_SPACE_BITS
));
2109 if (start
+ len
- 1 < start
) {
2110 /* We've wrapped around. */
2114 end
= TARGET_PAGE_ALIGN(start
+len
); /* must do before we loose bits in the next step */
2115 start
= start
& TARGET_PAGE_MASK
;
2117 for (addr
= start
, len
= end
- start
;
2119 len
-= TARGET_PAGE_SIZE
, addr
+= TARGET_PAGE_SIZE
) {
2120 p
= page_find(addr
>> TARGET_PAGE_BITS
);
2123 if( !(p
->flags
& PAGE_VALID
) )
2126 if ((flags
& PAGE_READ
) && !(p
->flags
& PAGE_READ
))
2128 if (flags
& PAGE_WRITE
) {
2129 if (!(p
->flags
& PAGE_WRITE_ORG
))
2131 /* unprotect the page if it was put read-only because it
2132 contains translated code */
2133 if (!(p
->flags
& PAGE_WRITE
)) {
2134 if (!page_unprotect(addr
, 0, NULL
))
2143 /* called from signal handler: invalidate the code and unprotect the
2144 page. Return TRUE if the fault was successfully handled. */
2145 int page_unprotect(target_ulong address
, uintptr_t pc
, void *puc
)
2149 target_ulong host_start
, host_end
, addr
;
2151 /* Technically this isn't safe inside a signal handler. However we
2152 know this only ever happens in a synchronous SEGV handler, so in
2153 practice it seems to be ok. */
2156 p
= page_find(address
>> TARGET_PAGE_BITS
);
2162 /* if the page was really writable, then we change its
2163 protection back to writable */
2164 if ((p
->flags
& PAGE_WRITE_ORG
) && !(p
->flags
& PAGE_WRITE
)) {
2165 host_start
= address
& qemu_host_page_mask
;
2166 host_end
= host_start
+ qemu_host_page_size
;
2169 for (addr
= host_start
; addr
< host_end
; addr
+= TARGET_PAGE_SIZE
) {
2170 p
= page_find(addr
>> TARGET_PAGE_BITS
);
2171 p
->flags
|= PAGE_WRITE
;
2174 /* and since the content will be modified, we must invalidate
2175 the corresponding translated code. */
2176 tb_invalidate_phys_page(addr
, pc
, puc
);
2177 #ifdef DEBUG_TB_CHECK
2178 tb_invalidate_check(addr
);
2181 mprotect((void *)g2h(host_start
), qemu_host_page_size
,
2190 #endif /* defined(CONFIG_USER_ONLY) */
2192 #if !defined(CONFIG_USER_ONLY)
2194 #define SUBPAGE_IDX(addr) ((addr) & ~TARGET_PAGE_MASK)
2195 typedef struct subpage_t
{
2198 uint16_t sub_section
[TARGET_PAGE_SIZE
];
2201 static int subpage_register (subpage_t
*mmio
, uint32_t start
, uint32_t end
,
2203 static subpage_t
*subpage_init(hwaddr base
);
2204 static void destroy_page_desc(uint16_t section_index
)
2206 MemoryRegionSection
*section
= &phys_sections
[section_index
];
2207 MemoryRegion
*mr
= section
->mr
;
2210 subpage_t
*subpage
= container_of(mr
, subpage_t
, iomem
);
2211 memory_region_destroy(&subpage
->iomem
);
2216 static void destroy_l2_mapping(PhysPageEntry
*lp
, unsigned level
)
2221 if (lp
->ptr
== PHYS_MAP_NODE_NIL
) {
2225 p
= phys_map_nodes
[lp
->ptr
];
2226 for (i
= 0; i
< L2_SIZE
; ++i
) {
2227 if (!p
[i
].is_leaf
) {
2228 destroy_l2_mapping(&p
[i
], level
- 1);
2230 destroy_page_desc(p
[i
].ptr
);
2234 lp
->ptr
= PHYS_MAP_NODE_NIL
;
2237 static void destroy_all_mappings(AddressSpaceDispatch
*d
)
2239 destroy_l2_mapping(&d
->phys_map
, P_L2_LEVELS
- 1);
2240 phys_map_nodes_reset();
2243 static uint16_t phys_section_add(MemoryRegionSection
*section
)
2245 if (phys_sections_nb
== phys_sections_nb_alloc
) {
2246 phys_sections_nb_alloc
= MAX(phys_sections_nb_alloc
* 2, 16);
2247 phys_sections
= g_renew(MemoryRegionSection
, phys_sections
,
2248 phys_sections_nb_alloc
);
2250 phys_sections
[phys_sections_nb
] = *section
;
2251 return phys_sections_nb
++;
2254 static void phys_sections_clear(void)
2256 phys_sections_nb
= 0;
2259 static void register_subpage(AddressSpaceDispatch
*d
, MemoryRegionSection
*section
)
2262 hwaddr base
= section
->offset_within_address_space
2264 MemoryRegionSection
*existing
= phys_page_find(d
, base
>> TARGET_PAGE_BITS
);
2265 MemoryRegionSection subsection
= {
2266 .offset_within_address_space
= base
,
2267 .size
= TARGET_PAGE_SIZE
,
2271 assert(existing
->mr
->subpage
|| existing
->mr
== &io_mem_unassigned
);
2273 if (!(existing
->mr
->subpage
)) {
2274 subpage
= subpage_init(base
);
2275 subsection
.mr
= &subpage
->iomem
;
2276 phys_page_set(d
, base
>> TARGET_PAGE_BITS
, 1,
2277 phys_section_add(&subsection
));
2279 subpage
= container_of(existing
->mr
, subpage_t
, iomem
);
2281 start
= section
->offset_within_address_space
& ~TARGET_PAGE_MASK
;
2282 end
= start
+ section
->size
- 1;
2283 subpage_register(subpage
, start
, end
, phys_section_add(section
));
2287 static void register_multipage(AddressSpaceDispatch
*d
, MemoryRegionSection
*section
)
2289 hwaddr start_addr
= section
->offset_within_address_space
;
2290 ram_addr_t size
= section
->size
;
2292 uint16_t section_index
= phys_section_add(section
);
2297 phys_page_set(d
, addr
>> TARGET_PAGE_BITS
, size
>> TARGET_PAGE_BITS
,
2301 static void mem_add(MemoryListener
*listener
, MemoryRegionSection
*section
)
2303 AddressSpaceDispatch
*d
= container_of(listener
, AddressSpaceDispatch
, listener
);
2304 MemoryRegionSection now
= *section
, remain
= *section
;
2306 if ((now
.offset_within_address_space
& ~TARGET_PAGE_MASK
)
2307 || (now
.size
< TARGET_PAGE_SIZE
)) {
2308 now
.size
= MIN(TARGET_PAGE_ALIGN(now
.offset_within_address_space
)
2309 - now
.offset_within_address_space
,
2311 register_subpage(d
, &now
);
2312 remain
.size
-= now
.size
;
2313 remain
.offset_within_address_space
+= now
.size
;
2314 remain
.offset_within_region
+= now
.size
;
2316 while (remain
.size
>= TARGET_PAGE_SIZE
) {
2318 if (remain
.offset_within_region
& ~TARGET_PAGE_MASK
) {
2319 now
.size
= TARGET_PAGE_SIZE
;
2320 register_subpage(d
, &now
);
2322 now
.size
&= TARGET_PAGE_MASK
;
2323 register_multipage(d
, &now
);
2325 remain
.size
-= now
.size
;
2326 remain
.offset_within_address_space
+= now
.size
;
2327 remain
.offset_within_region
+= now
.size
;
2331 register_subpage(d
, &now
);
2335 void qemu_flush_coalesced_mmio_buffer(void)
2338 kvm_flush_coalesced_mmio_buffer();
2341 #if defined(__linux__) && !defined(TARGET_S390X)
2343 #include <sys/vfs.h>
2345 #define HUGETLBFS_MAGIC 0x958458f6
2347 static long gethugepagesize(const char *path
)
2353 ret
= statfs(path
, &fs
);
2354 } while (ret
!= 0 && errno
== EINTR
);
2361 if (fs
.f_type
!= HUGETLBFS_MAGIC
)
2362 fprintf(stderr
, "Warning: path not on HugeTLBFS: %s\n", path
);
2367 static void *file_ram_alloc(RAMBlock
*block
,
2377 unsigned long hpagesize
;
2379 hpagesize
= gethugepagesize(path
);
2384 if (memory
< hpagesize
) {
2388 if (kvm_enabled() && !kvm_has_sync_mmu()) {
2389 fprintf(stderr
, "host lacks kvm mmu notifiers, -mem-path unsupported\n");
2393 if (asprintf(&filename
, "%s/qemu_back_mem.XXXXXX", path
) == -1) {
2397 fd
= mkstemp(filename
);
2399 perror("unable to create backing store for hugepages");
2406 memory
= (memory
+hpagesize
-1) & ~(hpagesize
-1);
2409 * ftruncate is not supported by hugetlbfs in older
2410 * hosts, so don't bother bailing out on errors.
2411 * If anything goes wrong with it under other filesystems,
2414 if (ftruncate(fd
, memory
))
2415 perror("ftruncate");
2418 /* NB: MAP_POPULATE won't exhaustively alloc all phys pages in the case
2419 * MAP_PRIVATE is requested. For mem_prealloc we mmap as MAP_SHARED
2420 * to sidestep this quirk.
2422 flags
= mem_prealloc
? MAP_POPULATE
| MAP_SHARED
: MAP_PRIVATE
;
2423 area
= mmap(0, memory
, PROT_READ
| PROT_WRITE
, flags
, fd
, 0);
2425 area
= mmap(0, memory
, PROT_READ
| PROT_WRITE
, MAP_PRIVATE
, fd
, 0);
2427 if (area
== MAP_FAILED
) {
2428 perror("file_ram_alloc: can't mmap RAM pages");
2437 static ram_addr_t
find_ram_offset(ram_addr_t size
)
2439 RAMBlock
*block
, *next_block
;
2440 ram_addr_t offset
= RAM_ADDR_MAX
, mingap
= RAM_ADDR_MAX
;
2442 if (QLIST_EMPTY(&ram_list
.blocks
))
2445 QLIST_FOREACH(block
, &ram_list
.blocks
, next
) {
2446 ram_addr_t end
, next
= RAM_ADDR_MAX
;
2448 end
= block
->offset
+ block
->length
;
2450 QLIST_FOREACH(next_block
, &ram_list
.blocks
, next
) {
2451 if (next_block
->offset
>= end
) {
2452 next
= MIN(next
, next_block
->offset
);
2455 if (next
- end
>= size
&& next
- end
< mingap
) {
2457 mingap
= next
- end
;
2461 if (offset
== RAM_ADDR_MAX
) {
2462 fprintf(stderr
, "Failed to find gap of requested size: %" PRIu64
"\n",
2470 ram_addr_t
last_ram_offset(void)
2473 ram_addr_t last
= 0;
2475 QLIST_FOREACH(block
, &ram_list
.blocks
, next
)
2476 last
= MAX(last
, block
->offset
+ block
->length
);
2481 static void qemu_ram_setup_dump(void *addr
, ram_addr_t size
)
2484 QemuOpts
*machine_opts
;
2486 /* Use MADV_DONTDUMP, if user doesn't want the guest memory in the core */
2487 machine_opts
= qemu_opts_find(qemu_find_opts("machine"), 0);
2489 !qemu_opt_get_bool(machine_opts
, "dump-guest-core", true)) {
2490 ret
= qemu_madvise(addr
, size
, QEMU_MADV_DONTDUMP
);
2492 perror("qemu_madvise");
2493 fprintf(stderr
, "madvise doesn't support MADV_DONTDUMP, "
2494 "but dump_guest_core=off specified\n");
2499 void qemu_ram_set_idstr(ram_addr_t addr
, const char *name
, DeviceState
*dev
)
2501 RAMBlock
*new_block
, *block
;
2504 QLIST_FOREACH(block
, &ram_list
.blocks
, next
) {
2505 if (block
->offset
== addr
) {
2511 assert(!new_block
->idstr
[0]);
2514 char *id
= qdev_get_dev_path(dev
);
2516 snprintf(new_block
->idstr
, sizeof(new_block
->idstr
), "%s/", id
);
2520 pstrcat(new_block
->idstr
, sizeof(new_block
->idstr
), name
);
2522 QLIST_FOREACH(block
, &ram_list
.blocks
, next
) {
2523 if (block
!= new_block
&& !strcmp(block
->idstr
, new_block
->idstr
)) {
2524 fprintf(stderr
, "RAMBlock \"%s\" already registered, abort!\n",
2531 static int memory_try_enable_merging(void *addr
, size_t len
)
2535 opts
= qemu_opts_find(qemu_find_opts("machine"), 0);
2536 if (opts
&& !qemu_opt_get_bool(opts
, "mem-merge", true)) {
2537 /* disabled by the user */
2541 return qemu_madvise(addr
, len
, QEMU_MADV_MERGEABLE
);
2544 ram_addr_t
qemu_ram_alloc_from_ptr(ram_addr_t size
, void *host
,
2547 RAMBlock
*new_block
;
2549 size
= TARGET_PAGE_ALIGN(size
);
2550 new_block
= g_malloc0(sizeof(*new_block
));
2553 new_block
->offset
= find_ram_offset(size
);
2555 new_block
->host
= host
;
2556 new_block
->flags
|= RAM_PREALLOC_MASK
;
2559 #if defined (__linux__) && !defined(TARGET_S390X)
2560 new_block
->host
= file_ram_alloc(new_block
, size
, mem_path
);
2561 if (!new_block
->host
) {
2562 new_block
->host
= qemu_vmalloc(size
);
2563 memory_try_enable_merging(new_block
->host
, size
);
2566 fprintf(stderr
, "-mem-path option unsupported\n");
2570 if (xen_enabled()) {
2571 xen_ram_alloc(new_block
->offset
, size
, mr
);
2572 } else if (kvm_enabled()) {
2573 /* some s390/kvm configurations have special constraints */
2574 new_block
->host
= kvm_vmalloc(size
);
2576 new_block
->host
= qemu_vmalloc(size
);
2578 memory_try_enable_merging(new_block
->host
, size
);
2581 new_block
->length
= size
;
2583 QLIST_INSERT_HEAD(&ram_list
.blocks
, new_block
, next
);
2585 ram_list
.phys_dirty
= g_realloc(ram_list
.phys_dirty
,
2586 last_ram_offset() >> TARGET_PAGE_BITS
);
2587 memset(ram_list
.phys_dirty
+ (new_block
->offset
>> TARGET_PAGE_BITS
),
2588 0, size
>> TARGET_PAGE_BITS
);
2589 cpu_physical_memory_set_dirty_range(new_block
->offset
, size
, 0xff);
2591 qemu_ram_setup_dump(new_block
->host
, size
);
2592 qemu_madvise(new_block
->host
, size
, QEMU_MADV_HUGEPAGE
);
2595 kvm_setup_guest_memory(new_block
->host
, size
);
2597 return new_block
->offset
;
2600 ram_addr_t
qemu_ram_alloc(ram_addr_t size
, MemoryRegion
*mr
)
2602 return qemu_ram_alloc_from_ptr(size
, NULL
, mr
);
2605 void qemu_ram_free_from_ptr(ram_addr_t addr
)
2609 QLIST_FOREACH(block
, &ram_list
.blocks
, next
) {
2610 if (addr
== block
->offset
) {
2611 QLIST_REMOVE(block
, next
);
2618 void qemu_ram_free(ram_addr_t addr
)
2622 QLIST_FOREACH(block
, &ram_list
.blocks
, next
) {
2623 if (addr
== block
->offset
) {
2624 QLIST_REMOVE(block
, next
);
2625 if (block
->flags
& RAM_PREALLOC_MASK
) {
2627 } else if (mem_path
) {
2628 #if defined (__linux__) && !defined(TARGET_S390X)
2630 munmap(block
->host
, block
->length
);
2633 qemu_vfree(block
->host
);
2639 #if defined(TARGET_S390X) && defined(CONFIG_KVM)
2640 munmap(block
->host
, block
->length
);
2642 if (xen_enabled()) {
2643 xen_invalidate_map_cache_entry(block
->host
);
2645 qemu_vfree(block
->host
);
2657 void qemu_ram_remap(ram_addr_t addr
, ram_addr_t length
)
2664 QLIST_FOREACH(block
, &ram_list
.blocks
, next
) {
2665 offset
= addr
- block
->offset
;
2666 if (offset
< block
->length
) {
2667 vaddr
= block
->host
+ offset
;
2668 if (block
->flags
& RAM_PREALLOC_MASK
) {
2672 munmap(vaddr
, length
);
2674 #if defined(__linux__) && !defined(TARGET_S390X)
2677 flags
|= mem_prealloc
? MAP_POPULATE
| MAP_SHARED
:
2680 flags
|= MAP_PRIVATE
;
2682 area
= mmap(vaddr
, length
, PROT_READ
| PROT_WRITE
,
2683 flags
, block
->fd
, offset
);
2685 flags
|= MAP_PRIVATE
| MAP_ANONYMOUS
;
2686 area
= mmap(vaddr
, length
, PROT_READ
| PROT_WRITE
,
2693 #if defined(TARGET_S390X) && defined(CONFIG_KVM)
2694 flags
|= MAP_SHARED
| MAP_ANONYMOUS
;
2695 area
= mmap(vaddr
, length
, PROT_EXEC
|PROT_READ
|PROT_WRITE
,
2698 flags
|= MAP_PRIVATE
| MAP_ANONYMOUS
;
2699 area
= mmap(vaddr
, length
, PROT_READ
| PROT_WRITE
,
2703 if (area
!= vaddr
) {
2704 fprintf(stderr
, "Could not remap addr: "
2705 RAM_ADDR_FMT
"@" RAM_ADDR_FMT
"\n",
2709 memory_try_enable_merging(vaddr
, length
);
2710 qemu_ram_setup_dump(vaddr
, length
);
2716 #endif /* !_WIN32 */
2718 /* Return a host pointer to ram allocated with qemu_ram_alloc.
2719 With the exception of the softmmu code in this file, this should
2720 only be used for local memory (e.g. video ram) that the device owns,
2721 and knows it isn't going to access beyond the end of the block.
2723 It should not be used for general purpose DMA.
2724 Use cpu_physical_memory_map/cpu_physical_memory_rw instead.
2726 void *qemu_get_ram_ptr(ram_addr_t addr
)
2730 QLIST_FOREACH(block
, &ram_list
.blocks
, next
) {
2731 if (addr
- block
->offset
< block
->length
) {
2732 /* Move this entry to to start of the list. */
2733 if (block
!= QLIST_FIRST(&ram_list
.blocks
)) {
2734 QLIST_REMOVE(block
, next
);
2735 QLIST_INSERT_HEAD(&ram_list
.blocks
, block
, next
);
2737 if (xen_enabled()) {
2738 /* We need to check if the requested address is in the RAM
2739 * because we don't want to map the entire memory in QEMU.
2740 * In that case just map until the end of the page.
2742 if (block
->offset
== 0) {
2743 return xen_map_cache(addr
, 0, 0);
2744 } else if (block
->host
== NULL
) {
2746 xen_map_cache(block
->offset
, block
->length
, 1);
2749 return block
->host
+ (addr
- block
->offset
);
2753 fprintf(stderr
, "Bad ram offset %" PRIx64
"\n", (uint64_t)addr
);
2759 /* Return a host pointer to ram allocated with qemu_ram_alloc.
2760 * Same as qemu_get_ram_ptr but avoid reordering ramblocks.
2762 static void *qemu_safe_ram_ptr(ram_addr_t addr
)
2766 QLIST_FOREACH(block
, &ram_list
.blocks
, next
) {
2767 if (addr
- block
->offset
< block
->length
) {
2768 if (xen_enabled()) {
2769 /* We need to check if the requested address is in the RAM
2770 * because we don't want to map the entire memory in QEMU.
2771 * In that case just map until the end of the page.
2773 if (block
->offset
== 0) {
2774 return xen_map_cache(addr
, 0, 0);
2775 } else if (block
->host
== NULL
) {
2777 xen_map_cache(block
->offset
, block
->length
, 1);
2780 return block
->host
+ (addr
- block
->offset
);
2784 fprintf(stderr
, "Bad ram offset %" PRIx64
"\n", (uint64_t)addr
);
2790 /* Return a host pointer to guest's ram. Similar to qemu_get_ram_ptr
2791 * but takes a size argument */
2792 static void *qemu_ram_ptr_length(ram_addr_t addr
, ram_addr_t
*size
)
2797 if (xen_enabled()) {
2798 return xen_map_cache(addr
, *size
, 1);
2802 QLIST_FOREACH(block
, &ram_list
.blocks
, next
) {
2803 if (addr
- block
->offset
< block
->length
) {
2804 if (addr
- block
->offset
+ *size
> block
->length
)
2805 *size
= block
->length
- addr
+ block
->offset
;
2806 return block
->host
+ (addr
- block
->offset
);
2810 fprintf(stderr
, "Bad ram offset %" PRIx64
"\n", (uint64_t)addr
);
2815 void qemu_put_ram_ptr(void *addr
)
2817 trace_qemu_put_ram_ptr(addr
);
2820 int qemu_ram_addr_from_host(void *ptr
, ram_addr_t
*ram_addr
)
2823 uint8_t *host
= ptr
;
2825 if (xen_enabled()) {
2826 *ram_addr
= xen_ram_addr_from_mapcache(ptr
);
2830 QLIST_FOREACH(block
, &ram_list
.blocks
, next
) {
2831 /* This case append when the block is not mapped. */
2832 if (block
->host
== NULL
) {
2835 if (host
- block
->host
< block
->length
) {
2836 *ram_addr
= block
->offset
+ (host
- block
->host
);
2844 /* Some of the softmmu routines need to translate from a host pointer
2845 (typically a TLB entry) back to a ram offset. */
2846 ram_addr_t
qemu_ram_addr_from_host_nofail(void *ptr
)
2848 ram_addr_t ram_addr
;
2850 if (qemu_ram_addr_from_host(ptr
, &ram_addr
)) {
2851 fprintf(stderr
, "Bad ram pointer %p\n", ptr
);
2857 static uint64_t unassigned_mem_read(void *opaque
, hwaddr addr
,
2860 #ifdef DEBUG_UNASSIGNED
2861 printf("Unassigned mem read " TARGET_FMT_plx
"\n", addr
);
2863 #if defined(TARGET_ALPHA) || defined(TARGET_SPARC) || defined(TARGET_MICROBLAZE)
2864 cpu_unassigned_access(cpu_single_env
, addr
, 0, 0, 0, size
);
2869 static void unassigned_mem_write(void *opaque
, hwaddr addr
,
2870 uint64_t val
, unsigned size
)
2872 #ifdef DEBUG_UNASSIGNED
2873 printf("Unassigned mem write " TARGET_FMT_plx
" = 0x%"PRIx64
"\n", addr
, val
);
2875 #if defined(TARGET_ALPHA) || defined(TARGET_SPARC) || defined(TARGET_MICROBLAZE)
2876 cpu_unassigned_access(cpu_single_env
, addr
, 1, 0, 0, size
);
2880 static const MemoryRegionOps unassigned_mem_ops
= {
2881 .read
= unassigned_mem_read
,
2882 .write
= unassigned_mem_write
,
2883 .endianness
= DEVICE_NATIVE_ENDIAN
,
2886 static uint64_t error_mem_read(void *opaque
, hwaddr addr
,
2892 static void error_mem_write(void *opaque
, hwaddr addr
,
2893 uint64_t value
, unsigned size
)
2898 static const MemoryRegionOps error_mem_ops
= {
2899 .read
= error_mem_read
,
2900 .write
= error_mem_write
,
2901 .endianness
= DEVICE_NATIVE_ENDIAN
,
2904 static const MemoryRegionOps rom_mem_ops
= {
2905 .read
= error_mem_read
,
2906 .write
= unassigned_mem_write
,
2907 .endianness
= DEVICE_NATIVE_ENDIAN
,
2910 static void notdirty_mem_write(void *opaque
, hwaddr ram_addr
,
2911 uint64_t val
, unsigned size
)
2914 dirty_flags
= cpu_physical_memory_get_dirty_flags(ram_addr
);
2915 if (!(dirty_flags
& CODE_DIRTY_FLAG
)) {
2916 #if !defined(CONFIG_USER_ONLY)
2917 tb_invalidate_phys_page_fast(ram_addr
, size
);
2918 dirty_flags
= cpu_physical_memory_get_dirty_flags(ram_addr
);
2923 stb_p(qemu_get_ram_ptr(ram_addr
), val
);
2926 stw_p(qemu_get_ram_ptr(ram_addr
), val
);
2929 stl_p(qemu_get_ram_ptr(ram_addr
), val
);
2934 dirty_flags
|= (0xff & ~CODE_DIRTY_FLAG
);
2935 cpu_physical_memory_set_dirty_flags(ram_addr
, dirty_flags
);
2936 /* we remove the notdirty callback only if the code has been
2938 if (dirty_flags
== 0xff)
2939 tlb_set_dirty(cpu_single_env
, cpu_single_env
->mem_io_vaddr
);
2942 static const MemoryRegionOps notdirty_mem_ops
= {
2943 .read
= error_mem_read
,
2944 .write
= notdirty_mem_write
,
2945 .endianness
= DEVICE_NATIVE_ENDIAN
,
2948 /* Generate a debug exception if a watchpoint has been hit. */
2949 static void check_watchpoint(int offset
, int len_mask
, int flags
)
2951 CPUArchState
*env
= cpu_single_env
;
2952 target_ulong pc
, cs_base
;
2953 TranslationBlock
*tb
;
2958 if (env
->watchpoint_hit
) {
2959 /* We re-entered the check after replacing the TB. Now raise
2960 * the debug interrupt so that is will trigger after the
2961 * current instruction. */
2962 cpu_interrupt(env
, CPU_INTERRUPT_DEBUG
);
2965 vaddr
= (env
->mem_io_vaddr
& TARGET_PAGE_MASK
) + offset
;
2966 QTAILQ_FOREACH(wp
, &env
->watchpoints
, entry
) {
2967 if ((vaddr
== (wp
->vaddr
& len_mask
) ||
2968 (vaddr
& wp
->len_mask
) == wp
->vaddr
) && (wp
->flags
& flags
)) {
2969 wp
->flags
|= BP_WATCHPOINT_HIT
;
2970 if (!env
->watchpoint_hit
) {
2971 env
->watchpoint_hit
= wp
;
2972 tb
= tb_find_pc(env
->mem_io_pc
);
2974 cpu_abort(env
, "check_watchpoint: could not find TB for "
2975 "pc=%p", (void *)env
->mem_io_pc
);
2977 cpu_restore_state(tb
, env
, env
->mem_io_pc
);
2978 tb_phys_invalidate(tb
, -1);
2979 if (wp
->flags
& BP_STOP_BEFORE_ACCESS
) {
2980 env
->exception_index
= EXCP_DEBUG
;
2983 cpu_get_tb_cpu_state(env
, &pc
, &cs_base
, &cpu_flags
);
2984 tb_gen_code(env
, pc
, cs_base
, cpu_flags
, 1);
2985 cpu_resume_from_signal(env
, NULL
);
2989 wp
->flags
&= ~BP_WATCHPOINT_HIT
;
2994 /* Watchpoint access routines. Watchpoints are inserted using TLB tricks,
2995 so these check for a hit then pass through to the normal out-of-line
2997 static uint64_t watch_mem_read(void *opaque
, hwaddr addr
,
3000 check_watchpoint(addr
& ~TARGET_PAGE_MASK
, ~(size
- 1), BP_MEM_READ
);
3002 case 1: return ldub_phys(addr
);
3003 case 2: return lduw_phys(addr
);
3004 case 4: return ldl_phys(addr
);
3009 static void watch_mem_write(void *opaque
, hwaddr addr
,
3010 uint64_t val
, unsigned size
)
3012 check_watchpoint(addr
& ~TARGET_PAGE_MASK
, ~(size
- 1), BP_MEM_WRITE
);
3015 stb_phys(addr
, val
);
3018 stw_phys(addr
, val
);
3021 stl_phys(addr
, val
);
3027 static const MemoryRegionOps watch_mem_ops
= {
3028 .read
= watch_mem_read
,
3029 .write
= watch_mem_write
,
3030 .endianness
= DEVICE_NATIVE_ENDIAN
,
3033 static uint64_t subpage_read(void *opaque
, hwaddr addr
,
3036 subpage_t
*mmio
= opaque
;
3037 unsigned int idx
= SUBPAGE_IDX(addr
);
3038 MemoryRegionSection
*section
;
3039 #if defined(DEBUG_SUBPAGE)
3040 printf("%s: subpage %p len %d addr " TARGET_FMT_plx
" idx %d\n", __func__
,
3041 mmio
, len
, addr
, idx
);
3044 section
= &phys_sections
[mmio
->sub_section
[idx
]];
3046 addr
-= section
->offset_within_address_space
;
3047 addr
+= section
->offset_within_region
;
3048 return io_mem_read(section
->mr
, addr
, len
);
3051 static void subpage_write(void *opaque
, hwaddr addr
,
3052 uint64_t value
, unsigned len
)
3054 subpage_t
*mmio
= opaque
;
3055 unsigned int idx
= SUBPAGE_IDX(addr
);
3056 MemoryRegionSection
*section
;
3057 #if defined(DEBUG_SUBPAGE)
3058 printf("%s: subpage %p len %d addr " TARGET_FMT_plx
3059 " idx %d value %"PRIx64
"\n",
3060 __func__
, mmio
, len
, addr
, idx
, value
);
3063 section
= &phys_sections
[mmio
->sub_section
[idx
]];
3065 addr
-= section
->offset_within_address_space
;
3066 addr
+= section
->offset_within_region
;
3067 io_mem_write(section
->mr
, addr
, value
, len
);
3070 static const MemoryRegionOps subpage_ops
= {
3071 .read
= subpage_read
,
3072 .write
= subpage_write
,
3073 .endianness
= DEVICE_NATIVE_ENDIAN
,
3076 static uint64_t subpage_ram_read(void *opaque
, hwaddr addr
,
3079 ram_addr_t raddr
= addr
;
3080 void *ptr
= qemu_get_ram_ptr(raddr
);
3082 case 1: return ldub_p(ptr
);
3083 case 2: return lduw_p(ptr
);
3084 case 4: return ldl_p(ptr
);
3089 static void subpage_ram_write(void *opaque
, hwaddr addr
,
3090 uint64_t value
, unsigned size
)
3092 ram_addr_t raddr
= addr
;
3093 void *ptr
= qemu_get_ram_ptr(raddr
);
3095 case 1: return stb_p(ptr
, value
);
3096 case 2: return stw_p(ptr
, value
);
3097 case 4: return stl_p(ptr
, value
);
3102 static const MemoryRegionOps subpage_ram_ops
= {
3103 .read
= subpage_ram_read
,
3104 .write
= subpage_ram_write
,
3105 .endianness
= DEVICE_NATIVE_ENDIAN
,
3108 static int subpage_register (subpage_t
*mmio
, uint32_t start
, uint32_t end
,
3113 if (start
>= TARGET_PAGE_SIZE
|| end
>= TARGET_PAGE_SIZE
)
3115 idx
= SUBPAGE_IDX(start
);
3116 eidx
= SUBPAGE_IDX(end
);
3117 #if defined(DEBUG_SUBPAGE)
3118 printf("%s: %p start %08x end %08x idx %08x eidx %08x mem %ld\n", __func__
,
3119 mmio
, start
, end
, idx
, eidx
, memory
);
3121 if (memory_region_is_ram(phys_sections
[section
].mr
)) {
3122 MemoryRegionSection new_section
= phys_sections
[section
];
3123 new_section
.mr
= &io_mem_subpage_ram
;
3124 section
= phys_section_add(&new_section
);
3126 for (; idx
<= eidx
; idx
++) {
3127 mmio
->sub_section
[idx
] = section
;
3133 static subpage_t
*subpage_init(hwaddr base
)
3137 mmio
= g_malloc0(sizeof(subpage_t
));
3140 memory_region_init_io(&mmio
->iomem
, &subpage_ops
, mmio
,
3141 "subpage", TARGET_PAGE_SIZE
);
3142 mmio
->iomem
.subpage
= true;
3143 #if defined(DEBUG_SUBPAGE)
3144 printf("%s: %p base " TARGET_FMT_plx
" len %08x %d\n", __func__
,
3145 mmio
, base
, TARGET_PAGE_SIZE
, subpage_memory
);
3147 subpage_register(mmio
, 0, TARGET_PAGE_SIZE
-1, phys_section_unassigned
);
3152 static uint16_t dummy_section(MemoryRegion
*mr
)
3154 MemoryRegionSection section
= {
3156 .offset_within_address_space
= 0,
3157 .offset_within_region
= 0,
3161 return phys_section_add(§ion
);
3164 MemoryRegion
*iotlb_to_region(hwaddr index
)
3166 return phys_sections
[index
& ~TARGET_PAGE_MASK
].mr
;
3169 static void io_mem_init(void)
3171 memory_region_init_io(&io_mem_ram
, &error_mem_ops
, NULL
, "ram", UINT64_MAX
);
3172 memory_region_init_io(&io_mem_rom
, &rom_mem_ops
, NULL
, "rom", UINT64_MAX
);
3173 memory_region_init_io(&io_mem_unassigned
, &unassigned_mem_ops
, NULL
,
3174 "unassigned", UINT64_MAX
);
3175 memory_region_init_io(&io_mem_notdirty
, ¬dirty_mem_ops
, NULL
,
3176 "notdirty", UINT64_MAX
);
3177 memory_region_init_io(&io_mem_subpage_ram
, &subpage_ram_ops
, NULL
,
3178 "subpage-ram", UINT64_MAX
);
3179 memory_region_init_io(&io_mem_watch
, &watch_mem_ops
, NULL
,
3180 "watch", UINT64_MAX
);
3183 static void mem_begin(MemoryListener
*listener
)
3185 AddressSpaceDispatch
*d
= container_of(listener
, AddressSpaceDispatch
, listener
);
3187 destroy_all_mappings(d
);
3188 d
->phys_map
.ptr
= PHYS_MAP_NODE_NIL
;
3191 static void core_begin(MemoryListener
*listener
)
3193 phys_sections_clear();
3194 phys_section_unassigned
= dummy_section(&io_mem_unassigned
);
3195 phys_section_notdirty
= dummy_section(&io_mem_notdirty
);
3196 phys_section_rom
= dummy_section(&io_mem_rom
);
3197 phys_section_watch
= dummy_section(&io_mem_watch
);
3200 static void tcg_commit(MemoryListener
*listener
)
3204 /* since each CPU stores ram addresses in its TLB cache, we must
3205 reset the modified entries */
3207 for(env
= first_cpu
; env
!= NULL
; env
= env
->next_cpu
) {
3212 static void core_log_global_start(MemoryListener
*listener
)
3214 cpu_physical_memory_set_dirty_tracking(1);
3217 static void core_log_global_stop(MemoryListener
*listener
)
3219 cpu_physical_memory_set_dirty_tracking(0);
3222 static void io_region_add(MemoryListener
*listener
,
3223 MemoryRegionSection
*section
)
3225 MemoryRegionIORange
*mrio
= g_new(MemoryRegionIORange
, 1);
3227 mrio
->mr
= section
->mr
;
3228 mrio
->offset
= section
->offset_within_region
;
3229 iorange_init(&mrio
->iorange
, &memory_region_iorange_ops
,
3230 section
->offset_within_address_space
, section
->size
);
3231 ioport_register(&mrio
->iorange
);
3234 static void io_region_del(MemoryListener
*listener
,
3235 MemoryRegionSection
*section
)
3237 isa_unassign_ioport(section
->offset_within_address_space
, section
->size
);
3240 static MemoryListener core_memory_listener
= {
3241 .begin
= core_begin
,
3242 .log_global_start
= core_log_global_start
,
3243 .log_global_stop
= core_log_global_stop
,
3247 static MemoryListener io_memory_listener
= {
3248 .region_add
= io_region_add
,
3249 .region_del
= io_region_del
,
3253 static MemoryListener tcg_memory_listener
= {
3254 .commit
= tcg_commit
,
3257 void address_space_init_dispatch(AddressSpace
*as
)
3259 AddressSpaceDispatch
*d
= g_new(AddressSpaceDispatch
, 1);
3261 d
->phys_map
= (PhysPageEntry
) { .ptr
= PHYS_MAP_NODE_NIL
, .is_leaf
= 0 };
3262 d
->listener
= (MemoryListener
) {
3264 .region_add
= mem_add
,
3265 .region_nop
= mem_add
,
3269 memory_listener_register(&d
->listener
, as
);
3272 void address_space_destroy_dispatch(AddressSpace
*as
)
3274 AddressSpaceDispatch
*d
= as
->dispatch
;
3276 memory_listener_unregister(&d
->listener
);
3277 destroy_l2_mapping(&d
->phys_map
, P_L2_LEVELS
- 1);
3279 as
->dispatch
= NULL
;
3282 static void memory_map_init(void)
3284 system_memory
= g_malloc(sizeof(*system_memory
));
3285 memory_region_init(system_memory
, "system", INT64_MAX
);
3286 address_space_init(&address_space_memory
, system_memory
);
3287 address_space_memory
.name
= "memory";
3289 system_io
= g_malloc(sizeof(*system_io
));
3290 memory_region_init(system_io
, "io", 65536);
3291 address_space_init(&address_space_io
, system_io
);
3292 address_space_io
.name
= "I/O";
3294 memory_listener_register(&core_memory_listener
, &address_space_memory
);
3295 memory_listener_register(&io_memory_listener
, &address_space_io
);
3296 memory_listener_register(&tcg_memory_listener
, &address_space_memory
);
3299 MemoryRegion
*get_system_memory(void)
3301 return system_memory
;
3304 MemoryRegion
*get_system_io(void)
3309 #endif /* !defined(CONFIG_USER_ONLY) */
3311 /* physical memory access (slow version, mainly for debug) */
3312 #if defined(CONFIG_USER_ONLY)
3313 int cpu_memory_rw_debug(CPUArchState
*env
, target_ulong addr
,
3314 uint8_t *buf
, int len
, int is_write
)
3321 page
= addr
& TARGET_PAGE_MASK
;
3322 l
= (page
+ TARGET_PAGE_SIZE
) - addr
;
3325 flags
= page_get_flags(page
);
3326 if (!(flags
& PAGE_VALID
))
3329 if (!(flags
& PAGE_WRITE
))
3331 /* XXX: this code should not depend on lock_user */
3332 if (!(p
= lock_user(VERIFY_WRITE
, addr
, l
, 0)))
3335 unlock_user(p
, addr
, l
);
3337 if (!(flags
& PAGE_READ
))
3339 /* XXX: this code should not depend on lock_user */
3340 if (!(p
= lock_user(VERIFY_READ
, addr
, l
, 1)))
3343 unlock_user(p
, addr
, 0);
3354 static void invalidate_and_set_dirty(hwaddr addr
,
3357 if (!cpu_physical_memory_is_dirty(addr
)) {
3358 /* invalidate code */
3359 tb_invalidate_phys_page_range(addr
, addr
+ length
, 0);
3361 cpu_physical_memory_set_dirty_flags(addr
, (0xff & ~CODE_DIRTY_FLAG
));
3363 xen_modified_memory(addr
, length
);
3366 void address_space_rw(AddressSpace
*as
, hwaddr addr
, uint8_t *buf
,
3367 int len
, bool is_write
)
3369 AddressSpaceDispatch
*d
= as
->dispatch
;
3374 MemoryRegionSection
*section
;
3377 page
= addr
& TARGET_PAGE_MASK
;
3378 l
= (page
+ TARGET_PAGE_SIZE
) - addr
;
3381 section
= phys_page_find(d
, page
>> TARGET_PAGE_BITS
);
3384 if (!memory_region_is_ram(section
->mr
)) {
3386 addr1
= memory_region_section_addr(section
, addr
);
3387 /* XXX: could force cpu_single_env to NULL to avoid
3389 if (l
>= 4 && ((addr1
& 3) == 0)) {
3390 /* 32 bit write access */
3392 io_mem_write(section
->mr
, addr1
, val
, 4);
3394 } else if (l
>= 2 && ((addr1
& 1) == 0)) {
3395 /* 16 bit write access */
3397 io_mem_write(section
->mr
, addr1
, val
, 2);
3400 /* 8 bit write access */
3402 io_mem_write(section
->mr
, addr1
, val
, 1);
3405 } else if (!section
->readonly
) {
3407 addr1
= memory_region_get_ram_addr(section
->mr
)
3408 + memory_region_section_addr(section
, addr
);
3410 ptr
= qemu_get_ram_ptr(addr1
);
3411 memcpy(ptr
, buf
, l
);
3412 invalidate_and_set_dirty(addr1
, l
);
3413 qemu_put_ram_ptr(ptr
);
3416 if (!(memory_region_is_ram(section
->mr
) ||
3417 memory_region_is_romd(section
->mr
))) {
3420 addr1
= memory_region_section_addr(section
, addr
);
3421 if (l
>= 4 && ((addr1
& 3) == 0)) {
3422 /* 32 bit read access */
3423 val
= io_mem_read(section
->mr
, addr1
, 4);
3426 } else if (l
>= 2 && ((addr1
& 1) == 0)) {
3427 /* 16 bit read access */
3428 val
= io_mem_read(section
->mr
, addr1
, 2);
3432 /* 8 bit read access */
3433 val
= io_mem_read(section
->mr
, addr1
, 1);
3439 ptr
= qemu_get_ram_ptr(section
->mr
->ram_addr
3440 + memory_region_section_addr(section
,
3442 memcpy(buf
, ptr
, l
);
3443 qemu_put_ram_ptr(ptr
);
3452 void address_space_write(AddressSpace
*as
, hwaddr addr
,
3453 const uint8_t *buf
, int len
)
3455 address_space_rw(as
, addr
, (uint8_t *)buf
, len
, true);
3459 * address_space_read: read from an address space.
3461 * @as: #AddressSpace to be accessed
3462 * @addr: address within that address space
3463 * @buf: buffer with the data transferred
3465 void address_space_read(AddressSpace
*as
, hwaddr addr
, uint8_t *buf
, int len
)
3467 address_space_rw(as
, addr
, buf
, len
, false);
3471 void cpu_physical_memory_rw(hwaddr addr
, uint8_t *buf
,
3472 int len
, int is_write
)
3474 return address_space_rw(&address_space_memory
, addr
, buf
, len
, is_write
);
3477 /* used for ROM loading : can write in RAM and ROM */
3478 void cpu_physical_memory_write_rom(hwaddr addr
,
3479 const uint8_t *buf
, int len
)
3481 AddressSpaceDispatch
*d
= address_space_memory
.dispatch
;
3485 MemoryRegionSection
*section
;
3488 page
= addr
& TARGET_PAGE_MASK
;
3489 l
= (page
+ TARGET_PAGE_SIZE
) - addr
;
3492 section
= phys_page_find(d
, page
>> TARGET_PAGE_BITS
);
3494 if (!(memory_region_is_ram(section
->mr
) ||
3495 memory_region_is_romd(section
->mr
))) {
3498 unsigned long addr1
;
3499 addr1
= memory_region_get_ram_addr(section
->mr
)
3500 + memory_region_section_addr(section
, addr
);
3502 ptr
= qemu_get_ram_ptr(addr1
);
3503 memcpy(ptr
, buf
, l
);
3504 invalidate_and_set_dirty(addr1
, l
);
3505 qemu_put_ram_ptr(ptr
);
3519 static BounceBuffer bounce
;
3521 typedef struct MapClient
{
3523 void (*callback
)(void *opaque
);
3524 QLIST_ENTRY(MapClient
) link
;
3527 static QLIST_HEAD(map_client_list
, MapClient
) map_client_list
3528 = QLIST_HEAD_INITIALIZER(map_client_list
);
3530 void *cpu_register_map_client(void *opaque
, void (*callback
)(void *opaque
))
3532 MapClient
*client
= g_malloc(sizeof(*client
));
3534 client
->opaque
= opaque
;
3535 client
->callback
= callback
;
3536 QLIST_INSERT_HEAD(&map_client_list
, client
, link
);
3540 static void cpu_unregister_map_client(void *_client
)
3542 MapClient
*client
= (MapClient
*)_client
;
3544 QLIST_REMOVE(client
, link
);
3548 static void cpu_notify_map_clients(void)
3552 while (!QLIST_EMPTY(&map_client_list
)) {
3553 client
= QLIST_FIRST(&map_client_list
);
3554 client
->callback(client
->opaque
);
3555 cpu_unregister_map_client(client
);
3559 /* Map a physical memory region into a host virtual address.
3560 * May map a subset of the requested range, given by and returned in *plen.
3561 * May return NULL if resources needed to perform the mapping are exhausted.
3562 * Use only for reads OR writes - not for read-modify-write operations.
3563 * Use cpu_register_map_client() to know when retrying the map operation is
3564 * likely to succeed.
3566 void *address_space_map(AddressSpace
*as
,
3571 AddressSpaceDispatch
*d
= as
->dispatch
;
3576 MemoryRegionSection
*section
;
3577 ram_addr_t raddr
= RAM_ADDR_MAX
;
3582 page
= addr
& TARGET_PAGE_MASK
;
3583 l
= (page
+ TARGET_PAGE_SIZE
) - addr
;
3586 section
= phys_page_find(d
, page
>> TARGET_PAGE_BITS
);
3588 if (!(memory_region_is_ram(section
->mr
) && !section
->readonly
)) {
3589 if (todo
|| bounce
.buffer
) {
3592 bounce
.buffer
= qemu_memalign(TARGET_PAGE_SIZE
, TARGET_PAGE_SIZE
);
3596 address_space_read(as
, addr
, bounce
.buffer
, l
);
3600 return bounce
.buffer
;
3603 raddr
= memory_region_get_ram_addr(section
->mr
)
3604 + memory_region_section_addr(section
, addr
);
3612 ret
= qemu_ram_ptr_length(raddr
, &rlen
);
3617 /* Unmaps a memory region previously mapped by address_space_map().
3618 * Will also mark the memory as dirty if is_write == 1. access_len gives
3619 * the amount of memory that was actually read or written by the caller.
3621 void address_space_unmap(AddressSpace
*as
, void *buffer
, hwaddr len
,
3622 int is_write
, hwaddr access_len
)
3624 if (buffer
!= bounce
.buffer
) {
3626 ram_addr_t addr1
= qemu_ram_addr_from_host_nofail(buffer
);
3627 while (access_len
) {
3629 l
= TARGET_PAGE_SIZE
;
3632 invalidate_and_set_dirty(addr1
, l
);
3637 if (xen_enabled()) {
3638 xen_invalidate_map_cache_entry(buffer
);
3643 address_space_write(as
, bounce
.addr
, bounce
.buffer
, access_len
);
3645 qemu_vfree(bounce
.buffer
);
3646 bounce
.buffer
= NULL
;
3647 cpu_notify_map_clients();
3650 void *cpu_physical_memory_map(hwaddr addr
,
3654 return address_space_map(&address_space_memory
, addr
, plen
, is_write
);
3657 void cpu_physical_memory_unmap(void *buffer
, hwaddr len
,
3658 int is_write
, hwaddr access_len
)
3660 return address_space_unmap(&address_space_memory
, buffer
, len
, is_write
, access_len
);
3663 /* warning: addr must be aligned */
3664 static inline uint32_t ldl_phys_internal(hwaddr addr
,
3665 enum device_endian endian
)
3669 MemoryRegionSection
*section
;
3671 section
= phys_page_find(address_space_memory
.dispatch
, addr
>> TARGET_PAGE_BITS
);
3673 if (!(memory_region_is_ram(section
->mr
) ||
3674 memory_region_is_romd(section
->mr
))) {
3676 addr
= memory_region_section_addr(section
, addr
);
3677 val
= io_mem_read(section
->mr
, addr
, 4);
3678 #if defined(TARGET_WORDS_BIGENDIAN)
3679 if (endian
== DEVICE_LITTLE_ENDIAN
) {
3683 if (endian
== DEVICE_BIG_ENDIAN
) {
3689 ptr
= qemu_get_ram_ptr((memory_region_get_ram_addr(section
->mr
)
3691 + memory_region_section_addr(section
, addr
));
3693 case DEVICE_LITTLE_ENDIAN
:
3694 val
= ldl_le_p(ptr
);
3696 case DEVICE_BIG_ENDIAN
:
3697 val
= ldl_be_p(ptr
);
3707 uint32_t ldl_phys(hwaddr addr
)
3709 return ldl_phys_internal(addr
, DEVICE_NATIVE_ENDIAN
);
3712 uint32_t ldl_le_phys(hwaddr addr
)
3714 return ldl_phys_internal(addr
, DEVICE_LITTLE_ENDIAN
);
3717 uint32_t ldl_be_phys(hwaddr addr
)
3719 return ldl_phys_internal(addr
, DEVICE_BIG_ENDIAN
);
3722 /* warning: addr must be aligned */
3723 static inline uint64_t ldq_phys_internal(hwaddr addr
,
3724 enum device_endian endian
)
3728 MemoryRegionSection
*section
;
3730 section
= phys_page_find(address_space_memory
.dispatch
, addr
>> TARGET_PAGE_BITS
);
3732 if (!(memory_region_is_ram(section
->mr
) ||
3733 memory_region_is_romd(section
->mr
))) {
3735 addr
= memory_region_section_addr(section
, addr
);
3737 /* XXX This is broken when device endian != cpu endian.
3738 Fix and add "endian" variable check */
3739 #ifdef TARGET_WORDS_BIGENDIAN
3740 val
= io_mem_read(section
->mr
, addr
, 4) << 32;
3741 val
|= io_mem_read(section
->mr
, addr
+ 4, 4);
3743 val
= io_mem_read(section
->mr
, addr
, 4);
3744 val
|= io_mem_read(section
->mr
, addr
+ 4, 4) << 32;
3748 ptr
= qemu_get_ram_ptr((memory_region_get_ram_addr(section
->mr
)
3750 + memory_region_section_addr(section
, addr
));
3752 case DEVICE_LITTLE_ENDIAN
:
3753 val
= ldq_le_p(ptr
);
3755 case DEVICE_BIG_ENDIAN
:
3756 val
= ldq_be_p(ptr
);
3766 uint64_t ldq_phys(hwaddr addr
)
3768 return ldq_phys_internal(addr
, DEVICE_NATIVE_ENDIAN
);
3771 uint64_t ldq_le_phys(hwaddr addr
)
3773 return ldq_phys_internal(addr
, DEVICE_LITTLE_ENDIAN
);
3776 uint64_t ldq_be_phys(hwaddr addr
)
3778 return ldq_phys_internal(addr
, DEVICE_BIG_ENDIAN
);
3782 uint32_t ldub_phys(hwaddr addr
)
3785 cpu_physical_memory_read(addr
, &val
, 1);
3789 /* warning: addr must be aligned */
3790 static inline uint32_t lduw_phys_internal(hwaddr addr
,
3791 enum device_endian endian
)
3795 MemoryRegionSection
*section
;
3797 section
= phys_page_find(address_space_memory
.dispatch
, addr
>> TARGET_PAGE_BITS
);
3799 if (!(memory_region_is_ram(section
->mr
) ||
3800 memory_region_is_romd(section
->mr
))) {
3802 addr
= memory_region_section_addr(section
, addr
);
3803 val
= io_mem_read(section
->mr
, addr
, 2);
3804 #if defined(TARGET_WORDS_BIGENDIAN)
3805 if (endian
== DEVICE_LITTLE_ENDIAN
) {
3809 if (endian
== DEVICE_BIG_ENDIAN
) {
3815 ptr
= qemu_get_ram_ptr((memory_region_get_ram_addr(section
->mr
)
3817 + memory_region_section_addr(section
, addr
));
3819 case DEVICE_LITTLE_ENDIAN
:
3820 val
= lduw_le_p(ptr
);
3822 case DEVICE_BIG_ENDIAN
:
3823 val
= lduw_be_p(ptr
);
3833 uint32_t lduw_phys(hwaddr addr
)
3835 return lduw_phys_internal(addr
, DEVICE_NATIVE_ENDIAN
);
3838 uint32_t lduw_le_phys(hwaddr addr
)
3840 return lduw_phys_internal(addr
, DEVICE_LITTLE_ENDIAN
);
3843 uint32_t lduw_be_phys(hwaddr addr
)
3845 return lduw_phys_internal(addr
, DEVICE_BIG_ENDIAN
);
3848 /* warning: addr must be aligned. The ram page is not masked as dirty
3849 and the code inside is not invalidated. It is useful if the dirty
3850 bits are used to track modified PTEs */
3851 void stl_phys_notdirty(hwaddr addr
, uint32_t val
)
3854 MemoryRegionSection
*section
;
3856 section
= phys_page_find(address_space_memory
.dispatch
, addr
>> TARGET_PAGE_BITS
);
3858 if (!memory_region_is_ram(section
->mr
) || section
->readonly
) {
3859 addr
= memory_region_section_addr(section
, addr
);
3860 if (memory_region_is_ram(section
->mr
)) {
3861 section
= &phys_sections
[phys_section_rom
];
3863 io_mem_write(section
->mr
, addr
, val
, 4);
3865 unsigned long addr1
= (memory_region_get_ram_addr(section
->mr
)
3867 + memory_region_section_addr(section
, addr
);
3868 ptr
= qemu_get_ram_ptr(addr1
);
3871 if (unlikely(in_migration
)) {
3872 if (!cpu_physical_memory_is_dirty(addr1
)) {
3873 /* invalidate code */
3874 tb_invalidate_phys_page_range(addr1
, addr1
+ 4, 0);
3876 cpu_physical_memory_set_dirty_flags(
3877 addr1
, (0xff & ~CODE_DIRTY_FLAG
));
3883 void stq_phys_notdirty(hwaddr addr
, uint64_t val
)
3886 MemoryRegionSection
*section
;
3888 section
= phys_page_find(address_space_memory
.dispatch
, addr
>> TARGET_PAGE_BITS
);
3890 if (!memory_region_is_ram(section
->mr
) || section
->readonly
) {
3891 addr
= memory_region_section_addr(section
, addr
);
3892 if (memory_region_is_ram(section
->mr
)) {
3893 section
= &phys_sections
[phys_section_rom
];
3895 #ifdef TARGET_WORDS_BIGENDIAN
3896 io_mem_write(section
->mr
, addr
, val
>> 32, 4);
3897 io_mem_write(section
->mr
, addr
+ 4, (uint32_t)val
, 4);
3899 io_mem_write(section
->mr
, addr
, (uint32_t)val
, 4);
3900 io_mem_write(section
->mr
, addr
+ 4, val
>> 32, 4);
3903 ptr
= qemu_get_ram_ptr((memory_region_get_ram_addr(section
->mr
)
3905 + memory_region_section_addr(section
, addr
));
3910 /* warning: addr must be aligned */
3911 static inline void stl_phys_internal(hwaddr addr
, uint32_t val
,
3912 enum device_endian endian
)
3915 MemoryRegionSection
*section
;
3917 section
= phys_page_find(address_space_memory
.dispatch
, addr
>> TARGET_PAGE_BITS
);
3919 if (!memory_region_is_ram(section
->mr
) || section
->readonly
) {
3920 addr
= memory_region_section_addr(section
, addr
);
3921 if (memory_region_is_ram(section
->mr
)) {
3922 section
= &phys_sections
[phys_section_rom
];
3924 #if defined(TARGET_WORDS_BIGENDIAN)
3925 if (endian
== DEVICE_LITTLE_ENDIAN
) {
3929 if (endian
== DEVICE_BIG_ENDIAN
) {
3933 io_mem_write(section
->mr
, addr
, val
, 4);
3935 unsigned long addr1
;
3936 addr1
= (memory_region_get_ram_addr(section
->mr
) & TARGET_PAGE_MASK
)
3937 + memory_region_section_addr(section
, addr
);
3939 ptr
= qemu_get_ram_ptr(addr1
);
3941 case DEVICE_LITTLE_ENDIAN
:
3944 case DEVICE_BIG_ENDIAN
:
3951 invalidate_and_set_dirty(addr1
, 4);
3955 void stl_phys(hwaddr addr
, uint32_t val
)
3957 stl_phys_internal(addr
, val
, DEVICE_NATIVE_ENDIAN
);
3960 void stl_le_phys(hwaddr addr
, uint32_t val
)
3962 stl_phys_internal(addr
, val
, DEVICE_LITTLE_ENDIAN
);
3965 void stl_be_phys(hwaddr addr
, uint32_t val
)
3967 stl_phys_internal(addr
, val
, DEVICE_BIG_ENDIAN
);
3971 void stb_phys(hwaddr addr
, uint32_t val
)
3974 cpu_physical_memory_write(addr
, &v
, 1);
3977 /* warning: addr must be aligned */
3978 static inline void stw_phys_internal(hwaddr addr
, uint32_t val
,
3979 enum device_endian endian
)
3982 MemoryRegionSection
*section
;
3984 section
= phys_page_find(address_space_memory
.dispatch
, addr
>> TARGET_PAGE_BITS
);
3986 if (!memory_region_is_ram(section
->mr
) || section
->readonly
) {
3987 addr
= memory_region_section_addr(section
, addr
);
3988 if (memory_region_is_ram(section
->mr
)) {
3989 section
= &phys_sections
[phys_section_rom
];
3991 #if defined(TARGET_WORDS_BIGENDIAN)
3992 if (endian
== DEVICE_LITTLE_ENDIAN
) {
3996 if (endian
== DEVICE_BIG_ENDIAN
) {
4000 io_mem_write(section
->mr
, addr
, val
, 2);
4002 unsigned long addr1
;
4003 addr1
= (memory_region_get_ram_addr(section
->mr
) & TARGET_PAGE_MASK
)
4004 + memory_region_section_addr(section
, addr
);
4006 ptr
= qemu_get_ram_ptr(addr1
);
4008 case DEVICE_LITTLE_ENDIAN
:
4011 case DEVICE_BIG_ENDIAN
:
4018 invalidate_and_set_dirty(addr1
, 2);
4022 void stw_phys(hwaddr addr
, uint32_t val
)
4024 stw_phys_internal(addr
, val
, DEVICE_NATIVE_ENDIAN
);
4027 void stw_le_phys(hwaddr addr
, uint32_t val
)
4029 stw_phys_internal(addr
, val
, DEVICE_LITTLE_ENDIAN
);
4032 void stw_be_phys(hwaddr addr
, uint32_t val
)
4034 stw_phys_internal(addr
, val
, DEVICE_BIG_ENDIAN
);
4038 void stq_phys(hwaddr addr
, uint64_t val
)
4041 cpu_physical_memory_write(addr
, &val
, 8);
4044 void stq_le_phys(hwaddr addr
, uint64_t val
)
4046 val
= cpu_to_le64(val
);
4047 cpu_physical_memory_write(addr
, &val
, 8);
4050 void stq_be_phys(hwaddr addr
, uint64_t val
)
4052 val
= cpu_to_be64(val
);
4053 cpu_physical_memory_write(addr
, &val
, 8);
4056 /* virtual memory access for debug (includes writing to ROM) */
4057 int cpu_memory_rw_debug(CPUArchState
*env
, target_ulong addr
,
4058 uint8_t *buf
, int len
, int is_write
)
4065 page
= addr
& TARGET_PAGE_MASK
;
4066 phys_addr
= cpu_get_phys_page_debug(env
, page
);
4067 /* if no physical page mapped, return an error */
4068 if (phys_addr
== -1)
4070 l
= (page
+ TARGET_PAGE_SIZE
) - addr
;
4073 phys_addr
+= (addr
& ~TARGET_PAGE_MASK
);
4075 cpu_physical_memory_write_rom(phys_addr
, buf
, l
);
4077 cpu_physical_memory_rw(phys_addr
, buf
, l
, is_write
);
4086 /* in deterministic execution mode, instructions doing device I/Os
4087 must be at the end of the TB */
4088 void cpu_io_recompile(CPUArchState
*env
, uintptr_t retaddr
)
4090 TranslationBlock
*tb
;
4092 target_ulong pc
, cs_base
;
4095 tb
= tb_find_pc(retaddr
);
4097 cpu_abort(env
, "cpu_io_recompile: could not find TB for pc=%p",
4100 n
= env
->icount_decr
.u16
.low
+ tb
->icount
;
4101 cpu_restore_state(tb
, env
, retaddr
);
4102 /* Calculate how many instructions had been executed before the fault
4104 n
= n
- env
->icount_decr
.u16
.low
;
4105 /* Generate a new TB ending on the I/O insn. */
4107 /* On MIPS and SH, delay slot instructions can only be restarted if
4108 they were already the first instruction in the TB. If this is not
4109 the first instruction in a TB then re-execute the preceding
4111 #if defined(TARGET_MIPS)
4112 if ((env
->hflags
& MIPS_HFLAG_BMASK
) != 0 && n
> 1) {
4113 env
->active_tc
.PC
-= 4;
4114 env
->icount_decr
.u16
.low
++;
4115 env
->hflags
&= ~MIPS_HFLAG_BMASK
;
4117 #elif defined(TARGET_SH4)
4118 if ((env
->flags
& ((DELAY_SLOT
| DELAY_SLOT_CONDITIONAL
))) != 0
4121 env
->icount_decr
.u16
.low
++;
4122 env
->flags
&= ~(DELAY_SLOT
| DELAY_SLOT_CONDITIONAL
);
4125 /* This should never happen. */
4126 if (n
> CF_COUNT_MASK
)
4127 cpu_abort(env
, "TB too big during recompile");
4129 cflags
= n
| CF_LAST_IO
;
4131 cs_base
= tb
->cs_base
;
4133 tb_phys_invalidate(tb
, -1);
4134 /* FIXME: In theory this could raise an exception. In practice
4135 we have already translated the block once so it's probably ok. */
4136 tb_gen_code(env
, pc
, cs_base
, flags
, cflags
);
4137 /* TODO: If env->pc != tb->pc (i.e. the faulting instruction was not
4138 the first in the TB) then we end up generating a whole new TB and
4139 repeating the fault, which is horribly inefficient.
4140 Better would be to execute just this insn uncached, or generate a
4142 cpu_resume_from_signal(env
, NULL
);
4145 #if !defined(CONFIG_USER_ONLY)
4147 void dump_exec_info(FILE *f
, fprintf_function cpu_fprintf
)
4149 int i
, target_code_size
, max_target_code_size
;
4150 int direct_jmp_count
, direct_jmp2_count
, cross_page
;
4151 TranslationBlock
*tb
;
4153 target_code_size
= 0;
4154 max_target_code_size
= 0;
4156 direct_jmp_count
= 0;
4157 direct_jmp2_count
= 0;
4158 for(i
= 0; i
< nb_tbs
; i
++) {
4160 target_code_size
+= tb
->size
;
4161 if (tb
->size
> max_target_code_size
)
4162 max_target_code_size
= tb
->size
;
4163 if (tb
->page_addr
[1] != -1)
4165 if (tb
->tb_next_offset
[0] != 0xffff) {
4167 if (tb
->tb_next_offset
[1] != 0xffff) {
4168 direct_jmp2_count
++;
4172 /* XXX: avoid using doubles ? */
4173 cpu_fprintf(f
, "Translation buffer state:\n");
4174 cpu_fprintf(f
, "gen code size %td/%zd\n",
4175 code_gen_ptr
- code_gen_buffer
, code_gen_buffer_max_size
);
4176 cpu_fprintf(f
, "TB count %d/%d\n",
4177 nb_tbs
, code_gen_max_blocks
);
4178 cpu_fprintf(f
, "TB avg target size %d max=%d bytes\n",
4179 nb_tbs
? target_code_size
/ nb_tbs
: 0,
4180 max_target_code_size
);
4181 cpu_fprintf(f
, "TB avg host size %td bytes (expansion ratio: %0.1f)\n",
4182 nb_tbs
? (code_gen_ptr
- code_gen_buffer
) / nb_tbs
: 0,
4183 target_code_size
? (double) (code_gen_ptr
- code_gen_buffer
) / target_code_size
: 0);
4184 cpu_fprintf(f
, "cross page TB count %d (%d%%)\n",
4186 nb_tbs
? (cross_page
* 100) / nb_tbs
: 0);
4187 cpu_fprintf(f
, "direct jump count %d (%d%%) (2 jumps=%d %d%%)\n",
4189 nb_tbs
? (direct_jmp_count
* 100) / nb_tbs
: 0,
4191 nb_tbs
? (direct_jmp2_count
* 100) / nb_tbs
: 0);
4192 cpu_fprintf(f
, "\nStatistics:\n");
4193 cpu_fprintf(f
, "TB flush count %d\n", tb_flush_count
);
4194 cpu_fprintf(f
, "TB invalidate count %d\n", tb_phys_invalidate_count
);
4195 cpu_fprintf(f
, "TLB flush count %d\n", tlb_flush_count
);
4196 tcg_dump_info(f
, cpu_fprintf
);
4200 * A helper function for the _utterly broken_ virtio device model to find out if
4201 * it's running on a big endian machine. Don't do this at home kids!
4203 bool virtio_is_big_endian(void);
4204 bool virtio_is_big_endian(void)
4206 #if defined(TARGET_WORDS_BIGENDIAN)
4215 #ifndef CONFIG_USER_ONLY
4216 bool cpu_physical_memory_is_io(hwaddr phys_addr
)
4218 MemoryRegionSection
*section
;
4220 section
= phys_page_find(address_space_memory
.dispatch
,
4221 phys_addr
>> TARGET_PAGE_BITS
);
4223 return !(memory_region_is_ram(section
->mr
) ||
4224 memory_region_is_romd(section
->mr
));