cpus: Initialize pseudo-random seeds for all guest cpus
When the -seed option is given, call qemu_guest_random_seed_main, putting the subsystem into deterministic mode. Pass derived seeds to each cpu created; which is a no-op unless the subsystem is in deterministic mode. Reviewed-by: Laurent Vivier <lvivier@redhat.com> Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com> Reviewed-by: Daniel P. Berrangé <berrange@redhat.com> Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
This commit is contained in:
parent
8d8404f156
commit
9c09a2518e
9
cpus.c
9
cpus.c
@ -50,6 +50,7 @@
|
|||||||
#include "qemu/option.h"
|
#include "qemu/option.h"
|
||||||
#include "qemu/bitmap.h"
|
#include "qemu/bitmap.h"
|
||||||
#include "qemu/seqlock.h"
|
#include "qemu/seqlock.h"
|
||||||
|
#include "qemu/guest-random.h"
|
||||||
#include "tcg.h"
|
#include "tcg.h"
|
||||||
#include "hw/nmi.h"
|
#include "hw/nmi.h"
|
||||||
#include "sysemu/replay.h"
|
#include "sysemu/replay.h"
|
||||||
@ -1276,6 +1277,7 @@ static void *qemu_kvm_cpu_thread_fn(void *arg)
|
|||||||
/* signal CPU creation */
|
/* signal CPU creation */
|
||||||
cpu->created = true;
|
cpu->created = true;
|
||||||
qemu_cond_signal(&qemu_cpu_cond);
|
qemu_cond_signal(&qemu_cpu_cond);
|
||||||
|
qemu_guest_random_seed_thread_part2(cpu->random_seed);
|
||||||
|
|
||||||
do {
|
do {
|
||||||
if (cpu_can_run(cpu)) {
|
if (cpu_can_run(cpu)) {
|
||||||
@ -1319,6 +1321,7 @@ static void *qemu_dummy_cpu_thread_fn(void *arg)
|
|||||||
/* signal CPU creation */
|
/* signal CPU creation */
|
||||||
cpu->created = true;
|
cpu->created = true;
|
||||||
qemu_cond_signal(&qemu_cpu_cond);
|
qemu_cond_signal(&qemu_cpu_cond);
|
||||||
|
qemu_guest_random_seed_thread_part2(cpu->random_seed);
|
||||||
|
|
||||||
do {
|
do {
|
||||||
qemu_mutex_unlock_iothread();
|
qemu_mutex_unlock_iothread();
|
||||||
@ -1478,6 +1481,7 @@ static void *qemu_tcg_rr_cpu_thread_fn(void *arg)
|
|||||||
cpu->created = true;
|
cpu->created = true;
|
||||||
cpu->can_do_io = 1;
|
cpu->can_do_io = 1;
|
||||||
qemu_cond_signal(&qemu_cpu_cond);
|
qemu_cond_signal(&qemu_cpu_cond);
|
||||||
|
qemu_guest_random_seed_thread_part2(cpu->random_seed);
|
||||||
|
|
||||||
/* wait for initial kick-off after machine start */
|
/* wait for initial kick-off after machine start */
|
||||||
while (first_cpu->stopped) {
|
while (first_cpu->stopped) {
|
||||||
@ -1592,6 +1596,7 @@ static void *qemu_hax_cpu_thread_fn(void *arg)
|
|||||||
|
|
||||||
hax_init_vcpu(cpu);
|
hax_init_vcpu(cpu);
|
||||||
qemu_cond_signal(&qemu_cpu_cond);
|
qemu_cond_signal(&qemu_cpu_cond);
|
||||||
|
qemu_guest_random_seed_thread_part2(cpu->random_seed);
|
||||||
|
|
||||||
do {
|
do {
|
||||||
if (cpu_can_run(cpu)) {
|
if (cpu_can_run(cpu)) {
|
||||||
@ -1631,6 +1636,7 @@ static void *qemu_hvf_cpu_thread_fn(void *arg)
|
|||||||
/* signal CPU creation */
|
/* signal CPU creation */
|
||||||
cpu->created = true;
|
cpu->created = true;
|
||||||
qemu_cond_signal(&qemu_cpu_cond);
|
qemu_cond_signal(&qemu_cpu_cond);
|
||||||
|
qemu_guest_random_seed_thread_part2(cpu->random_seed);
|
||||||
|
|
||||||
do {
|
do {
|
||||||
if (cpu_can_run(cpu)) {
|
if (cpu_can_run(cpu)) {
|
||||||
@ -1671,6 +1677,7 @@ static void *qemu_whpx_cpu_thread_fn(void *arg)
|
|||||||
/* signal CPU creation */
|
/* signal CPU creation */
|
||||||
cpu->created = true;
|
cpu->created = true;
|
||||||
qemu_cond_signal(&qemu_cpu_cond);
|
qemu_cond_signal(&qemu_cpu_cond);
|
||||||
|
qemu_guest_random_seed_thread_part2(cpu->random_seed);
|
||||||
|
|
||||||
do {
|
do {
|
||||||
if (cpu_can_run(cpu)) {
|
if (cpu_can_run(cpu)) {
|
||||||
@ -1724,6 +1731,7 @@ static void *qemu_tcg_cpu_thread_fn(void *arg)
|
|||||||
cpu->can_do_io = 1;
|
cpu->can_do_io = 1;
|
||||||
current_cpu = cpu;
|
current_cpu = cpu;
|
||||||
qemu_cond_signal(&qemu_cpu_cond);
|
qemu_cond_signal(&qemu_cpu_cond);
|
||||||
|
qemu_guest_random_seed_thread_part2(cpu->random_seed);
|
||||||
|
|
||||||
/* process any pending work */
|
/* process any pending work */
|
||||||
cpu->exit_request = 1;
|
cpu->exit_request = 1;
|
||||||
@ -2071,6 +2079,7 @@ void qemu_init_vcpu(CPUState *cpu)
|
|||||||
cpu->nr_cores = smp_cores;
|
cpu->nr_cores = smp_cores;
|
||||||
cpu->nr_threads = smp_threads;
|
cpu->nr_threads = smp_threads;
|
||||||
cpu->stopped = true;
|
cpu->stopped = true;
|
||||||
|
cpu->random_seed = qemu_guest_random_seed_thread_part1();
|
||||||
|
|
||||||
if (!cpu->as) {
|
if (!cpu->as) {
|
||||||
/* If the target cpu hasn't set up any address spaces itself,
|
/* If the target cpu hasn't set up any address spaces itself,
|
||||||
|
@ -375,6 +375,7 @@ struct CPUState {
|
|||||||
int singlestep_enabled;
|
int singlestep_enabled;
|
||||||
int64_t icount_budget;
|
int64_t icount_budget;
|
||||||
int64_t icount_extra;
|
int64_t icount_extra;
|
||||||
|
uint64_t random_seed;
|
||||||
sigjmp_buf jmp_env;
|
sigjmp_buf jmp_env;
|
||||||
|
|
||||||
QemuMutex work_mutex;
|
QemuMutex work_mutex;
|
||||||
|
@ -3641,6 +3641,16 @@ the 0x200 sized block starting at 0xffffffc000080000 and another 0x1000 sized
|
|||||||
block starting at 0xffffffc00005f000.
|
block starting at 0xffffffc00005f000.
|
||||||
ETEXI
|
ETEXI
|
||||||
|
|
||||||
|
DEF("seed", HAS_ARG, QEMU_OPTION_seed, \
|
||||||
|
"-seed number seed the pseudo-random number generator\n",
|
||||||
|
QEMU_ARCH_ALL)
|
||||||
|
STEXI
|
||||||
|
@item -seed @var{number}
|
||||||
|
@findex -seed
|
||||||
|
Force the guest to use a deterministic pseudo-random number generator, seeded
|
||||||
|
with @var{number}. This does not affect crypto routines within the host.
|
||||||
|
ETEXI
|
||||||
|
|
||||||
DEF("L", HAS_ARG, QEMU_OPTION_L, \
|
DEF("L", HAS_ARG, QEMU_OPTION_L, \
|
||||||
"-L path set the directory for the BIOS, VGA BIOS and keymaps\n",
|
"-L path set the directory for the BIOS, VGA BIOS and keymaps\n",
|
||||||
QEMU_ARCH_ALL)
|
QEMU_ARCH_ALL)
|
||||||
|
4
vl.c
4
vl.c
@ -128,6 +128,7 @@ int main(int argc, char **argv)
|
|||||||
#include "qapi/qapi-commands-ui.h"
|
#include "qapi/qapi-commands-ui.h"
|
||||||
#include "qapi/qmp/qerror.h"
|
#include "qapi/qmp/qerror.h"
|
||||||
#include "sysemu/iothread.h"
|
#include "sysemu/iothread.h"
|
||||||
|
#include "qemu/guest-random.h"
|
||||||
|
|
||||||
#define MAX_VIRTIO_CONSOLES 1
|
#define MAX_VIRTIO_CONSOLES 1
|
||||||
|
|
||||||
@ -3349,6 +3350,9 @@ int main(int argc, char **argv, char **envp)
|
|||||||
case QEMU_OPTION_DFILTER:
|
case QEMU_OPTION_DFILTER:
|
||||||
qemu_set_dfilter_ranges(optarg, &error_fatal);
|
qemu_set_dfilter_ranges(optarg, &error_fatal);
|
||||||
break;
|
break;
|
||||||
|
case QEMU_OPTION_seed:
|
||||||
|
qemu_guest_random_seed_main(optarg, &error_fatal);
|
||||||
|
break;
|
||||||
case QEMU_OPTION_s:
|
case QEMU_OPTION_s:
|
||||||
add_device_config(DEV_GDB, "tcp::" DEFAULT_GDBSTUB_PORT);
|
add_device_config(DEV_GDB, "tcp::" DEFAULT_GDBSTUB_PORT);
|
||||||
break;
|
break;
|
||||||
|
Loading…
Reference in New Issue
Block a user