diff --git a/src/s2e-kvm-vcpu.cpp b/src/s2e-kvm-vcpu.cpp index b9c1237..e0d09a4 100644 --- a/src/s2e-kvm-vcpu.cpp +++ b/src/s2e-kvm-vcpu.cpp @@ -393,7 +393,8 @@ int VCPU::run(int vcpu_fd) { m_handlingKvmCallback = m_cpuBuffer->exit_reason == KVM_EXIT_IO || m_cpuBuffer->exit_reason == KVM_EXIT_MMIO || m_cpuBuffer->exit_reason == KVM_EXIT_FLUSH_DISK || m_cpuBuffer->exit_reason == KVM_EXIT_SAVE_DEV_STATE || - m_cpuBuffer->exit_reason == KVM_EXIT_RESTORE_DEV_STATE || m_cpuBuffer->exit_reason == KVM_EXIT_CLONE_PROCESS; + m_cpuBuffer->exit_reason == KVM_EXIT_RESTORE_DEV_STATE || m_cpuBuffer->exit_reason == KVM_EXIT_CLONE_PROCESS || + m_cpuBuffer->exit_reason == KVM_EXIT_SYNC_SREGS; // Might not be NULL if resuming from an interrupted I/O // assert(env->current_tb == NULL); @@ -504,6 +505,12 @@ void VCPU::restoreDeviceState(void) { coroutine_yield(); } +void VCPU::syncSRegs(void) { + g_kvm_vcpu_buffer->exit_reason = KVM_EXIT_SYNC_SREGS; + m_handlingDeviceState = true; + coroutine_yield(); +} + void VCPU::cloneProcess(void) { g_kvm_vcpu_buffer->exit_reason = KVM_EXIT_CLONE_PROCESS; @@ -838,6 +845,10 @@ void s2e_kvm_restore_device_state(void) { s2e::kvm::s_vcpu->restoreDeviceState(); } +void s2e_kvm_sync_sregs(void) { + s2e::kvm::s_vcpu->syncSRegs(); +} + void s2e_kvm_clone_process(void) { s2e::kvm::s_vcpu->cloneProcess(); } diff --git a/src/s2e-kvm-vcpu.h b/src/s2e-kvm-vcpu.h index 66f6984..c15c18b 100644 --- a/src/s2e-kvm-vcpu.h +++ b/src/s2e-kvm-vcpu.h @@ -194,6 +194,7 @@ class VCPU : public IFile { void flushDisk(void); void saveDeviceState(void); void restoreDeviceState(void); + void syncSRegs(void); void cloneProcess(void); #if defined(TARGET_ARM)