tcg: move qemu_tcg_configure to accel/tcg/tcg-all.c
Move everything related to mttcg_enabled in accel/tcg/tcg-all.c, which will make even more sense when "thread" becomes a QOM property. For now, initializing mttcg_enabled in the instance_init function prepares for the next patch, which will only invoke qemu_tcg_configure when the command line includes a -accel option. Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
parent
7f8b6126e7
commit
af0440ae85
@ -30,6 +30,11 @@
|
|||||||
#include "cpu.h"
|
#include "cpu.h"
|
||||||
#include "sysemu/cpus.h"
|
#include "sysemu/cpus.h"
|
||||||
#include "qemu/main-loop.h"
|
#include "qemu/main-loop.h"
|
||||||
|
#include "tcg/tcg.h"
|
||||||
|
#include "include/qapi/error.h"
|
||||||
|
#include "include/qemu/error-report.h"
|
||||||
|
#include "include/hw/boards.h"
|
||||||
|
#include "qemu/option.h"
|
||||||
|
|
||||||
unsigned long tcg_tb_size;
|
unsigned long tcg_tb_size;
|
||||||
|
|
||||||
@ -58,6 +63,53 @@ static void tcg_handle_interrupt(CPUState *cpu, int mask)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* We default to false if we know other options have been enabled
|
||||||
|
* which are currently incompatible with MTTCG. Otherwise when each
|
||||||
|
* guest (target) has been updated to support:
|
||||||
|
* - atomic instructions
|
||||||
|
* - memory ordering primitives (barriers)
|
||||||
|
* they can set the appropriate CONFIG flags in ${target}-softmmu.mak
|
||||||
|
*
|
||||||
|
* Once a guest architecture has been converted to the new primitives
|
||||||
|
* there are two remaining limitations to check.
|
||||||
|
*
|
||||||
|
* - The guest can't be oversized (e.g. 64 bit guest on 32 bit host)
|
||||||
|
* - The host must have a stronger memory order than the guest
|
||||||
|
*
|
||||||
|
* It may be possible in future to support strong guests on weak hosts
|
||||||
|
* but that will require tagging all load/stores in a guest with their
|
||||||
|
* implicit memory order requirements which would likely slow things
|
||||||
|
* down a lot.
|
||||||
|
*/
|
||||||
|
|
||||||
|
static bool check_tcg_memory_orders_compatible(void)
|
||||||
|
{
|
||||||
|
#if defined(TCG_GUEST_DEFAULT_MO) && defined(TCG_TARGET_DEFAULT_MO)
|
||||||
|
return (TCG_GUEST_DEFAULT_MO & ~TCG_TARGET_DEFAULT_MO) == 0;
|
||||||
|
#else
|
||||||
|
return false;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool default_mttcg_enabled(void)
|
||||||
|
{
|
||||||
|
if (use_icount || TCG_OVERSIZED_GUEST) {
|
||||||
|
return false;
|
||||||
|
} else {
|
||||||
|
#ifdef TARGET_SUPPORTS_MTTCG
|
||||||
|
return check_tcg_memory_orders_compatible();
|
||||||
|
#else
|
||||||
|
return false;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void tcg_accel_instance_init(Object *obj)
|
||||||
|
{
|
||||||
|
mttcg_enabled = default_mttcg_enabled();
|
||||||
|
}
|
||||||
|
|
||||||
static int tcg_init(MachineState *ms)
|
static int tcg_init(MachineState *ms)
|
||||||
{
|
{
|
||||||
tcg_exec_init(tcg_tb_size * 1024 * 1024);
|
tcg_exec_init(tcg_tb_size * 1024 * 1024);
|
||||||
@ -65,6 +117,36 @@ static int tcg_init(MachineState *ms)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void qemu_tcg_configure(QemuOpts *opts, Error **errp)
|
||||||
|
{
|
||||||
|
const char *t = qemu_opt_get(opts, "thread");
|
||||||
|
if (!t) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (strcmp(t, "multi") == 0) {
|
||||||
|
if (TCG_OVERSIZED_GUEST) {
|
||||||
|
error_setg(errp, "No MTTCG when guest word size > hosts");
|
||||||
|
} else if (use_icount) {
|
||||||
|
error_setg(errp, "No MTTCG when icount is enabled");
|
||||||
|
} else {
|
||||||
|
#ifndef TARGET_SUPPORTS_MTTCG
|
||||||
|
warn_report("Guest not yet converted to MTTCG - "
|
||||||
|
"you may get unexpected results");
|
||||||
|
#endif
|
||||||
|
if (!check_tcg_memory_orders_compatible()) {
|
||||||
|
warn_report("Guest expects a stronger memory ordering "
|
||||||
|
"than the host provides");
|
||||||
|
error_printf("This may cause strange/hard to debug errors\n");
|
||||||
|
}
|
||||||
|
mttcg_enabled = true;
|
||||||
|
}
|
||||||
|
} else if (strcmp(t, "single") == 0) {
|
||||||
|
mttcg_enabled = false;
|
||||||
|
} else {
|
||||||
|
error_setg(errp, "Invalid 'thread' setting %s", t);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static void tcg_accel_class_init(ObjectClass *oc, void *data)
|
static void tcg_accel_class_init(ObjectClass *oc, void *data)
|
||||||
{
|
{
|
||||||
AccelClass *ac = ACCEL_CLASS(oc);
|
AccelClass *ac = ACCEL_CLASS(oc);
|
||||||
@ -78,6 +160,7 @@ static void tcg_accel_class_init(ObjectClass *oc, void *data)
|
|||||||
static const TypeInfo tcg_accel_type = {
|
static const TypeInfo tcg_accel_type = {
|
||||||
.name = TYPE_TCG_ACCEL,
|
.name = TYPE_TCG_ACCEL,
|
||||||
.parent = TYPE_ACCEL,
|
.parent = TYPE_ACCEL,
|
||||||
|
.instance_init = tcg_accel_instance_init,
|
||||||
.class_init = tcg_accel_class_init,
|
.class_init = tcg_accel_class_init,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
72
cpus.c
72
cpus.c
@ -166,78 +166,6 @@ typedef struct TimersState {
|
|||||||
static TimersState timers_state;
|
static TimersState timers_state;
|
||||||
bool mttcg_enabled;
|
bool mttcg_enabled;
|
||||||
|
|
||||||
/*
|
|
||||||
* We default to false if we know other options have been enabled
|
|
||||||
* which are currently incompatible with MTTCG. Otherwise when each
|
|
||||||
* guest (target) has been updated to support:
|
|
||||||
* - atomic instructions
|
|
||||||
* - memory ordering primitives (barriers)
|
|
||||||
* they can set the appropriate CONFIG flags in ${target}-softmmu.mak
|
|
||||||
*
|
|
||||||
* Once a guest architecture has been converted to the new primitives
|
|
||||||
* there are two remaining limitations to check.
|
|
||||||
*
|
|
||||||
* - The guest can't be oversized (e.g. 64 bit guest on 32 bit host)
|
|
||||||
* - The host must have a stronger memory order than the guest
|
|
||||||
*
|
|
||||||
* It may be possible in future to support strong guests on weak hosts
|
|
||||||
* but that will require tagging all load/stores in a guest with their
|
|
||||||
* implicit memory order requirements which would likely slow things
|
|
||||||
* down a lot.
|
|
||||||
*/
|
|
||||||
|
|
||||||
static bool check_tcg_memory_orders_compatible(void)
|
|
||||||
{
|
|
||||||
#if defined(TCG_GUEST_DEFAULT_MO) && defined(TCG_TARGET_DEFAULT_MO)
|
|
||||||
return (TCG_GUEST_DEFAULT_MO & ~TCG_TARGET_DEFAULT_MO) == 0;
|
|
||||||
#else
|
|
||||||
return false;
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
static bool default_mttcg_enabled(void)
|
|
||||||
{
|
|
||||||
if (use_icount || TCG_OVERSIZED_GUEST) {
|
|
||||||
return false;
|
|
||||||
} else {
|
|
||||||
#ifdef TARGET_SUPPORTS_MTTCG
|
|
||||||
return check_tcg_memory_orders_compatible();
|
|
||||||
#else
|
|
||||||
return false;
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void qemu_tcg_configure(QemuOpts *opts, Error **errp)
|
|
||||||
{
|
|
||||||
const char *t = qemu_opt_get(opts, "thread");
|
|
||||||
if (t) {
|
|
||||||
if (strcmp(t, "multi") == 0) {
|
|
||||||
if (TCG_OVERSIZED_GUEST) {
|
|
||||||
error_setg(errp, "No MTTCG when guest word size > hosts");
|
|
||||||
} else if (use_icount) {
|
|
||||||
error_setg(errp, "No MTTCG when icount is enabled");
|
|
||||||
} else {
|
|
||||||
#ifndef TARGET_SUPPORTS_MTTCG
|
|
||||||
warn_report("Guest not yet converted to MTTCG - "
|
|
||||||
"you may get unexpected results");
|
|
||||||
#endif
|
|
||||||
if (!check_tcg_memory_orders_compatible()) {
|
|
||||||
warn_report("Guest expects a stronger memory ordering "
|
|
||||||
"than the host provides");
|
|
||||||
error_printf("This may cause strange/hard to debug errors\n");
|
|
||||||
}
|
|
||||||
mttcg_enabled = true;
|
|
||||||
}
|
|
||||||
} else if (strcmp(t, "single") == 0) {
|
|
||||||
mttcg_enabled = false;
|
|
||||||
} else {
|
|
||||||
error_setg(errp, "Invalid 'thread' setting %s", t);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
mttcg_enabled = default_mttcg_enabled();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* The current number of executed instructions is based on what we
|
/* The current number of executed instructions is based on what we
|
||||||
* originally budgeted minus the current state of the decrementing
|
* originally budgeted minus the current state of the decrementing
|
||||||
|
Loading…
Reference in New Issue
Block a user