mirror of https://github.com/xemu-project/xemu.git
* MIPS-KVM fixes.
* Coverity fixes. * Nettle function prototype fixes. * Memory API refcount fix. -----BEGIN PGP SIGNATURE----- Version: GnuPG v2 iQEcBAABCAAGBQJVp/F3AAoJEL/70l94x66DLqgH/0MMGJfs5M16chK4nA/oxYH8 GtZgA7t0j8zKrjZ8StllGnpLXai2/+hp7qnlKBeAQ5U6qVuD2ETA9BA/5ppWgK2n HOjQUpHKOveF6bJxnQelIKHMCyZjjQeIcn4HzCzItfEY09OG1p+V7IR3z5OQvhFB iMx6/dLAaTt7m7fXCWRZ8C6PV8tmmX9jFLjQZAqG6dOFlUqbTw4po7S3gcvh9elD 0vv47mkATWWwtVVWtopxk5+PYNcShI6JjhL1dhlPhUDZy+SIsbmaXHYMAP45gEen jLrmgE+RxE9c0siPrrBSNPInwHaADYqCm1q4sCbN0wpcIXoNgFqer543BTc2Q80= =dYcd -----END PGP SIGNATURE----- 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>
This commit is contained in:
commit
b92304ee81
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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");
|
||||
}
|
||||
|
||||
|
|
44
memory.c
44
memory.c
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
Loading…
Reference in New Issue