X-Git-Url: http://git.maemo.org/git/?a=blobdiff_plain;f=vl.c;h=b1216c01837c5e82f485c74735f1cae30d394d91;hb=ade406775d3795141927bdd581edee2cb44da864;hp=5dfeb46b6442674d218adb6992354856d3892a4b;hpb=9f9e28cda74bc8cddd8ac4c0a9c007b31d42c6f6;p=qemu diff --git a/vl.c b/vl.c index 5dfeb46..b1216c0 100644 --- a/vl.c +++ b/vl.c @@ -156,6 +156,7 @@ int main(int argc, char **argv) #include "migration.h" #include "kvm.h" #include "balloon.h" +#include "qemu-option.h" #include "disas.h" @@ -1809,43 +1810,6 @@ static int socket_init(void) } #endif -const char *get_opt_name(char *buf, int buf_size, const char *p, char delim) -{ - char *q; - - q = buf; - while (*p != '\0' && *p != delim) { - if (q && (q - buf) < buf_size - 1) - *q++ = *p; - p++; - } - if (q) - *q = '\0'; - - return p; -} - -const char *get_opt_value(char *buf, int buf_size, const char *p) -{ - char *q; - - q = buf; - while (*p != '\0') { - if (*p == ',') { - if (*(p + 1) != ',') - break; - p++; - } - if (q && (q - buf) < buf_size - 1) - *q++ = *p; - p++; - } - if (q) - *q = '\0'; - - return p; -} - int get_param_value(char *buf, int buf_size, const char *tag, const char *str) { @@ -2263,8 +2227,7 @@ int drive_init(struct drive_opt *arg, int snapshot, void *opaque) NULL }; if (check_params(params, str) < 0) { - fprintf(stderr, "qemu: unknown parameter '%s' in '%s'\n", - buf, str); + fprintf(stderr, "qemu: unknown parameter in '%s'\n", str); return -1; } @@ -3268,13 +3231,18 @@ static int ram_save_live(QEMUFile *f, int stage, void *opaque) { ram_addr_t addr; + if (cpu_physical_sync_dirty_bitmap(0, last_ram_offset) != 0) { + qemu_file_set_error(f); + return 0; + } + if (stage == 1) { /* Make sure all dirty bits are set */ for (addr = 0; addr < last_ram_offset; addr += TARGET_PAGE_SIZE) { if (!cpu_physical_memory_get_dirty(addr, MIGRATION_DIRTY_FLAG)) cpu_physical_memory_set_dirty(addr); } - + /* Enable dirty memory tracking */ cpu_physical_memory_set_dirty_tracking(1); @@ -3610,6 +3578,7 @@ void vm_start(void) typedef struct QEMUResetEntry { QEMUResetHandler *func; void *opaque; + int order; struct QEMUResetEntry *next; } QEMUResetEntry; @@ -3665,16 +3634,18 @@ static void do_vm_stop(int reason) } } -void qemu_register_reset(QEMUResetHandler *func, void *opaque) +void qemu_register_reset(QEMUResetHandler *func, int order, void *opaque) { QEMUResetEntry **pre, *re; pre = &first_reset_entry; - while (*pre != NULL) + while (*pre != NULL && (*pre)->order >= order) { pre = &(*pre)->next; + } re = qemu_mallocz(sizeof(QEMUResetEntry)); re->func = func; re->opaque = opaque; + re->order = order; re->next = NULL; *pre = re; } @@ -3687,8 +3658,6 @@ void qemu_system_reset(void) for(re = first_reset_entry; re != NULL; re = re->next) { re->func(re->opaque); } - if (kvm_enabled()) - kvm_sync_vcpus(); } void qemu_system_reset_request(void)