diff --git a/core/vcpu.cc b/core/vcpu.cc index aebb38c..20b722f 100644 --- a/core/vcpu.cc +++ b/core/vcpu.cc @@ -187,13 +187,25 @@ void Vcpu::SetupCpuid() { if (entry->function == 0x40000000) { entry->eax += 0x100; } else if (entry->function == 0x40000001) { - entry->eax &= ( - KVM_FEATURE_CLOCKSOURCE | KVM_FEATURE_NOP_IO_DELAY | KVM_FEATURE_MMU_OP | - KVM_FEATURE_CLOCKSOURCE2 | KVM_FEATURE_ASYNC_PF | KVM_FEATURE_STEAL_TIME | - KVM_FEATURE_PV_EOI | KVM_FEATURE_PV_UNHALT | KVM_FEATURE_PV_TLB_FLUSH | - KVM_FEATURE_ASYNC_PF_VMEXIT | KVM_FEATURE_PV_SEND_IPI | KVM_FEATURE_POLL_CONTROL | - KVM_FEATURE_PV_SCHED_YIELD | KVM_FEATURE_CLOCKSOURCE_STABLE_BIT - ); + entry->eax &= ( + KVM_FEATURE_CLOCKSOURCE | + KVM_FEATURE_NOP_IO_DELAY | + KVM_FEATURE_CLOCKSOURCE2 | + KVM_FEATURE_ASYNC_PF | + KVM_FEATURE_STEAL_TIME | + KVM_FEATURE_PV_EOI | + KVM_FEATURE_PV_UNHALT | + KVM_FEATURE_PV_TLB_FLUSH | + KVM_FEATURE_ASYNC_PF_VMEXIT | + KVM_FEATURE_PV_SEND_IPI | + KVM_FEATURE_POLL_CONTROL | + KVM_FEATURE_PV_SCHED_YIELD | + KVM_FEATURE_ASYNC_PF_INT | + KVM_FEATURE_MSI_EXT_DEST_ID | + KVM_FEATURE_HC_MAP_GPA_RANGE | + KVM_FEATURE_MIGRATION_CONTROL | + KVM_FEATURE_CLOCKSOURCE_STABLE_BIT + ); } entry->function += 0x100; break; diff --git a/devices/chipset/pmio.cc b/devices/chipset/pmio.cc index 006b479..b458fba 100644 --- a/devices/chipset/pmio.cc +++ b/devices/chipset/pmio.cc @@ -92,7 +92,8 @@ void Pmio::AcpiSuspend(uint8_t type) { std::thread([this]() { manager_->machine()->Pause(); MV_LOG("machine is power off"); - }).detach(); + }).join(); + manager_->machine()->Quit(); break; case 1: // suspend request MV_PANIC("suspend is not supported"); diff --git a/images/raw.cc b/images/raw.cc index 7e7691d..9a7eb6f 100644 --- a/images/raw.cc +++ b/images/raw.cc @@ -23,6 +23,10 @@ #include #include #include +#include +#include +#include + #include "logger.h" #include "device_manager.h" @@ -59,15 +63,17 @@ class RawImage : public DiskImage { std::filesystem::copy_file(filepath_, temp, std::filesystem::copy_options::overwrite_existing); filepath_ = temp; } - fd_ = open(filepath_.c_str(), oflags); if (fd_ < 0) MV_PANIC("disk file not found: %s", filepath_.c_str()); - - struct stat st; - fstat(fd_, &st); - block_size_ = 512; - total_blocks_ = st.st_size / block_size_; + long long size_blockdevice; + if(ioctl(fd_,BLKGETSIZE64,&size_blockdevice)!=-1) { + total_blocks_ = size_blockdevice / block_size_; + block_size_ = 512; + total_blocks_ = size_blockdevice / block_size_; + } else { + MV_PANIC("ioctl failed"); + } } long HandleIoRequest(const ImageIoRequest& request) { diff --git a/main.cc b/main.cc index d355d51..cb0fe0a 100644 --- a/main.cc +++ b/main.cc @@ -222,7 +222,8 @@ int main(int argc, char* argv[]) { } const char* displayVar = std::getenv("DISPLAY"); - if (displayVar == nullptr) { + const char* waylandVar = std::getenv("WAYLAND_DISPLAY"); + if (displayVar == nullptr && waylandVar == nullptr) { if (vnc_port == 0) { vnc_port = 5901; } diff --git a/meson.build b/meson.build index 3cb582f..f74f9f9 100644 --- a/meson.build +++ b/meson.build @@ -3,9 +3,7 @@ project('mvisor', 'c', 'cpp', license: 'GPLv3', default_options: [ 'buildtype=debugoptimized', - 'warning_level=2', 'cpp_std=c++17', - 'werror=true' ] )