diff --git a/repos/ports/include/vmm/log.h b/repos/ports/include/vmm/log.h index 9b3e615db0..7cee9e8216 100644 --- a/repos/ports/include/vmm/log.h +++ b/repos/ports/include/vmm/log.h @@ -16,7 +16,6 @@ /* Genode includes */ #include -#include #include /* NOVA includes */ @@ -34,10 +33,10 @@ namespace Vmm { { struct Utcb_backup { char buf[Nova::Utcb::size()]; }; - static Lock lock; + static Mutex mutex; static Utcb_backup utcb_backup; - Lock::Guard guard(lock); + Mutex::Guard guard(mutex); utcb_backup = *(Utcb_backup *)Thread::myself()->utcb(); @@ -51,10 +50,10 @@ namespace Vmm { { struct Utcb_backup { char buf[Nova::Utcb::size()]; }; - static Lock lock; + static Mutex mutex; static Utcb_backup utcb_backup; - Lock::Guard guard(lock); + Mutex::Guard guard(mutex); utcb_backup = *(Utcb_backup *)Thread::myself()->utcb(); @@ -68,10 +67,10 @@ namespace Vmm { { struct Utcb_backup { char buf[Nova::Utcb::size()]; }; - static Lock lock; + static Mutex mutex; static Utcb_backup utcb_backup; - Lock::Guard guard(lock); + Mutex::Guard guard(mutex); utcb_backup = *(Utcb_backup *)Thread::myself()->utcb(); diff --git a/repos/ports/src/virtualbox5/devxhci.cc b/repos/ports/src/virtualbox5/devxhci.cc index db385bf134..ca685a56a2 100644 --- a/repos/ports/src/virtualbox5/devxhci.cc +++ b/repos/ports/src/virtualbox5/devxhci.cc @@ -219,11 +219,11 @@ struct Timer_queue : public Qemu::Timer_queue Qemu::int64_t get_ns() { return TMTimerGetNano(tm_timer); } - Genode::Lock _timer_lock; + Genode::Mutex _timer_mutex { }; void register_timer(void *qtimer, void (*cb)(void*), void *data) override { - Genode::Lock::Guard lock_guard(_timer_lock); + Genode::Mutex::Guard guard(_timer_mutex); if (verbose_timer) Genode::log("qtimer: ", qtimer, " cb: ", cb, " data: ", data); @@ -238,7 +238,7 @@ struct Timer_queue : public Qemu::Timer_queue void delete_timer(void *qtimer) override { - Genode::Lock::Guard lock_guard(_timer_lock); + Genode::Mutex::Guard guard(_timer_mutex); if (verbose_timer) Genode::log("qtimer: ", qtimer); @@ -256,7 +256,7 @@ struct Timer_queue : public Qemu::Timer_queue void activate_timer(void *qtimer, long long int expire_abs) override { - Genode::Lock::Guard lock_guard(_timer_lock); + Genode::Mutex::Guard guard(_timer_mutex); if (verbose_timer) Genode::log("qtimer: ", qtimer, " expire: ", expire_abs); @@ -274,7 +274,7 @@ struct Timer_queue : public Qemu::Timer_queue void deactivate_timer(void *qtimer) override { - Genode::Lock::Guard lock_guard(_timer_lock); + Genode::Mutex::Guard guard(_timer_mutex); if (verbose_timer) Genode::log("qtimer: ", qtimer); diff --git a/repos/ports/src/virtualbox5/dummies.cc b/repos/ports/src/virtualbox5/dummies.cc index 5360009e8e..62278e8daa 100644 --- a/repos/ports/src/virtualbox5/dummies.cc +++ b/repos/ports/src/virtualbox5/dummies.cc @@ -12,6 +12,7 @@ */ #include +#include #include /* libc memcpy */ @@ -163,8 +164,7 @@ char *pdmR3FileR3(const char * file, bool) void RTAssertMsg2Add(const char *pszFormat, ...) { Genode::error(__func__, "not implemented"); - Genode::Lock lock(Genode::Lock::LOCKED); - lock.lock(); + Genode::sleep_forever(); } const char * RTBldCfgRevisionStr(void) diff --git a/repos/ports/src/virtualbox5/generic/sup_vmm.cc b/repos/ports/src/virtualbox5/generic/sup_vmm.cc index aa0a638dff..36b259da24 100644 --- a/repos/ports/src/virtualbox5/generic/sup_vmm.cc +++ b/repos/ports/src/virtualbox5/generic/sup_vmm.cc @@ -17,6 +17,7 @@ #include #include #include +#include #include #include #include @@ -728,8 +729,7 @@ uint64_t genode_cpu_hz() if (cpu_freq == 0) { Genode::error("could not read out CPU frequency"); - Genode::Lock lock; - lock.lock(); + Genode::sleep_forever(); } } diff --git a/repos/ports/src/virtualbox5/mm.cc b/repos/ports/src/virtualbox5/mm.cc index f6d617e2ee..8254fad781 100644 --- a/repos/ports/src/virtualbox5/mm.cc +++ b/repos/ports/src/virtualbox5/mm.cc @@ -48,14 +48,14 @@ static struct { static Libc::Mem_alloc * heap_by_mmtag(MMTAG enmTag) { enum { REGION_SIZE = 4096 * 4096 }; - static Genode::Lock memory_init_lock; + static Genode::Mutex memory_init_mutex { }; Assert(enmTag < sizeof(memory_regions) / sizeof(memory_regions[0])); if (memory_regions[enmTag].conn) return memory_regions[enmTag].heap; - Genode::Lock::Guard guard(memory_init_lock); + Genode::Mutex::Guard guard(memory_init_mutex); if (memory_regions[enmTag].conn) return memory_regions[enmTag].heap; diff --git a/repos/ports/src/virtualbox5/network.cpp b/repos/ports/src/virtualbox5/network.cpp index f743e64104..81c1c4901a 100644 --- a/repos/ports/src/virtualbox5/network.cpp +++ b/repos/ports/src/virtualbox5/network.cpp @@ -81,10 +81,10 @@ typedef struct DRVNIC * Return lock to synchronize the destruction of the * PDRVNIC, i.e., the Nic_client. */ -static Genode::Lock *destruct_lock() +static Genode::Blockade &destruct_blockade() { - static Genode::Lock lock(Genode::Lock::LOCKED); - return &lock; + static Genode::Blockade blockade { }; + return blockade; } @@ -153,7 +153,7 @@ class Nic_client _nic.rx_channel()->sigh_packet_avail(Genode::Signal_context_capability()); _nic.rx_channel()->sigh_ready_to_ack(Genode::Signal_context_capability()); - destruct_lock()->unlock(); + destruct_blockade().wakeup(); } void _tx_ack(bool block = false) @@ -451,7 +451,7 @@ static DECLCALLBACK(void) drvNicDestruct(PPDMDRVINS pDrvIns) Genode::Signal_transmitter(nic_client->dispatcher()).submit(); /* wait until the recv thread exits */ - destruct_lock()->lock(); + destruct_blockade().block(); if (nic_client) destroy(vmm_heap(), nic_client); diff --git a/repos/ports/src/virtualbox5/rt.cc b/repos/ports/src/virtualbox5/rt.cc index 291053ae31..ba0b9be312 100644 --- a/repos/ports/src/virtualbox5/rt.cc +++ b/repos/ports/src/virtualbox5/rt.cc @@ -189,7 +189,12 @@ class Avl_ds : public Genode::Avl_node Genode::Avl_tree Avl_ds::_runtime_ds; Genode::Avl_tree Avl_ds::_unused_ds; -static Genode::Lock lock_ds; + +static Genode::Mutex & mutex_ds() +{ + static Genode::Mutex mutex { }; + return mutex; +} Genode::addr_t Avl_ds::hit = 0; Genode::addr_t Avl_ds::hit_coarse = 0; @@ -209,7 +214,7 @@ static void *alloc_mem(size_t cb, const char *pszTag, bool executable = false) if (cb % 0x1000) cb = (cb & ~0xFFFUL) + 0x1000UL; - Lock::Guard guard(lock_ds); + Mutex::Guard guard(mutex_ds()); if (Avl_ds * ds_free = Avl_ds::find_match(cb)) { ds_free->used(cb); @@ -281,7 +286,7 @@ void *RTMemPageAllocTag(size_t cb, const char *pszTag) void RTMemPageFree(void *pv, size_t cb) { - Genode::Lock::Guard guard(lock_ds); + Genode::Mutex::Guard guard(mutex_ds()); Avl_ds::free_memory(pv, cb); } @@ -323,7 +328,7 @@ void * RTMemTCGAlloc(size_t cb) return alloc_mem(cb, __func__); { - Genode::Lock::Guard guard(lock_ds); + Genode::Mutex::Guard guard(mutex_ds()); for (Tcg_slab * tcg = list.first(); tcg; tcg = tcg->next()) { if (tcg->_full) @@ -341,7 +346,7 @@ void * RTMemTCGAlloc(size_t cb) Tcg_slab * tcg = new (vmm_heap()) Tcg_slab(alloc_mem(TCG_CACHE, __func__)); if (tcg && tcg->_base) { { - Genode::Lock::Guard guard(lock_ds); + Genode::Mutex::Guard guard(mutex_ds()); list.insert(tcg); } return RTMemTCGAlloc(cb); @@ -367,7 +372,7 @@ void * RTMemTCGAllocZ(size_t cb) void RTMemTCGFree(void *pv) { - Genode::Lock::Guard guard(lock_ds); + Genode::Mutex::Guard guard(mutex_ds()); Genode::addr_t const ptr = reinterpret_cast(pv); for (Tcg_slab * tcg = list.first(); tcg; tcg = tcg->next()) { @@ -393,7 +398,7 @@ void * RTMemTCGRealloc(void *ptr, size_t size) Genode::addr_t max_size = 0; { - Genode::Lock::Guard guard(lock_ds); + Genode::Mutex::Guard guard(mutex_ds()); max_size = Avl_ds::max_size_at(ptr); if (!max_size) { diff --git a/repos/ports/src/virtualbox5/spec/nova/sup.cc b/repos/ports/src/virtualbox5/spec/nova/sup.cc index 684e12b640..bd49fc9650 100644 --- a/repos/ports/src/virtualbox5/spec/nova/sup.cc +++ b/repos/ports/src/virtualbox5/spec/nova/sup.cc @@ -700,8 +700,7 @@ uint64_t genode_cpu_hz() if (cpu_freq == 0) { Genode::error("could not read out CPU frequency"); - Genode::Lock lock; - lock.lock(); + Genode::sleep_forever(); } } diff --git a/repos/ports/src/virtualbox5/spec/nova/vcpu.h b/repos/ports/src/virtualbox5/spec/nova/vcpu.h index f45a5c3fd7..eee8c2d4a3 100644 --- a/repos/ports/src/virtualbox5/spec/nova/vcpu.h +++ b/repos/ports/src/virtualbox5/spec/nova/vcpu.h @@ -17,6 +17,7 @@ /* Genode includes */ #include +#include #include #include #include @@ -858,8 +859,7 @@ class Vcpu_handler : public Vmm::Vcpu_dispatcher, if (ec_ctrl(EC_RECALL, _ec_sel) != NOVA_OK) { Genode::error("recall failed"); - Genode::Lock lock(Genode::Lock::LOCKED); - lock.lock(); + Genode::sleep_forever(); } #if 0 diff --git a/repos/ports/src/virtualbox5/thread.cc b/repos/ports/src/virtualbox5/thread.cc index 02eb9131e0..0cfee3c1f8 100644 --- a/repos/ports/src/virtualbox5/thread.cc +++ b/repos/ports/src/virtualbox5/thread.cc @@ -14,6 +14,7 @@ /* Genode */ #include #include +#include #include #include @@ -60,11 +61,11 @@ static Genode::Cpu_connection * cpu_connection(RTTHREADTYPE type) using namespace Genode; static Cpu_connection * con[RTTHREADTYPE_END - 1]; - static Lock lock; + static Mutex mutex { }; Assert(type && type < RTTHREADTYPE_END); - Lock::Guard guard(lock); + Mutex::Guard guard(mutex); if (con[type - 1]) return con[type - 1]; @@ -168,8 +169,7 @@ extern "C" int pthread_create(pthread_t *thread, const pthread_attr_t *attr, } Genode::error("could not create vbox pthread - halt"); - Genode::Lock lock(Genode::Lock::LOCKED); - lock.lock(); + Genode::sleep_forever(); return EAGAIN; } diff --git a/repos/ports/src/virtualbox5/vcpu.h b/repos/ports/src/virtualbox5/vcpu.h index 2dfee83faf..37fc6bb350 100644 --- a/repos/ports/src/virtualbox5/vcpu.h +++ b/repos/ports/src/virtualbox5/vcpu.h @@ -66,12 +66,12 @@ class Vcpu_handler : public Genode::List::Element protected: Genode::Entrypoint _ep; - Genode::Lock _lock_emt; + Genode::Blockade _blockade_emt { }; Genode::Semaphore _sem_handler; Genode::Vm_state *_state { nullptr }; /* halt / wakeup handling with timeout support */ - Genode::Lock _r0_block_guard; + Genode::Mutex _r0_mutex; Genode::Semaphore _r0_block; Genode::uint64_t _r0_wakeup_abs { 0 }; @@ -152,7 +152,7 @@ class Vcpu_handler : public Genode::List::Element _sem_handler.up(); /* wait for next exit */ - _lock_emt.lock(); + _blockade_emt.block(); /* next time run - recall() may change this */ _next_state = RUN; @@ -173,7 +173,7 @@ class Vcpu_handler : public Genode::List::Element if (npt_ept_unmap) { Genode::error("NPT/EPT unmap not supported - stop"); while (true) { - _lock_emt.lock(); + _blockade_emt.block(); } } @@ -204,7 +204,7 @@ class Vcpu_handler : public Genode::List::Element _vm_state = PAUSED; - _lock_emt.unlock(); + _blockade_emt.wakeup(); } bool _recall_handler() @@ -479,7 +479,7 @@ class Vcpu_handler : public Genode::List::Element _vm_exits ++; _vm_state = IRQ_WIN; - _lock_emt.unlock(); + _blockade_emt.wakeup(); } void _npt_ept() @@ -491,7 +491,7 @@ class Vcpu_handler : public Genode::List::Element _vm_exits ++; _vm_state = NPT_EPT; - _lock_emt.unlock(); + _blockade_emt.wakeup(); } void _irq_window_pthread() @@ -725,7 +725,7 @@ class Vcpu_handler : public Genode::List::Element void check_time() { { - Genode::Lock_guard lock(_r0_block_guard); + Genode::Mutex::Guard guard(_r0_mutex); const uint64_t u64NowGip = RTTimeNanoTS(); if (!_r0_wakeup_abs || _r0_wakeup_abs >= u64NowGip) @@ -738,7 +738,7 @@ class Vcpu_handler : public Genode::List::Element void halt(Genode::uint64_t rttime_abs) { { - Genode::Lock_guard lock(_r0_block_guard); + Genode::Mutex::Guard guard(_r0_mutex); _r0_wakeup_abs = rttime_abs; } @@ -748,7 +748,7 @@ class Vcpu_handler : public Genode::List::Element void wake_up() { { - Genode::Lock_guard lock(_r0_block_guard); + Genode::Mutex::Guard guard(_r0_mutex); _r0_wakeup_abs = 0; } diff --git a/repos/ports/src/virtualbox5/vcpu_svm.h b/repos/ports/src/virtualbox5/vcpu_svm.h index 4d5f66c838..3a93f4f7c5 100644 --- a/repos/ports/src/virtualbox5/vcpu_svm.h +++ b/repos/ports/src/virtualbox5/vcpu_svm.h @@ -94,7 +94,7 @@ class Vcpu_handler_svm : public Vcpu_handler break; case VCPU_STARTUP: _svm_startup(); - _lock_emt.unlock(); + _blockade_emt.wakeup(); /* pause - no resume */ break; default: @@ -170,13 +170,10 @@ class Vcpu_handler_svm : public Vcpu_handler { _state = _state_ds.local_addr(); - /* sync with initial startup exception */ - _lock_emt.lock(); - _vm_session.run(_vcpu); /* sync with initial startup exception */ - _lock_emt.lock(); + _blockade_emt.block(); } bool hw_save_state(Genode::Vm_state *state, VM * pVM, PVMCPU pVCpu) { diff --git a/repos/ports/src/virtualbox5/vcpu_vmx.h b/repos/ports/src/virtualbox5/vcpu_vmx.h index fe686f04ba..327a56d8e5 100644 --- a/repos/ports/src/virtualbox5/vcpu_vmx.h +++ b/repos/ports/src/virtualbox5/vcpu_vmx.h @@ -156,7 +156,7 @@ class Vcpu_handler_vmx : public Vcpu_handler break; case VCPU_STARTUP: _vmx_startup(); - _lock_emt.unlock(); + _blockade_emt.wakeup(); /* pause - no resume */ break; default: @@ -245,13 +245,10 @@ class Vcpu_handler_vmx : public Vcpu_handler { _state = _state_ds.local_addr(); - /* sync with initial startup exception */ - _lock_emt.lock(); - _vm_session.run(_vcpu); /* sync with initial startup exception */ - _lock_emt.lock(); + _blockade_emt.block(); } bool hw_save_state(Genode::Vm_state *state, VM * pVM, PVMCPU pVCpu) {