Skip to content

Commit

Permalink
Merge remote-tracking branch 'remotes/kvm/uq/master' into staging
Browse files Browse the repository at this point in the history
* remotes/kvm/uq/master:
  qtest: fix vhost-user-test compilation with old GLib
  mc146818rtc: register the clock reset notifier on the right clock
  oslib-posix: Fix new compiler error with -Wclobbered
  target-i386: Add "kvmclock-stable-bit" feature bit name
  Enforce stack protector usage
  watchdog: fix deadlock with -watchdog-action pause
  mips_malta: Catch kernels linked at wrong address
  mips_malta: Remove incorrect KVM T&E references
  mips/kvm: Disable FPU on reset with KVM
  mips/kvm: Init EBase to correct KSEG0

Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
  • Loading branch information
pm215 committed Jul 10, 2014
2 parents 9e99c5f + 0a58991 commit 74aeb37
Show file tree
Hide file tree
Showing 9 changed files with 66 additions and 22 deletions.
9 changes: 8 additions & 1 deletion configure
Expand Up @@ -1489,18 +1489,25 @@ for flag in $gcc_flags; do
fi
done

if test "$stack_protector" != "no" ; then
if test "$stack_protector" != "no"; then
gcc_flags="-fstack-protector-strong -fstack-protector-all"
sp_on=0
for flag in $gcc_flags; do
# We need to check both a compile and a link, since some compiler
# setups fail only on a .c->.o compile and some only at link time
if do_cc $QEMU_CFLAGS -Werror $flag -c -o $TMPO $TMPC &&
compile_prog "-Werror $flag" ""; then
QEMU_CFLAGS="$QEMU_CFLAGS $flag"
LIBTOOLFLAGS="$LIBTOOLFLAGS -Wc,$flag"
sp_on=1
break
fi
done
if test "$stack_protector" = yes; then
if test $sp_on = 0; then
error_exit "Stack protector not supported"
fi
fi
fi

# Workaround for http://gcc.gnu.org/PR55489. Happens with -fPIE/-fPIC and
Expand Down
20 changes: 17 additions & 3 deletions hw/mips/mips_malta.c
Expand Up @@ -792,9 +792,23 @@ static int64_t load_kernel (void)
loaderparams.kernel_filename);
exit(1);
}

/* Sanity check where the kernel has been linked */
if (kvm_enabled()) {
if (kernel_entry & 0x80000000ll) {
error_report("KVM guest kernels must be linked in useg. "
"Did you forget to enable CONFIG_KVM_GUEST?");
exit(1);
}

xlate_to_kseg0 = cpu_mips_kvm_um_phys_to_kseg0;
} else {
if (!(kernel_entry & 0x80000000ll)) {
error_report("KVM guest kernels aren't supported with TCG. "
"Did you unintentionally enable CONFIG_KVM_GUEST?");
exit(1);
}

xlate_to_kseg0 = cpu_mips_phys_to_kseg0;
}

Expand Down Expand Up @@ -1028,7 +1042,7 @@ void mips_malta_init(MachineState *machine)
fl_idx++;
if (kernel_filename) {
ram_low_size = MIN(ram_size, 256 << 20);
/* For KVM T&E we reserve 1MB of RAM for running bootloader */
/* For KVM we reserve 1MB of RAM for running bootloader */
if (kvm_enabled()) {
ram_low_size -= 0x100000;
bootloader_run_addr = 0x40000000 + ram_low_size;
Expand All @@ -1052,10 +1066,10 @@ void mips_malta_init(MachineState *machine)
bootloader_run_addr, kernel_entry);
}
} else {
/* The flash region isn't executable from a KVM T&E guest */
/* The flash region isn't executable from a KVM guest */
if (kvm_enabled()) {
error_report("KVM enabled but no -kernel argument was specified. "
"Booting from flash is not supported with KVM T&E.");
"Booting from flash is not supported with KVM.");
exit(1);
}
/* Load firmware from flash. */
Expand Down
2 changes: 1 addition & 1 deletion hw/timer/mc146818rtc.c
Expand Up @@ -895,7 +895,7 @@ static void rtc_realizefn(DeviceState *dev, Error **errp)
check_update_timer(s);

s->clock_reset_notifier.notify = rtc_notify_clock_reset;
qemu_clock_register_reset_notifier(QEMU_CLOCK_REALTIME,
qemu_clock_register_reset_notifier(rtc_clock,
&s->clock_reset_notifier);

s->suspend_notifier.notify = rtc_notify_suspend;
Expand Down
6 changes: 5 additions & 1 deletion hw/watchdog/watchdog.c
Expand Up @@ -122,8 +122,12 @@ void watchdog_perform_action(void)
exit(0);

case WDT_PAUSE: /* same as 'stop' command in monitor */
/* In a timer callback, when vm_stop calls qemu_clock_enable
* you would get a deadlock. Bypass the problem.
*/
qemu_system_vmstop_request_prepare();
qapi_event_send_watchdog(WATCHDOG_EXPIRATION_ACTION_PAUSE, &error_abort);
vm_stop(RUN_STATE_WATCHDOG);
qemu_system_vmstop_request(RUN_STATE_WATCHDOG);
break;

case WDT_DEBUG:
Expand Down
2 changes: 1 addition & 1 deletion target-i386/cpu.c
Expand Up @@ -241,7 +241,7 @@ static const char *kvm_feature_name[] = {
NULL, NULL, NULL, NULL,
NULL, NULL, NULL, NULL,
NULL, NULL, NULL, NULL,
NULL, NULL, NULL, NULL,
"kvmclock-stable-bit", NULL, NULL, NULL,
NULL, NULL, NULL, NULL,
};

Expand Down
7 changes: 7 additions & 0 deletions target-mips/kvm.c
Expand Up @@ -61,6 +61,13 @@ int kvm_arch_init_vcpu(CPUState *cs)

void kvm_mips_reset_vcpu(MIPSCPU *cpu)
{
CPUMIPSState *env = &cpu->env;

if (env->CP0_Config1 & (1 << CP0C1_FP)) {
fprintf(stderr, "Warning: FPU not supported with KVM, disabling\n");
env->CP0_Config1 &= ~(1 << CP0C1_FP);
}

DPRINTF("%s\n", __func__);
}

Expand Down
8 changes: 7 additions & 1 deletion target-mips/translate.c
Expand Up @@ -28,6 +28,7 @@

#include "exec/helper-proto.h"
#include "exec/helper-gen.h"
#include "sysemu/kvm.h"

#define MIPS_DEBUG_DISAS 0
//#define MIPS_DEBUG_SIGN_EXTENSIONS
Expand Down Expand Up @@ -16076,7 +16077,12 @@ void cpu_state_reset(CPUMIPSState *env)
env->CP0_Random = env->tlb->nb_tlb - 1;
env->tlb->tlb_in_use = env->tlb->nb_tlb;
env->CP0_Wired = 0;
env->CP0_EBase = 0x80000000 | (cs->cpu_index & 0x3FF);
env->CP0_EBase = (cs->cpu_index & 0x3FF);
if (kvm_enabled()) {
env->CP0_EBase |= 0x40000000;
} else {
env->CP0_EBase |= 0x80000000;
}
env->CP0_Status = (1 << CP0St_BEV) | (1 << CP0St_ERL);
/* vectored interrupts not implemented, timer on int 7,
no performance counters. */
Expand Down
4 changes: 4 additions & 0 deletions tests/vhost-user-test.c
Expand Up @@ -22,6 +22,10 @@
#include <qemu/sockets.h>

/* GLIB version compatibility flags */
#if !GLIB_CHECK_VERSION(2, 26, 0)
#define G_TIME_SPAN_SECOND (G_GINT64_CONSTANT(1000000))
#endif

#if GLIB_CHECK_VERSION(2, 28, 0)
#define HAVE_MONOTONIC_TIME
#endif
Expand Down
30 changes: 16 additions & 14 deletions util/oslib-posix.c
Expand Up @@ -366,10 +366,9 @@ static size_t fd_getpagesize(int fd)

void os_mem_prealloc(int fd, char *area, size_t memory)
{
int ret, i;
int ret;
struct sigaction act, oldact;
sigset_t set, oldset;
size_t hpagesize = fd_getpagesize(fd);

memset(&act, 0, sizeof(act));
act.sa_handler = &sigbus_handler;
Expand All @@ -389,19 +388,22 @@ void os_mem_prealloc(int fd, char *area, size_t memory)
if (sigsetjmp(sigjump, 1)) {
fprintf(stderr, "os_mem_prealloc: failed to preallocate pages\n");
exit(1);
}
} else {
int i;
size_t hpagesize = fd_getpagesize(fd);

/* MAP_POPULATE silently ignores failures */
memory = (memory + hpagesize - 1) & -hpagesize;
for (i = 0; i < (memory/hpagesize); i++) {
memset(area + (hpagesize*i), 0, 1);
}
/* MAP_POPULATE silently ignores failures */
memory = (memory + hpagesize - 1) & -hpagesize;
for (i = 0; i < (memory / hpagesize); i++) {
memset(area + (hpagesize * i), 0, 1);
}

ret = sigaction(SIGBUS, &oldact, NULL);
if (ret) {
perror("os_mem_prealloc: failed to reinstall signal handler");
exit(1);
}
ret = sigaction(SIGBUS, &oldact, NULL);
if (ret) {
perror("os_mem_prealloc: failed to reinstall signal handler");
exit(1);
}

pthread_sigmask(SIG_SETMASK, &oldset, NULL);
pthread_sigmask(SIG_SETMASK, &oldset, NULL);
}
}

0 comments on commit 74aeb37

Please sign in to comment.