diff options
author | Peter Maydell <peter.maydell@linaro.org> | 2015-07-16 19:18:15 +0100 |
---|---|---|
committer | Peter Maydell <peter.maydell@linaro.org> | 2015-07-16 19:18:15 +0100 |
commit | b92304ee814f0fe8109c8946dfb4dd4b63e89871 (patch) | |
tree | 0942cb41a2530c147e0e04a1bfcccd8cbdd3571e | |
parent | 67ff64e08245a5b8de98d9b2acefb840a1fae340 (diff) | |
parent | d3462e378f40ba6838b6c42584c30769ca633e6f (diff) | |
download | qemu-b92304ee814f0fe8109c8946dfb4dd4b63e89871.zip qemu-b92304ee814f0fe8109c8946dfb4dd4b63e89871.tar.gz qemu-b92304ee814f0fe8109c8946dfb4dd4b63e89871.tar.bz2 |
Merge remote-tracking branch 'remotes/bonzini/tags/for-upstream' into staging
* MIPS-KVM fixes.
* Coverity fixes.
* Nettle function prototype fixes.
* Memory API refcount fix.
# gpg: Signature made Thu Jul 16 19:01:27 2015 BST 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:
crypto: avoid undefined behavior in nettle calls
crypto: fix build with nettle >= 3.0.0
memory: fix refcount leak in memory_region_present
RDMA: Fix error exits
arm/xlnx-zynqmp: fix memory leak
ppc/spapr_drc: fix memory leak
mips/kvm: Sign extend registers written to KVM
mips/kvm: Fix Big endian 32-bit register access
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
-rwxr-xr-x | configure | 4 | ||||
-rw-r--r-- | crypto/cipher-nettle.c | 51 | ||||
-rw-r--r-- | hw/arm/xlnx-zynqmp.c | 2 | ||||
-rw-r--r-- | hw/ppc/spapr_drc.c | 1 | ||||
-rw-r--r-- | memory.c | 44 | ||||
-rw-r--r-- | migration/rdma.c | 8 | ||||
-rw-r--r-- | target-mips/kvm.c | 21 |
7 files changed, 90 insertions, 41 deletions
@@ -2183,6 +2183,7 @@ if test "$gnutls_nettle" != "no"; then if $pkg_config --exists "nettle"; then nettle_cflags=`$pkg_config --cflags nettle` nettle_libs=`$pkg_config --libs nettle` + nettle_version=`$pkg_config --modversion nettle` libs_softmmu="$nettle_libs $libs_softmmu" libs_tools="$nettle_libs $libs_tools" QEMU_CFLAGS="$QEMU_CFLAGS $nettle_cflags" @@ -4490,7 +4491,7 @@ echo "GTK support $gtk" echo "GNUTLS support $gnutls" echo "GNUTLS hash $gnutls_hash" echo "GNUTLS gcrypt $gnutls_gcrypt" -echo "GNUTLS nettle $gnutls_nettle" +echo "GNUTLS nettle $gnutls_nettle ${gnutls_nettle+($nettle_version)}" echo "VTE support $vte" echo "curses support $curses" echo "curl support $curl" @@ -4858,6 +4859,7 @@ if test "$gnutls_gcrypt" = "yes" ; then fi if test "$gnutls_nettle" = "yes" ; then echo "CONFIG_GNUTLS_NETTLE=y" >> $config_host_mak + echo "CONFIG_NETTLE_VERSION_MAJOR=${nettle_version%%.*}" >> $config_host_mak fi if test "$vte" = "yes" ; then echo "CONFIG_VTE=y" >> $config_host_mak diff --git a/crypto/cipher-nettle.c b/crypto/cipher-nettle.c index e5a14bc..a55a8e8 100644 --- a/crypto/cipher-nettle.c +++ b/crypto/cipher-nettle.c @@ -23,12 +23,51 @@ #include <nettle/des.h> #include <nettle/cbc.h> +#if CONFIG_NETTLE_VERSION_MAJOR < 3 +typedef nettle_crypt_func nettle_cipher_func; + +typedef void * cipher_ctx_t; +typedef unsigned cipher_length_t; +#else +typedef const void * cipher_ctx_t; +typedef size_t cipher_length_t; +#endif + +static nettle_cipher_func aes_encrypt_wrapper; +static nettle_cipher_func aes_decrypt_wrapper; +static nettle_cipher_func des_encrypt_wrapper; +static nettle_cipher_func des_decrypt_wrapper; + +static void aes_encrypt_wrapper(cipher_ctx_t ctx, cipher_length_t length, + uint8_t *dst, const uint8_t *src) +{ + aes_encrypt(ctx, length, dst, src); +} + +static void aes_decrypt_wrapper(cipher_ctx_t ctx, cipher_length_t length, + uint8_t *dst, const uint8_t *src) +{ + aes_encrypt(ctx, length, dst, src); +} + +static void des_encrypt_wrapper(cipher_ctx_t ctx, cipher_length_t length, + uint8_t *dst, const uint8_t *src) +{ + des_encrypt(ctx, length, dst, src); +} + +static void des_decrypt_wrapper(cipher_ctx_t ctx, cipher_length_t length, + uint8_t *dst, const uint8_t *src) +{ + des_decrypt(ctx, length, dst, src); +} + typedef struct QCryptoCipherNettle QCryptoCipherNettle; struct QCryptoCipherNettle { void *ctx_encrypt; void *ctx_decrypt; - nettle_crypt_func *alg_encrypt; - nettle_crypt_func *alg_decrypt; + nettle_cipher_func *alg_encrypt; + nettle_cipher_func *alg_decrypt; uint8_t *iv; size_t niv; }; @@ -83,8 +122,8 @@ QCryptoCipher *qcrypto_cipher_new(QCryptoCipherAlgorithm alg, des_set_key(ctx->ctx_encrypt, rfbkey); g_free(rfbkey); - ctx->alg_encrypt = (nettle_crypt_func *)des_encrypt; - ctx->alg_decrypt = (nettle_crypt_func *)des_decrypt; + ctx->alg_encrypt = des_encrypt_wrapper; + ctx->alg_decrypt = des_decrypt_wrapper; ctx->niv = DES_BLOCK_SIZE; break; @@ -98,8 +137,8 @@ QCryptoCipher *qcrypto_cipher_new(QCryptoCipherAlgorithm alg, aes_set_encrypt_key(ctx->ctx_encrypt, nkey, key); aes_set_decrypt_key(ctx->ctx_decrypt, nkey, key); - ctx->alg_encrypt = (nettle_crypt_func *)aes_encrypt; - ctx->alg_decrypt = (nettle_crypt_func *)aes_decrypt; + ctx->alg_encrypt = aes_encrypt_wrapper; + ctx->alg_decrypt = aes_decrypt_wrapper; ctx->niv = AES_BLOCK_SIZE; break; diff --git a/hw/arm/xlnx-zynqmp.c b/hw/arm/xlnx-zynqmp.c index 5e72078..62ef4ce 100644 --- a/hw/arm/xlnx-zynqmp.c +++ b/hw/arm/xlnx-zynqmp.c @@ -144,6 +144,7 @@ static void xlnx_zynqmp_realize(DeviceState *dev, Error **errp) } else { s->boot_cpu_ptr = &s->apu_cpu[i]; } + g_free(name); object_property_set_int(OBJECT(&s->apu_cpu[i]), GIC_BASE_ADDR, "reset-cbar", &err); @@ -181,6 +182,7 @@ static void xlnx_zynqmp_realize(DeviceState *dev, Error **errp) } else { s->boot_cpu_ptr = &s->rpu_cpu[i]; } + g_free(name); object_property_set_bool(OBJECT(&s->rpu_cpu[i]), true, "reset-hivecs", &err); diff --git a/hw/ppc/spapr_drc.c b/hw/ppc/spapr_drc.c index ef98538..ee87432 100644 --- a/hw/ppc/spapr_drc.c +++ b/hw/ppc/spapr_drc.c @@ -422,6 +422,7 @@ static void realize(DeviceState *d, Error **errp) error_free(err); object_unref(OBJECT(drc)); } + g_free(child_name); DPRINTFN("drc realize complete"); } @@ -1887,23 +1887,16 @@ static FlatRange *flatview_lookup(FlatView *view, AddrRange addr) sizeof(FlatRange), cmp_flatrange_addr); } -bool memory_region_present(MemoryRegion *container, hwaddr addr) -{ - MemoryRegion *mr = memory_region_find(container, addr, 1).mr; - if (!mr || (mr == container)) { - return false; - } - memory_region_unref(mr); - return true; -} - bool memory_region_is_mapped(MemoryRegion *mr) { return mr->container ? true : false; } -MemoryRegionSection memory_region_find(MemoryRegion *mr, - hwaddr addr, uint64_t size) +/* Same as memory_region_find, but it does not add a reference to the + * returned region. It must be called from an RCU critical section. + */ +static MemoryRegionSection memory_region_find_rcu(MemoryRegion *mr, + hwaddr addr, uint64_t size) { MemoryRegionSection ret = { .mr = NULL }; MemoryRegion *root; @@ -1924,11 +1917,10 @@ MemoryRegionSection memory_region_find(MemoryRegion *mr, } range = addrrange_make(int128_make64(addr), int128_make64(size)); - rcu_read_lock(); view = atomic_rcu_read(&as->current_map); fr = flatview_lookup(view, range); if (!fr) { - goto out; + return ret; } while (fr > view->ranges && addrrange_intersects(fr[-1].addr, range)) { @@ -1944,12 +1936,32 @@ MemoryRegionSection memory_region_find(MemoryRegion *mr, ret.size = range.size; ret.offset_within_address_space = int128_get64(range.start); ret.readonly = fr->readonly; - memory_region_ref(ret.mr); -out: + return ret; +} + +MemoryRegionSection memory_region_find(MemoryRegion *mr, + hwaddr addr, uint64_t size) +{ + MemoryRegionSection ret; + rcu_read_lock(); + ret = memory_region_find_rcu(mr, addr, size); + if (ret.mr) { + memory_region_ref(ret.mr); + } rcu_read_unlock(); return ret; } +bool memory_region_present(MemoryRegion *container, hwaddr addr) +{ + MemoryRegion *mr; + + rcu_read_lock(); + mr = memory_region_find_rcu(container, addr, 1).mr; + rcu_read_unlock(); + return mr && mr != container; +} + void address_space_sync_dirty_bitmap(AddressSpace *as) { FlatView *view; diff --git a/migration/rdma.c b/migration/rdma.c index f106b2a..74876fd 100644 --- a/migration/rdma.c +++ b/migration/rdma.c @@ -2997,7 +2997,7 @@ static int qemu_rdma_registration_handle(QEMUFile *f, void *opaque) (unsigned int)comp->block_idx, rdma->local_ram_blocks.nb_blocks); ret = -EIO; - break; + goto out; } block = &(rdma->local_ram_blocks.block[comp->block_idx]); @@ -3092,7 +3092,7 @@ static int qemu_rdma_registration_handle(QEMUFile *f, void *opaque) (unsigned int)reg->current_index, rdma->local_ram_blocks.nb_blocks); ret = -ENOENT; - break; + goto out; } block = &(rdma->local_ram_blocks.block[reg->current_index]); if (block->is_ram_block) { @@ -3102,7 +3102,7 @@ static int qemu_rdma_registration_handle(QEMUFile *f, void *opaque) block->block_name, block->offset, reg->key.current_addr); ret = -ERANGE; - break; + goto out; } host_addr = (block->local_host_addr + (reg->key.current_addr - block->offset)); @@ -3118,7 +3118,7 @@ static int qemu_rdma_registration_handle(QEMUFile *f, void *opaque) " chunk: %" PRIx64, block->block_name, reg->key.chunk); ret = -ERANGE; - break; + goto out; } } chunk_start = ram_chunk_start(block, chunk); diff --git a/target-mips/kvm.c b/target-mips/kvm.c index bd64a70..d287d42 100644 --- a/target-mips/kvm.c +++ b/target-mips/kvm.c @@ -235,10 +235,9 @@ int kvm_mips_set_ipi_interrupt(MIPSCPU *cpu, int irq, int level) static inline int kvm_mips_put_one_reg(CPUState *cs, uint64_t reg_id, int32_t *addr) { - uint64_t val64 = *addr; struct kvm_one_reg cp0reg = { .id = reg_id, - .addr = (uintptr_t)&val64 + .addr = (uintptr_t)addr }; return kvm_vcpu_ioctl(cs, KVM_SET_ONE_REG, &cp0reg); @@ -270,18 +269,12 @@ static inline int kvm_mips_put_one_reg64(CPUState *cs, uint64_t reg_id, static inline int kvm_mips_get_one_reg(CPUState *cs, uint64_t reg_id, int32_t *addr) { - int ret; - uint64_t val64 = 0; struct kvm_one_reg cp0reg = { .id = reg_id, - .addr = (uintptr_t)&val64 + .addr = (uintptr_t)addr }; - ret = kvm_vcpu_ioctl(cs, KVM_GET_ONE_REG, &cp0reg); - if (ret >= 0) { - *addr = val64; - } - return ret; + return kvm_vcpu_ioctl(cs, KVM_GET_ONE_REG, &cp0reg); } static inline int kvm_mips_get_one_ulreg(CPUState *cs, uint64 reg_id, @@ -635,12 +628,12 @@ int kvm_arch_put_registers(CPUState *cs, int level) /* Set the registers based on QEMU's view of things */ for (i = 0; i < 32; i++) { - regs.gpr[i] = env->active_tc.gpr[i]; + regs.gpr[i] = (int64_t)(target_long)env->active_tc.gpr[i]; } - regs.hi = env->active_tc.HI[0]; - regs.lo = env->active_tc.LO[0]; - regs.pc = env->active_tc.PC; + regs.hi = (int64_t)(target_long)env->active_tc.HI[0]; + regs.lo = (int64_t)(target_long)env->active_tc.LO[0]; + regs.pc = (int64_t)(target_long)env->active_tc.PC; ret = kvm_vcpu_ioctl(cs, KVM_SET_REGS, ®s); |