Revision 94a6b54f vl.c
b/vl.c | ||
---|---|---|
3094 | 3094 |
int ret; |
3095 | 3095 |
ram_addr_t i; |
3096 | 3096 |
|
3097 |
if (qemu_get_be32(f) != phys_ram_size)
|
|
3097 |
if (qemu_get_be32(f) != last_ram_offset)
|
|
3098 | 3098 |
return -EINVAL; |
3099 |
for(i = 0; i < phys_ram_size; i+= TARGET_PAGE_SIZE) {
|
|
3099 |
for(i = 0; i < last_ram_offset; i+= TARGET_PAGE_SIZE) {
|
|
3100 | 3100 |
ret = ram_get_page(f, qemu_get_ram_ptr(i), TARGET_PAGE_SIZE); |
3101 | 3101 |
if (ret) |
3102 | 3102 |
return ret; |
... | ... | |
3182 | 3182 |
ram_addr_t addr = 0; |
3183 | 3183 |
int found = 0; |
3184 | 3184 |
|
3185 |
while (addr < phys_ram_size) {
|
|
3185 |
while (addr < last_ram_offset) {
|
|
3186 | 3186 |
if (cpu_physical_memory_get_dirty(current_addr, MIGRATION_DIRTY_FLAG)) { |
3187 | 3187 |
uint8_t *p; |
3188 | 3188 |
|
... | ... | |
3204 | 3204 |
break; |
3205 | 3205 |
} |
3206 | 3206 |
addr += TARGET_PAGE_SIZE; |
3207 |
current_addr = (saved_addr + addr) % phys_ram_size;
|
|
3207 |
current_addr = (saved_addr + addr) % last_ram_offset;
|
|
3208 | 3208 |
} |
3209 | 3209 |
|
3210 | 3210 |
return found; |
... | ... | |
3217 | 3217 |
ram_addr_t addr; |
3218 | 3218 |
ram_addr_t count = 0; |
3219 | 3219 |
|
3220 |
for (addr = 0; addr < phys_ram_size; addr += TARGET_PAGE_SIZE) {
|
|
3220 |
for (addr = 0; addr < last_ram_offset; addr += TARGET_PAGE_SIZE) {
|
|
3221 | 3221 |
if (cpu_physical_memory_get_dirty(addr, MIGRATION_DIRTY_FLAG)) |
3222 | 3222 |
count++; |
3223 | 3223 |
} |
... | ... | |
3231 | 3231 |
|
3232 | 3232 |
if (stage == 1) { |
3233 | 3233 |
/* Make sure all dirty bits are set */ |
3234 |
for (addr = 0; addr < phys_ram_size; addr += TARGET_PAGE_SIZE) {
|
|
3234 |
for (addr = 0; addr < last_ram_offset; addr += TARGET_PAGE_SIZE) {
|
|
3235 | 3235 |
if (!cpu_physical_memory_get_dirty(addr, MIGRATION_DIRTY_FLAG)) |
3236 | 3236 |
cpu_physical_memory_set_dirty(addr); |
3237 | 3237 |
} |
... | ... | |
3239 | 3239 |
/* Enable dirty memory tracking */ |
3240 | 3240 |
cpu_physical_memory_set_dirty_tracking(1); |
3241 | 3241 |
|
3242 |
qemu_put_be64(f, phys_ram_size | RAM_SAVE_FLAG_MEM_SIZE);
|
|
3242 |
qemu_put_be64(f, last_ram_offset | RAM_SAVE_FLAG_MEM_SIZE);
|
|
3243 | 3243 |
} |
3244 | 3244 |
|
3245 | 3245 |
while (!qemu_file_rate_limit(f)) { |
... | ... | |
3272 | 3272 |
|
3273 | 3273 |
if (ram_decompress_open(s, f) < 0) |
3274 | 3274 |
return -EINVAL; |
3275 |
for(i = 0; i < phys_ram_size; i+= BDRV_HASH_BLOCK_SIZE) {
|
|
3275 |
for(i = 0; i < last_ram_offset; i+= BDRV_HASH_BLOCK_SIZE) {
|
|
3276 | 3276 |
if (ram_decompress_buf(s, buf, 1) < 0) { |
3277 | 3277 |
fprintf(stderr, "Error while reading ram block header\n"); |
3278 | 3278 |
goto error; |
... | ... | |
3303 | 3303 |
return ram_load_v1(f, opaque); |
3304 | 3304 |
|
3305 | 3305 |
if (version_id == 2) { |
3306 |
if (qemu_get_be32(f) != phys_ram_size)
|
|
3306 |
if (qemu_get_be32(f) != last_ram_offset)
|
|
3307 | 3307 |
return -EINVAL; |
3308 | 3308 |
return ram_load_dead(f, opaque); |
3309 | 3309 |
} |
... | ... | |
3318 | 3318 |
addr &= TARGET_PAGE_MASK; |
3319 | 3319 |
|
3320 | 3320 |
if (flags & RAM_SAVE_FLAG_MEM_SIZE) { |
3321 |
if (addr != phys_ram_size)
|
|
3321 |
if (addr != last_ram_offset)
|
|
3322 | 3322 |
return -EINVAL; |
3323 | 3323 |
} |
3324 | 3324 |
|
... | ... | |
5132 | 5132 |
exit(1); |
5133 | 5133 |
|
5134 | 5134 |
/* init the memory */ |
5135 |
phys_ram_size = machine->ram_require & ~RAMSIZE_FIXED; |
|
5136 |
|
|
5137 |
if (machine->ram_require & RAMSIZE_FIXED) { |
|
5138 |
if (ram_size > 0) { |
|
5139 |
if (ram_size < phys_ram_size) { |
|
5140 |
fprintf(stderr, "Machine `%s' requires %llu bytes of memory\n", |
|
5141 |
machine->name, (unsigned long long) phys_ram_size); |
|
5142 |
exit(-1); |
|
5143 |
} |
|
5144 |
|
|
5145 |
phys_ram_size = ram_size; |
|
5146 |
} else |
|
5147 |
ram_size = phys_ram_size; |
|
5148 |
} else { |
|
5149 |
if (ram_size == 0) |
|
5150 |
ram_size = DEFAULT_RAM_SIZE * 1024 * 1024; |
|
5151 |
|
|
5152 |
phys_ram_size += ram_size; |
|
5153 |
} |
|
5135 |
if (ram_size == 0) |
|
5136 |
ram_size = DEFAULT_RAM_SIZE * 1024 * 1024; |
|
5154 | 5137 |
|
5155 |
phys_ram_base = qemu_vmalloc(phys_ram_size); |
|
5156 |
if (!phys_ram_base) { |
|
5157 |
fprintf(stderr, "Could not allocate physical memory\n"); |
|
5158 |
exit(1); |
|
5138 |
#ifdef USE_KQEMU |
|
5139 |
/* FIXME: This is a nasty hack because kqemu can't cope with dynamic |
|
5140 |
guest ram allocation. It needs to go away. */ |
|
5141 |
if (kqemu_allowed) { |
|
5142 |
kqemu_phys_ram_size = ram_size + VGA_RAM_SIZE + 4 * 1024 * 1024; |
|
5143 |
kqemu_phys_ram_base = qemu_vmalloc(kqemu_phys_ram_size); |
|
5144 |
if (!kqemu_phys_ram_base) { |
|
5145 |
fprintf(stderr, "Could not allocate physical memory\n"); |
|
5146 |
exit(1); |
|
5147 |
} |
|
5159 | 5148 |
} |
5149 |
#endif |
|
5160 | 5150 |
|
5161 | 5151 |
/* init the dynamic translator */ |
5162 | 5152 |
cpu_exec_init_all(tb_size * 1024 * 1024); |
Also available in: Unified diff