-///** @brief Add the given process into the VM.
-// * @ingroup msg_VMs
-// *
-// * Afterward, when the VM is migrated or suspended or whatever, the process will have the corresponding handling, too.
-// *
-// */
-//void MSG_vm_bind(msg_vm_t vm, msg_process_t process) {
-// /* check if the process is already in a VM */
-// simdata_process_t simdata = simcall_process_get_data(process);
-// if (simdata->vm) {
-// msg_vm_t old_vm = simdata->vm;
-// int pos = xbt_dynar_search(old_vm->processes,&process);
-// xbt_dynar_remove_at(old_vm->processes,pos, NULL);
-// }
-// /* check if the host is in the right host */
-// if (simdata->m_host != vm->location) {
-// MSG_process_migrate(process,vm->location);
-// }
-// simdata->vm = vm;
-//
-// XBT_DEBUG("binding Process %s to %p",MSG_process_get_name(process),vm);
-//
-// xbt_dynar_push_as(vm->processes,msg_process_t,process);
-//}
-///** @brief Removes the given process from the given VM, and kill it
-// * @ingroup msg_VMs
-// *
-// * Will raise a not_found exception if the process were not binded to that VM
-// */
-//void MSG_vm_unbind(msg_vm_t vm, msg_process_t process) {
-// int pos = xbt_dynar_search(vm->processes,process);
-// xbt_dynar_remove_at(vm->processes,pos, NULL);
-// MSG_process_kill(process);
-//}
-//
-///** @brief Immediately change the host on which all processes are running.
-// * @ingroup msg_VMs
-// *
-// * No migration cost occurs. If you want to simulate this too, you want to use a
-// * MSG_task_send() before or after, depending on whether you want to do cold or hot
-// * migration.
-// */
-//void MSG_vm_migrate(msg_vm_t vm, msg_host_t destination) {
-// unsigned int cpt;
-// msg_process_t process;
-// xbt_dynar_foreach(vm->processes,cpt,process) {
-// MSG_process_migrate(process,destination);
-// }
-// xbt_swag_remove(vm, MSG_host_priv(vm->location)->vms);
-// xbt_swag_insert_at_tail(vm, MSG_host_priv(destination)->vms);
-//
-// #ifdef HAVE_TRACING
-// TRACE_msg_vm_change_host(vm,vm->location,destination);
-// #endif
-//
-// vm->location = destination;
-//}
-//
+/** @brief Migrate the VM to the given host.
+ * @ingroup msg_VMs
+ *
+ * FIXME: No migration cost occurs. If you want to simulate this too, you want to use a
+ * MSG_task_send() before or after, depending on whether you want to do cold or hot
+ * migration.
+ */
+void MSG_vm_migrate(msg_vm_t vm, msg_host_t destination)
+{
+ /* some thoughts:
+ * - One approach is ...
+ * We first create a new VM (i.e., destination VM) on the destination
+ * physical host. The destination VM will receive the state of the source
+ * VM over network. We will finally destroy the source VM.
+ * - This behavior is similar to the way of migration in the real world.
+ * Even before a migration is completed, we will see a destination VM,
+ * consuming resources.
+ * - We have to relocate all processes. The existing process migraion code
+ * will work for this?
+ * - The name of the VM is a somewhat unique ID in the code. It is tricky
+ * for the destination VM?
+ *
+ * - Another one is ...
+ * We update the information of the given VM to place it to the destination
+ * physical host.
+ *
+ * The second one would be easier.
+ *
+ */
+
+ #ifdef HAVE_TRACING
+ const char *old_pm_name = simcall_vm_get_phys_host(vm);
+ msg_host_t old_pm_ind = xbt_lib_get_elm_or_null(host_lib, old_pm_name);
+ #endif
+
+ simcall_vm_migrate(vm, destination);
+
+
+ #ifdef HAVE_TRACING
+ TRACE_msg_vm_change_host(vm, old_pm_ind, destination);
+ #endif
+}
+