X-Git-Url: http://v3vee.org/palacios/gitweb/gitweb.cgi?a=blobdiff_plain;f=palacios%2Finclude%2Fpalacios%2Fvmm_lock.h;h=5531aead37c3c4cf06a760320cbf4ca53a7c33d0;hb=626494b00fd477070f7eb43693eb16c4dc45f66b;hp=575bb81da14f0fad58de87e2b3ae7c00b7d269e8;hpb=2dd1cacbcfe8c0c9acc1d04098e0e2e65a505202;p=palacios.git diff --git a/palacios/include/palacios/vmm_lock.h b/palacios/include/palacios/vmm_lock.h index 575bb81..5531aea 100644 --- a/palacios/include/palacios/vmm_lock.h +++ b/palacios/include/palacios/vmm_lock.h @@ -23,20 +23,50 @@ #ifdef __V3VEE__ #include +// Exclusive locks + typedef addr_t v3_lock_t; int v3_lock_init(v3_lock_t * lock); void v3_lock_deinit(v3_lock_t * lock); +// Interreupts unaffected void v3_lock(v3_lock_t lock); void v3_unlock(v3_lock_t lock); - +// Interrupts disabled addr_t v3_lock_irqsave(v3_lock_t lock); void v3_unlock_irqrestore(v3_lock_t lock, addr_t irq_state); +// Reader-writer locks + +typedef struct v3_rw_lock { + v3_lock_t lock; + sint64_t reader_count; +} v3_rw_lock_t; + +int v3_rw_lock_init(v3_rw_lock_t *lock); +void v3_rw_lock_deinit(v3_rw_lock_t *lock); + +// A read lock is not exclusive and does not +// affect interrupts +void v3_read_lock(v3_rw_lock_t *lock); +void v3_read_unlock(v3_rw_lock_t *lock); + +// A write lock is exclusive and may affect +// interrupts + +// leaves interrupt state alone +void v3_write_lock(v3_rw_lock_t *lock); +void v3_read_unlock(v3_rw_lock_t *lock); + +// turn interrupts off +addr_t v3_write_lock_irqsave(v3_rw_lock_t *lock); +void v3_write_unlock_irqrestore(v3_rw_lock_t *lock, addr_t irq_state); + + #endif #endif