@@ -6,7 +6,6 @@
#include <pthread.h>
#include "qemu-common.h"
-#include "qemu-barrier.h"
#include "qemu-spice.h"
#include "qemu-timer.h"
#include "qemu-queue.h"
@@ -176,11 +175,6 @@ static inline uint32_t msb_mask(uint32_t val)
return mask;
}
-static inline void atomic_or(uint32_t *var, uint32_t add)
-{
- __asm__ __volatile__ ("lock; orl %1, %0" : "+m" (*var) : "r" (add) : "memory");
-}
-
static ram_addr_t qxl_rom_size(void)
{
uint32_t rom_size = sizeof(QXLRom) + sizeof(QXLModes) + sizeof(qxl_modes);
@@ -892,12 +886,13 @@ static void pipe_read(void *opaque)
static void qxl_send_events(PCIQXLDevice *d, uint32_t events)
{
+ uint32_t old_pending;
+
assert(d->ssd.running);
- smp_wmb();
- if ((d->ram->int_pending & events) == events) {
+ old_pending = __sync_fetch_and_or(&d->ram->int_pending, events);
+ if ((old_pending & events) == events) {
return;
}
- atomic_or(&d->ram->int_pending, events);
if (pthread_self() == d->main) {
qxl_set_irq(d);
} else {