Revision 00f82b8a exec.c
b/exec.c | ||
---|---|---|
74 | 74 |
#define TARGET_VIRT_ADDR_SPACE_BITS 42 |
75 | 75 |
#elif defined(TARGET_PPC64) |
76 | 76 |
#define TARGET_PHYS_ADDR_SPACE_BITS 42 |
77 |
#elif defined(TARGET_X86_64) && !defined(USE_KQEMU) |
|
78 |
#define TARGET_PHYS_ADDR_SPACE_BITS 42 |
|
79 |
#elif defined(TARGET_I386) && !defined(USE_KQEMU) |
|
80 |
#define TARGET_PHYS_ADDR_SPACE_BITS 36 |
|
77 | 81 |
#else |
78 | 82 |
/* Note: for compatibility with kqemu, we use 32 bits for x86_64 */ |
79 | 83 |
#define TARGET_PHYS_ADDR_SPACE_BITS 32 |
... | ... | |
88 | 92 |
uint8_t code_gen_buffer[CODE_GEN_BUFFER_SIZE] __attribute__((aligned (32))); |
89 | 93 |
uint8_t *code_gen_ptr; |
90 | 94 |
|
91 |
int phys_ram_size;
|
|
95 |
ram_addr_t phys_ram_size;
|
|
92 | 96 |
int phys_ram_fd; |
93 | 97 |
uint8_t *phys_ram_base; |
94 | 98 |
uint8_t *phys_ram_dirty; |
... | ... | |
113 | 117 |
|
114 | 118 |
typedef struct PhysPageDesc { |
115 | 119 |
/* offset in host memory of the page + io_index in the low 12 bits */ |
116 |
uint32_t phys_offset;
|
|
120 |
ram_addr_t phys_offset;
|
|
117 | 121 |
} PhysPageDesc; |
118 | 122 |
|
119 | 123 |
#define L2_BITS 10 |
... | ... | |
234 | 238 |
#endif |
235 | 239 |
} |
236 | 240 |
|
237 |
static inline PageDesc *page_find_alloc(unsigned int index)
|
|
241 |
static inline PageDesc *page_find_alloc(target_ulong index)
|
|
238 | 242 |
{ |
239 | 243 |
PageDesc **lp, *p; |
240 | 244 |
|
... | ... | |
249 | 253 |
return p + (index & (L2_SIZE - 1)); |
250 | 254 |
} |
251 | 255 |
|
252 |
static inline PageDesc *page_find(unsigned int index)
|
|
256 |
static inline PageDesc *page_find(target_ulong index)
|
|
253 | 257 |
{ |
254 | 258 |
PageDesc *p; |
255 | 259 |
|
... | ... | |
511 | 515 |
tb_set_jmp_target(tb, n, (unsigned long)(tb->tc_ptr + tb->tb_next_offset[n])); |
512 | 516 |
} |
513 | 517 |
|
514 |
static inline void tb_phys_invalidate(TranslationBlock *tb, unsigned int page_addr)
|
|
518 |
static inline void tb_phys_invalidate(TranslationBlock *tb, target_ulong page_addr)
|
|
515 | 519 |
{ |
516 | 520 |
CPUState *env; |
517 | 521 |
PageDesc *p; |
518 | 522 |
unsigned int h, n1; |
519 |
target_ulong phys_pc;
|
|
523 |
target_phys_addr_t phys_pc;
|
|
520 | 524 |
TranslationBlock *tb1, *tb2; |
521 | 525 |
|
522 | 526 |
/* remove the TB from the hash list */ |
... | ... | |
667 | 671 |
the same physical page. 'is_cpu_write_access' should be true if called |
668 | 672 |
from a real cpu write access: the virtual CPU will exit the current |
669 | 673 |
TB if code is modified inside this TB. */ |
670 |
void tb_invalidate_phys_page_range(target_ulong start, target_ulong end,
|
|
674 |
void tb_invalidate_phys_page_range(target_phys_addr_t start, target_phys_addr_t end,
|
|
671 | 675 |
int is_cpu_write_access) |
672 | 676 |
{ |
673 | 677 |
int n, current_tb_modified, current_tb_not_found, current_flags; |
... | ... | |
780 | 784 |
} |
781 | 785 |
|
782 | 786 |
/* len must be <= 8 and start must be a multiple of len */ |
783 |
static inline void tb_invalidate_phys_page_fast(target_ulong start, int len)
|
|
787 |
static inline void tb_invalidate_phys_page_fast(target_phys_addr_t start, int len)
|
|
784 | 788 |
{ |
785 | 789 |
PageDesc *p; |
786 | 790 |
int offset, b; |
... | ... | |
809 | 813 |
} |
810 | 814 |
|
811 | 815 |
#if !defined(CONFIG_SOFTMMU) |
812 |
static void tb_invalidate_phys_page(target_ulong addr,
|
|
816 |
static void tb_invalidate_phys_page(target_phys_addr_t addr,
|
|
813 | 817 |
unsigned long pc, void *puc) |
814 | 818 |
{ |
815 | 819 |
int n, current_flags, current_tb_modified; |
... | ... | |
1985 | 1989 |
#endif /* defined(CONFIG_USER_ONLY) */ |
1986 | 1990 |
|
1987 | 1991 |
static int subpage_register (subpage_t *mmio, uint32_t start, uint32_t end, |
1988 |
int memory);
|
|
1989 |
static void *subpage_init (target_phys_addr_t base, uint32_t *phys,
|
|
1990 |
int orig_memory);
|
|
1992 |
ram_addr_t memory);
|
|
1993 |
static void *subpage_init (target_phys_addr_t base, ram_addr_t *phys,
|
|
1994 |
ram_addr_t orig_memory);
|
|
1991 | 1995 |
#define CHECK_SUBPAGE(addr, start_addr, start_addr2, end_addr, end_addr2, \ |
1992 | 1996 |
need_subpage) \ |
1993 | 1997 |
do { \ |
... | ... | |
2012 | 2016 |
page size. If (phys_offset & ~TARGET_PAGE_MASK) != 0, then it is an |
2013 | 2017 |
io memory page */ |
2014 | 2018 |
void cpu_register_physical_memory(target_phys_addr_t start_addr, |
2015 |
unsigned long size,
|
|
2016 |
unsigned long phys_offset)
|
|
2019 |
ram_addr_t size,
|
|
2020 |
ram_addr_t phys_offset)
|
|
2017 | 2021 |
{ |
2018 | 2022 |
target_phys_addr_t addr, end_addr; |
2019 | 2023 |
PhysPageDesc *p; |
2020 | 2024 |
CPUState *env; |
2021 |
unsigned long orig_size = size;
|
|
2025 |
ram_addr_t orig_size = size;
|
|
2022 | 2026 |
void *subpage; |
2023 | 2027 |
|
2024 | 2028 |
size = (size + TARGET_PAGE_SIZE - 1) & TARGET_PAGE_MASK; |
... | ... | |
2026 | 2030 |
for(addr = start_addr; addr != end_addr; addr += TARGET_PAGE_SIZE) { |
2027 | 2031 |
p = phys_page_find(addr >> TARGET_PAGE_BITS); |
2028 | 2032 |
if (p && p->phys_offset != IO_MEM_UNASSIGNED) { |
2029 |
unsigned long orig_memory = p->phys_offset;
|
|
2033 |
ram_addr_t orig_memory = p->phys_offset;
|
|
2030 | 2034 |
target_phys_addr_t start_addr2, end_addr2; |
2031 | 2035 |
int need_subpage = 0; |
2032 | 2036 |
|
... | ... | |
2079 | 2083 |
} |
2080 | 2084 |
|
2081 | 2085 |
/* XXX: temporary until new memory mapping API */ |
2082 |
uint32_t cpu_get_physical_page_desc(target_phys_addr_t addr)
|
|
2086 |
ram_addr_t cpu_get_physical_page_desc(target_phys_addr_t addr)
|
|
2083 | 2087 |
{ |
2084 | 2088 |
PhysPageDesc *p; |
2085 | 2089 |
|
... | ... | |
2090 | 2094 |
} |
2091 | 2095 |
|
2092 | 2096 |
/* XXX: better than nothing */ |
2093 |
ram_addr_t qemu_ram_alloc(unsigned int size)
|
|
2097 |
ram_addr_t qemu_ram_alloc(ram_addr_t size)
|
|
2094 | 2098 |
{ |
2095 | 2099 |
ram_addr_t addr; |
2096 | 2100 |
if ((phys_ram_alloc_offset + size) > phys_ram_size) { |
2097 |
fprintf(stderr, "Not enough memory (requested_size = %u, max memory = %d)\n",
|
|
2101 |
fprintf(stderr, "Not enough memory (requested_size = %lu, max memory = %ld)\n",
|
|
2098 | 2102 |
size, phys_ram_size); |
2099 | 2103 |
abort(); |
2100 | 2104 |
} |
... | ... | |
2408 | 2412 |
}; |
2409 | 2413 |
|
2410 | 2414 |
static int subpage_register (subpage_t *mmio, uint32_t start, uint32_t end, |
2411 |
int memory)
|
|
2415 |
ram_addr_t memory)
|
|
2412 | 2416 |
{ |
2413 | 2417 |
int idx, eidx; |
2414 | 2418 |
unsigned int i; |
... | ... | |
2438 | 2442 |
return 0; |
2439 | 2443 |
} |
2440 | 2444 |
|
2441 |
static void *subpage_init (target_phys_addr_t base, uint32_t *phys,
|
|
2442 |
int orig_memory)
|
|
2445 |
static void *subpage_init (target_phys_addr_t base, ram_addr_t *phys,
|
|
2446 |
ram_addr_t orig_memory)
|
|
2443 | 2447 |
{ |
2444 | 2448 |
subpage_t *mmio; |
2445 | 2449 |
int subpage_memory; |
Also available in: Unified diff