diff options
author | Peter Maydell <peter.maydell@linaro.org> | 2015-01-14 18:02:47 +0000 |
---|---|---|
committer | Peter Maydell <peter.maydell@linaro.org> | 2015-01-14 18:02:47 +0000 |
commit | b629a38a13745d62d44de8ebb00f4e38ec6d8f7e (patch) | |
tree | 2318cf294ffd0390d5078593fdcfdb1ce830a274 /hw | |
parent | 3a7f560fa612610822727f7647ed6bc10bccd6ec (diff) | |
parent | 1979b908b6e99cc24c1c0746060422f8778aa9d9 (diff) |
Merge remote-tracking branch 'remotes/bonzini/tags/for-upstream' into staging
Mostly bugfixes and cleanups from qemu-devel. Yet another small patch from
the record/replay series, and a few SCSI and i386 patches as well.
# gpg: Signature made Wed 14 Jan 2015 09:39:14 GMT using RSA key ID 78C7AE83
# gpg: Good signature from "Paolo Bonzini <bonzini@gnu.org>"
# gpg: aka "Paolo Bonzini <pbonzini@redhat.com>"
# gpg: WARNING: This key is not certified with sufficiently trusted signatures!
# gpg: It is not certain that the signature belongs to the owner.
# Primary key fingerprint: 46F5 9FBD 57D6 12E7 BFD4 E2F7 7E15 100C CD36 69B1
# Subkey fingerprint: F133 3857 4B66 2389 866C 7682 BFFB D25F 78C7 AE83
* remotes/bonzini/tags/for-upstream:
cpus: consistently use QEMU_CLOCK_VIRTUAL_RT for icount_warp_rt timer
qemu-timer: rename timer_init to timer_init_tl
scsi: fix cancellation when I/O was completed but DMA was not.
rules.mak: Fix module build
hw/scsi/lsi53c895a: add support for additional diag / debug registers
qemu-common.h: optimise muldiv64 if int128 is available
target-i386: do not memcpy in and out of xmm_regs
target-i386: fix movntsd on big-endian hosts
vl.c: fix regression when reading memory size from config file
vl: Don't silently change topology when all -smp options were set
vl: fix max_cpus check
vl: Avoid unnecessary 'if' nesting
9pfs: changed to use event_notifier instead of qemu_pipe
vl.c: fix regression when reading machine type from config file
char: restore stdio echo on resume from suspend.
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
Diffstat (limited to 'hw')
-rw-r--r-- | hw/9pfs/virtio-9p-coth.c | 29 | ||||
-rw-r--r-- | hw/9pfs/virtio-9p-coth.h | 4 | ||||
-rw-r--r-- | hw/scsi/lsi53c895a.c | 6 | ||||
-rw-r--r-- | hw/scsi/scsi-bus.c | 2 |
4 files changed, 17 insertions, 24 deletions
diff --git a/hw/9pfs/virtio-9p-coth.c b/hw/9pfs/virtio-9p-coth.c index ae6cde8005..8185c533c0 100644 --- a/hw/9pfs/virtio-9p-coth.c +++ b/hw/9pfs/virtio-9p-coth.c @@ -14,6 +14,7 @@ #include "fsdev/qemu-fsdev.h" #include "qemu/thread.h" +#include "qemu/event_notifier.h" #include "block/coroutine.h" #include "virtio-9p-coth.h" @@ -26,15 +27,11 @@ void co_run_in_worker_bh(void *opaque) g_thread_pool_push(v9fs_pool.pool, co, NULL); } -static void v9fs_qemu_process_req_done(void *arg) +static void v9fs_qemu_process_req_done(EventNotifier *e) { - char byte; - ssize_t len; Coroutine *co; - do { - len = read(v9fs_pool.rfd, &byte, sizeof(byte)); - } while (len == -1 && errno == EINTR); + event_notifier_test_and_clear(e); while ((co = g_async_queue_try_pop(v9fs_pool.completed)) != NULL) { qemu_coroutine_enter(co, NULL); @@ -43,22 +40,18 @@ static void v9fs_qemu_process_req_done(void *arg) static void v9fs_thread_routine(gpointer data, gpointer user_data) { - ssize_t len; - char byte = 0; Coroutine *co = data; qemu_coroutine_enter(co, NULL); g_async_queue_push(v9fs_pool.completed, co); - do { - len = write(v9fs_pool.wfd, &byte, sizeof(byte)); - } while (len == -1 && errno == EINTR); + + event_notifier_set(&v9fs_pool.e); } int v9fs_init_worker_threads(void) { int ret = 0; - int notifier_fds[2]; V9fsThPool *p = &v9fs_pool; sigset_t set, oldset; @@ -66,10 +59,6 @@ int v9fs_init_worker_threads(void) /* Leave signal handling to the iothread. */ pthread_sigmask(SIG_SETMASK, &set, &oldset); - if (qemu_pipe(notifier_fds) == -1) { - ret = -1; - goto err_out; - } p->pool = g_thread_pool_new(v9fs_thread_routine, p, -1, FALSE, NULL); if (!p->pool) { ret = -1; @@ -84,13 +73,9 @@ int v9fs_init_worker_threads(void) ret = -1; goto err_out; } - p->rfd = notifier_fds[0]; - p->wfd = notifier_fds[1]; - - fcntl(p->rfd, F_SETFL, O_NONBLOCK); - fcntl(p->wfd, F_SETFL, O_NONBLOCK); + event_notifier_init(&p->e, 0); - qemu_set_fd_handler(p->rfd, v9fs_qemu_process_req_done, NULL, NULL); + event_notifier_set_handler(&p->e, v9fs_qemu_process_req_done); err_out: pthread_sigmask(SIG_SETMASK, &oldset, NULL); return ret; diff --git a/hw/9pfs/virtio-9p-coth.h b/hw/9pfs/virtio-9p-coth.h index 86d5ed4169..4f51b250d1 100644 --- a/hw/9pfs/virtio-9p-coth.h +++ b/hw/9pfs/virtio-9p-coth.h @@ -21,8 +21,8 @@ #include <glib.h> typedef struct V9fsThPool { - int rfd; - int wfd; + EventNotifier e; + GThreadPool *pool; GAsyncQueue *completed; } V9fsThPool; diff --git a/hw/scsi/lsi53c895a.c b/hw/scsi/lsi53c895a.c index ec920488d6..db7d4b8c9c 100644 --- a/hw/scsi/lsi53c895a.c +++ b/hw/scsi/lsi53c895a.c @@ -277,6 +277,7 @@ typedef struct { uint32_t csbc; uint32_t scratch[18]; /* SCRATCHA-SCRATCHR */ uint8_t sbr; + uint32_t adder; /* Script ram is stored as 32-bit words in host byteorder. */ uint32_t script_ram[2048]; @@ -1389,6 +1390,7 @@ again: switch ((insn >> 27) & 7) { case 0: /* Jump */ DPRINTF("Jump to 0x%08x\n", addr); + s->adder = addr; s->dsp = addr; break; case 1: /* Call */ @@ -1513,6 +1515,8 @@ static uint8_t lsi_reg_readb(LSIState *s, int offset) return 0x7f; case 0x08: /* Revision ID */ return 0x00; + case 0x09: /* SOCL */ + return s->socl; case 0xa: /* SSID */ return s->ssid; case 0xb: /* SBCL */ @@ -1577,6 +1581,8 @@ static uint8_t lsi_reg_readb(LSIState *s, int offset) return s->sbr; case 0x3b: /* DCNTL */ return s->dcntl; + /* ADDER Output (Debug of relative jump address) */ + CASE_GET_REG32(adder, 0x3c) case 0x40: /* SIEN0 */ return s->sien0; case 0x41: /* SIEN1 */ diff --git a/hw/scsi/scsi-bus.c b/hw/scsi/scsi-bus.c index 24f7b74ae8..9b740a3cfa 100644 --- a/hw/scsi/scsi-bus.c +++ b/hw/scsi/scsi-bus.c @@ -1770,6 +1770,8 @@ void scsi_req_cancel(SCSIRequest *req) req->io_canceled = true; if (req->aiocb) { blk_aio_cancel(req->aiocb); + } else { + scsi_req_cancel_complete(req); } } |