int register_savevm_live(DeviceState *dev,

                         const char *idstr,

                         int instance_id,

                         int version_id,

                         SaveVMHandlers *ops,

                         void *opaque)

{

    SaveStateEntry *se;



    se = g_malloc0(sizeof(SaveStateEntry));

    se->version_id = version_id;

    se->section_id = savevm_state.global_section_id++;

    se->ops = ops;

    se->opaque = opaque;

    se->vmsd = NULL;

    /* if this is a live_savem then set is_ram */

    if (ops->save_live_setup != NULL) {

        se->is_ram = 1;

    }



    if (dev) {

        char *id = qdev_get_dev_path(dev);

        if (id) {

            pstrcpy(se->idstr, sizeof(se->idstr), id);

            pstrcat(se->idstr, sizeof(se->idstr), "/");

            g_free(id);



            se->compat = g_malloc0(sizeof(CompatEntry));

            pstrcpy(se->compat->idstr, sizeof(se->compat->idstr), idstr);

            se->compat->instance_id = instance_id == -1 ?

                         calculate_compat_instance_id(idstr) : instance_id;

            instance_id = -1;

        }

    }

    pstrcat(se->idstr, sizeof(se->idstr), idstr);



    if (instance_id == -1) {

        se->instance_id = calculate_new_instance_id(se->idstr);

    } else {

        se->instance_id = instance_id;

    }

    assert(!se->compat || se->instance_id == 0);

    /* add at the end of list */

    QTAILQ_INSERT_TAIL(&savevm_state.handlers, se, entry);

    return 0;

}
