x86 and machine queue, 2017-10-09

Includes x86, QOM, CPU, and option/config parsing patches.
 
 Highlights:
 * Deprecation of -nodefconfig option;
 * MachineClass::valid_cpu_types field.
 -----BEGIN PGP SIGNATURE-----
 
 iQIcBAABCAAGBQJZ3DEFAAoJECgHk2+YTcWmpt8P/i1kLznQXcan4XR5PBmxYbke
 klAzocUhm5ZP4sLJCTRXgvKgxvtLKigGO2J5X7NBdCYyyltDL1H2/UQcLtGgmvZH
 0Kz8I+euGUCbjhWiwSsNlAj1YiNxCuiAlQp0ixRrA1wmATAx0sWZ9mAtSa73lQSz
 Sz1y1yskHBP4Z7TbIYnmdpk/z+ZyeeSG9jGA5+az9WBUKjunb7RIOr61rrNCrIzq
 fL69n9+RcG5lqGg4DcFSlsOIOOjUuC4n63rEXM8lFhjSRR2PFKiNulNlSFVIpV4O
 lPJCArM2bq+wOmDr4Llteq42W3zhESAR4oeIR2wBvr8CBxpGlX3Ubkxvi5J/+Z6m
 nImvTsRWO4FInBqrnueD80Tke0dPjIivUEs7NVmqQTKHHL6DZ1GlZiAepZxqYgWL
 S7SmPYD6Nfg6Quf+x1aPQ9RHbycDe1Y86gYCmS07RIczLGYEylAv4GgZ6Wnc8I6A
 xn3MvNGTxBOKikGJOVvO/jJ9BMq/LnOYLbOMHSNnUiJ40dB6d+AKsUN32yo5FLv8
 HEkJcjKXsT6sV6UuKIZW1VLa0vkJ3oB0Z2WXL/vTn+BK6w/54rnxfr9D9glfOCDZ
 mvExz74L+rJOvONt1RIK3wQTZzfTV70mT3/Hx2A5W0XSWADaeGE4v+kxnX0yqqFh
 1mFBBY64PrkTtLZeasqA
 =Tqiv
 -----END PGP SIGNATURE-----

Merge remote-tracking branch 'remotes/ehabkost/tags/x86-and-machine-pull-request' into staging

x86 and machine queue, 2017-10-09

Includes x86, QOM, CPU, and option/config parsing patches.

Highlights:
* Deprecation of -nodefconfig option;
* MachineClass::valid_cpu_types field.

# gpg: Signature made Tue 10 Oct 2017 03:31:33 BST
# gpg:                using RSA key 0x2807936F984DC5A6
# gpg: Good signature from "Eduardo Habkost <ehabkost@redhat.com>"
# Primary key fingerprint: 5A32 2FD5 ABC4 D3DB ACCF  D1AA 2807 936F 984D C5A6

* remotes/ehabkost/tags/x86-and-machine-pull-request:
  x86: Correct translation of some rdgsbase and wrgsbase encodings
  vl: exit if maxcpus is negative
  qom: update doc comment for type_register[_static]()
  config: qemu_config_parse() return number of config groups
  qemu-options: Deprecate -nodefconfig
  vl: Eliminate defconfig variable
  machine: Add a valid_cpu_types property
  qom/cpu: move cpu_model null check to cpu_class_by_name()

Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
Peter Maydell 2017-10-10 13:25:46 +01:00
commit 567d0a19c7
24 changed files with 65 additions and 90 deletions

View File

@ -244,7 +244,6 @@ static int read_config(BDRVBlkdebugState *s, const char *filename,
ret = qemu_config_parse(f, config_groups, filename); ret = qemu_config_parse(f, config_groups, filename);
if (ret < 0) { if (ret < 0) {
error_setg(errp, "Could not parse blkdebug config file"); error_setg(errp, "Could not parse blkdebug config file");
ret = -EINVAL;
goto fail; goto fail;
} }
} }

View File

@ -758,6 +758,38 @@ void machine_run_board_init(MachineState *machine)
if (nb_numa_nodes) { if (nb_numa_nodes) {
machine_numa_finish_init(machine); machine_numa_finish_init(machine);
} }
/* If the machine supports the valid_cpu_types check and the user
* specified a CPU with -cpu check here that the user CPU is supported.
*/
if (machine_class->valid_cpu_types && machine->cpu_type) {
ObjectClass *class = object_class_by_name(machine->cpu_type);
int i;
for (i = 0; machine_class->valid_cpu_types[i]; i++) {
if (object_class_dynamic_cast(class,
machine_class->valid_cpu_types[i])) {
/* The user specificed CPU is in the valid field, we are
* good to go.
*/
break;
}
}
if (!machine_class->valid_cpu_types[i]) {
/* The user specified CPU is not valid */
error_report("Invalid CPU type: %s", machine->cpu_type);
error_printf("The valid types are: %s",
machine_class->valid_cpu_types[0]);
for (i = 1; machine_class->valid_cpu_types[i]; i++) {
error_printf(", %s", machine_class->valid_cpu_types[i]);
}
error_printf("\n");
exit(1);
}
}
machine_class->init(machine); machine_class->init(machine);
} }

View File

@ -191,6 +191,7 @@ struct MachineClass {
bool has_hotpluggable_cpus; bool has_hotpluggable_cpus;
bool ignore_memory_transaction_failures; bool ignore_memory_transaction_failures;
int numa_mem_align_shift; int numa_mem_align_shift;
const char **valid_cpu_types;
void (*numa_auto_assign_ram)(MachineClass *mc, NodeInfo *nodes, void (*numa_auto_assign_ram)(MachineClass *mc, NodeInfo *nodes,
int nb_nodes, ram_addr_t size); int nb_nodes, ram_addr_t size);

View File

@ -773,7 +773,7 @@ const char *object_get_typename(const Object *obj);
* @info and all of the strings it points to should exist for the life time * @info and all of the strings it points to should exist for the life time
* that the type is registered. * that the type is registered.
* *
* Returns: 0 on failure, the new #Type on success. * Returns: the new #Type.
*/ */
Type type_register_static(const TypeInfo *info); Type type_register_static(const TypeInfo *info);
@ -784,7 +784,7 @@ Type type_register_static(const TypeInfo *info);
* Unlike type_register_static(), this call does not require @info or its * Unlike type_register_static(), this call does not require @info or its
* string members to continue to exist after the call returns. * string members to continue to exist after the call returns.
* *
* Returns: 0 on failure, the new #Type on success. * Returns: the new #Type.
*/ */
Type type_register(const TypeInfo *info); Type type_register(const TypeInfo *info);

View File

@ -113,7 +113,7 @@ extern int win2k_install_hack;
extern int alt_grab; extern int alt_grab;
extern int ctrl_grab; extern int ctrl_grab;
extern int smp_cpus; extern int smp_cpus;
extern int max_cpus; extern unsigned int max_cpus;
extern int cursor_hide; extern int cursor_hide;
extern int graphic_rotate; extern int graphic_rotate;
extern int no_quit; extern int no_quit;

View File

@ -2496,6 +2496,10 @@ would automatically enable USB support on the machine type.
If using the new syntax, USB support must be explicitly If using the new syntax, USB support must be explicitly
enabled via the ``-machine usb=on'' argument. enabled via the ``-machine usb=on'' argument.
@subsection -nodefconfig (since 2.11.0)
The ``-nodefconfig`` argument is a synonym for ``-no-user-config``.
@section qemu-img command line arguments @section qemu-img command line arguments
@subsection convert -s (since 2.0.0) @subsection convert -s (since 2.0.0)

View File

@ -4067,26 +4067,17 @@ Write device configuration to @var{file}. The @var{file} can be either filename
command line and device configuration into file or dash @code{-}) character to print the command line and device configuration into file or dash @code{-}) character to print the
output to stdout. This can be later used as input file for @code{-readconfig} option. output to stdout. This can be later used as input file for @code{-readconfig} option.
ETEXI ETEXI
DEF("nodefconfig", 0, QEMU_OPTION_nodefconfig, HXCOMM Deprecated, same as -no-user-config
"-nodefconfig\n" DEF("nodefconfig", 0, QEMU_OPTION_nodefconfig, "", QEMU_ARCH_ALL)
" do not load default config files at startup\n",
QEMU_ARCH_ALL)
STEXI
@item -nodefconfig
@findex -nodefconfig
Normally QEMU loads configuration files from @var{sysconfdir} and @var{datadir} at startup.
The @code{-nodefconfig} option will prevent QEMU from loading any of those config files.
ETEXI
DEF("no-user-config", 0, QEMU_OPTION_nouserconfig, DEF("no-user-config", 0, QEMU_OPTION_nouserconfig,
"-no-user-config\n" "-no-user-config\n"
" do not load user-provided config files at startup\n", " do not load default user-provided config files at startup\n",
QEMU_ARCH_ALL) QEMU_ARCH_ALL)
STEXI STEXI
@item -no-user-config @item -no-user-config
@findex -no-user-config @findex -no-user-config
The @code{-no-user-config} option makes QEMU not load any of the user-provided The @code{-no-user-config} option makes QEMU not load any of the user-provided
config files on @var{sysconfdir}, but won't make it skip the QEMU-provided config config files on @var{sysconfdir}.
files from @var{datadir}.
ETEXI ETEXI
DEF("trace", HAS_ARG, QEMU_OPTION_trace, DEF("trace", HAS_ARG, QEMU_OPTION_trace,
"-trace [[enable=]<pattern>][,events=<file>][,file=<file>]\n" "-trace [[enable=]<pattern>][,events=<file>][,file=<file>]\n"

View File

@ -316,7 +316,12 @@ static bool cpu_common_has_work(CPUState *cs)
ObjectClass *cpu_class_by_name(const char *typename, const char *cpu_model) ObjectClass *cpu_class_by_name(const char *typename, const char *cpu_model)
{ {
CPUClass *cc = CPU_CLASS(object_class_by_name(typename)); CPUClass *cc;
if (!cpu_model) {
return NULL;
}
cc = CPU_CLASS(object_class_by_name(typename));
return cc->class_by_name(cpu_model); return cc->class_by_name(cpu_model);
} }

View File

@ -127,14 +127,10 @@ static const AlphaCPUAlias alpha_cpu_aliases[] = {
static ObjectClass *alpha_cpu_class_by_name(const char *cpu_model) static ObjectClass *alpha_cpu_class_by_name(const char *cpu_model)
{ {
ObjectClass *oc = NULL; ObjectClass *oc;
char *typename; char *typename;
int i; int i;
if (cpu_model == NULL) {
return NULL;
}
oc = object_class_by_name(cpu_model); oc = object_class_by_name(cpu_model);
if (oc != NULL && object_class_dynamic_cast(oc, TYPE_ALPHA_CPU) != NULL && if (oc != NULL && object_class_dynamic_cast(oc, TYPE_ALPHA_CPU) != NULL &&
!object_class_is_abstract(oc)) { !object_class_is_abstract(oc)) {

View File

@ -939,10 +939,6 @@ static ObjectClass *arm_cpu_class_by_name(const char *cpu_model)
char *typename; char *typename;
char **cpuname; char **cpuname;
if (!cpu_model) {
return NULL;
}
cpuname = g_strsplit(cpu_model, ",", 1); cpuname = g_strsplit(cpu_model, ",", 1);
typename = g_strdup_printf(ARM_CPU_TYPE_NAME("%s"), cpuname[0]); typename = g_strdup_printf(ARM_CPU_TYPE_NAME("%s"), cpuname[0]);
oc = object_class_by_name(typename); oc = object_class_by_name(typename);

View File

@ -69,10 +69,6 @@ static ObjectClass *cris_cpu_class_by_name(const char *cpu_model)
ObjectClass *oc; ObjectClass *oc;
char *typename; char *typename;
if (cpu_model == NULL) {
return NULL;
}
#if defined(CONFIG_USER_ONLY) #if defined(CONFIG_USER_ONLY)
if (strcasecmp(cpu_model, "any") == 0) { if (strcasecmp(cpu_model, "any") == 0) {
return object_class_by_name("crisv32-" TYPE_CRIS_CPU); return object_class_by_name("crisv32-" TYPE_CRIS_CPU);

View File

@ -8155,9 +8155,9 @@ static target_ulong disas_insn(DisasContext *s, CPUState *cpu)
break; break;
case 0xc0 ... 0xc7: /* rdfsbase (f3 0f ae /0) */ case 0xc0 ... 0xc7: /* rdfsbase (f3 0f ae /0) */
case 0xc8 ... 0xc8: /* rdgsbase (f3 0f ae /1) */ case 0xc8 ... 0xcf: /* rdgsbase (f3 0f ae /1) */
case 0xd0 ... 0xd7: /* wrfsbase (f3 0f ae /2) */ case 0xd0 ... 0xd7: /* wrfsbase (f3 0f ae /2) */
case 0xd8 ... 0xd8: /* wrgsbase (f3 0f ae /3) */ case 0xd8 ... 0xdf: /* wrgsbase (f3 0f ae /3) */
if (CODE64(s) if (CODE64(s)
&& (prefixes & PREFIX_REPZ) && (prefixes & PREFIX_REPZ)
&& !(prefixes & PREFIX_LOCK) && !(prefixes & PREFIX_LOCK)

View File

@ -246,10 +246,6 @@ static ObjectClass *lm32_cpu_class_by_name(const char *cpu_model)
ObjectClass *oc; ObjectClass *oc;
char *typename; char *typename;
if (cpu_model == NULL) {
return NULL;
}
typename = g_strdup_printf("%s-" TYPE_LM32_CPU, cpu_model); typename = g_strdup_printf("%s-" TYPE_LM32_CPU, cpu_model);
oc = object_class_by_name(typename); oc = object_class_by_name(typename);
g_free(typename); g_free(typename);

View File

@ -87,10 +87,6 @@ static ObjectClass *m68k_cpu_class_by_name(const char *cpu_model)
ObjectClass *oc; ObjectClass *oc;
char *typename; char *typename;
if (cpu_model == NULL) {
return NULL;
}
typename = g_strdup_printf("%s-" TYPE_M68K_CPU, cpu_model); typename = g_strdup_printf("%s-" TYPE_M68K_CPU, cpu_model);
oc = object_class_by_name(typename); oc = object_class_by_name(typename);
g_free(typename); g_free(typename);

View File

@ -166,10 +166,6 @@ static ObjectClass *mips_cpu_class_by_name(const char *cpu_model)
ObjectClass *oc; ObjectClass *oc;
char *typename; char *typename;
if (cpu_model == NULL) {
return NULL;
}
typename = mips_cpu_type_name(cpu_model); typename = mips_cpu_type_name(cpu_model);
oc = object_class_by_name(typename); oc = object_class_by_name(typename);
g_free(typename); g_free(typename);

View File

@ -89,13 +89,7 @@ static void moxie_cpu_initfn(Object *obj)
static ObjectClass *moxie_cpu_class_by_name(const char *cpu_model) static ObjectClass *moxie_cpu_class_by_name(const char *cpu_model)
{ {
ObjectClass *oc; ObjectClass *oc = object_class_by_name(cpu_model);
if (cpu_model == NULL) {
return NULL;
}
oc = object_class_by_name(cpu_model);
if (oc != NULL && (!object_class_dynamic_cast(oc, TYPE_MOXIE_CPU) || if (oc != NULL && (!object_class_dynamic_cast(oc, TYPE_MOXIE_CPU) ||
object_class_is_abstract(oc))) { object_class_is_abstract(oc))) {
return NULL; return NULL;

View File

@ -108,10 +108,6 @@ static ObjectClass *openrisc_cpu_class_by_name(const char *cpu_model)
ObjectClass *oc; ObjectClass *oc;
char *typename; char *typename;
if (cpu_model == NULL) {
return NULL;
}
typename = g_strdup_printf("%s-" TYPE_OPENRISC_CPU, cpu_model); typename = g_strdup_printf("%s-" TYPE_OPENRISC_CPU, cpu_model);
oc = object_class_by_name(typename); oc = object_class_by_name(typename);
g_free(typename); g_free(typename);

View File

@ -133,9 +133,6 @@ static ObjectClass *superh_cpu_class_by_name(const char *cpu_model)
ObjectClass *oc; ObjectClass *oc;
GSList *list, *item; GSList *list, *item;
if (cpu_model == NULL) {
return NULL;
}
if (strcasecmp(cpu_model, "any") == 0) { if (strcasecmp(cpu_model, "any") == 0) {
return object_class_by_name(TYPE_SH7750R_CPU); return object_class_by_name(TYPE_SH7750R_CPU);
} }

View File

@ -730,10 +730,6 @@ static ObjectClass *sparc_cpu_class_by_name(const char *cpu_model)
ObjectClass *oc; ObjectClass *oc;
char *typename; char *typename;
if (cpu_model == NULL) {
return NULL;
}
typename = sparc_cpu_type_name(cpu_model); typename = sparc_cpu_type_name(cpu_model);
oc = object_class_by_name(typename); oc = object_class_by_name(typename);
g_free(typename); g_free(typename);

View File

@ -120,10 +120,6 @@ static ObjectClass *tricore_cpu_class_by_name(const char *cpu_model)
ObjectClass *oc; ObjectClass *oc;
char *typename; char *typename;
if (!cpu_model) {
return NULL;
}
typename = g_strdup_printf("%s-" TYPE_TRICORE_CPU, cpu_model); typename = g_strdup_printf("%s-" TYPE_TRICORE_CPU, cpu_model);
oc = object_class_by_name(typename); oc = object_class_by_name(typename);
g_free(typename); g_free(typename);

View File

@ -44,10 +44,6 @@ static ObjectClass *uc32_cpu_class_by_name(const char *cpu_model)
ObjectClass *oc; ObjectClass *oc;
char *typename; char *typename;
if (cpu_model == NULL) {
return NULL;
}
typename = g_strdup_printf("%s-" TYPE_UNICORE32_CPU, cpu_model); typename = g_strdup_printf("%s-" TYPE_UNICORE32_CPU, cpu_model);
oc = object_class_by_name(typename); oc = object_class_by_name(typename);
g_free(typename); g_free(typename);

View File

@ -83,10 +83,6 @@ static ObjectClass *xtensa_cpu_class_by_name(const char *cpu_model)
ObjectClass *oc; ObjectClass *oc;
char *typename; char *typename;
if (cpu_model == NULL) {
return NULL;
}
typename = g_strdup_printf("%s-" TYPE_XTENSA_CPU, cpu_model); typename = g_strdup_printf("%s-" TYPE_XTENSA_CPU, cpu_model);
oc = object_class_by_name(typename); oc = object_class_by_name(typename);
g_free(typename); g_free(typename);

View File

@ -385,6 +385,7 @@ void qemu_config_write(FILE *fp)
} }
} }
/* Returns number of config groups on success, -errno on error */
int qemu_config_parse(FILE *fp, QemuOptsList **lists, const char *fname) int qemu_config_parse(FILE *fp, QemuOptsList **lists, const char *fname)
{ {
char line[1024], group[64], id[64], arg[64], value[1024]; char line[1024], group[64], id[64], arg[64], value[1024];
@ -392,7 +393,8 @@ int qemu_config_parse(FILE *fp, QemuOptsList **lists, const char *fname)
QemuOptsList *list = NULL; QemuOptsList *list = NULL;
Error *local_err = NULL; Error *local_err = NULL;
QemuOpts *opts = NULL; QemuOpts *opts = NULL;
int res = -1, lno = 0; int res = -EINVAL, lno = 0;
int count = 0;
loc_push_none(&loc); loc_push_none(&loc);
while (fgets(line, sizeof(line), fp) != NULL) { while (fgets(line, sizeof(line), fp) != NULL) {
@ -413,6 +415,7 @@ int qemu_config_parse(FILE *fp, QemuOptsList **lists, const char *fname)
goto out; goto out;
} }
opts = qemu_opts_create(list, id, 1, NULL); opts = qemu_opts_create(list, id, 1, NULL);
count++;
continue; continue;
} }
if (sscanf(line, "[%63[^]]]", group) == 1) { if (sscanf(line, "[%63[^]]]", group) == 1) {
@ -423,6 +426,7 @@ int qemu_config_parse(FILE *fp, QemuOptsList **lists, const char *fname)
goto out; goto out;
} }
opts = qemu_opts_create(list, NULL, 0, &error_abort); opts = qemu_opts_create(list, NULL, 0, &error_abort);
count++;
continue; continue;
} }
value[0] = '\0'; value[0] = '\0';
@ -447,7 +451,7 @@ int qemu_config_parse(FILE *fp, QemuOptsList **lists, const char *fname)
error_report("error reading file"); error_report("error reading file");
goto out; goto out;
} }
res = 0; res = count;
out: out:
loc_pop(&loc); loc_pop(&loc);
return res; return res;
@ -464,12 +468,7 @@ int qemu_read_config_file(const char *filename)
ret = qemu_config_parse(f, vm_config_groups, filename); ret = qemu_config_parse(f, vm_config_groups, filename);
fclose(f); fclose(f);
return ret;
if (ret == 0) {
return 0;
} else {
return -EINVAL;
}
} }
static void config_parse_qdict_section(QDict *options, QemuOptsList *opts, static void config_parse_qdict_section(QDict *options, QemuOptsList *opts,

11
vl.c
View File

@ -161,7 +161,7 @@ Chardev *sclp_hds[MAX_SCLP_CONSOLES];
int win2k_install_hack = 0; int win2k_install_hack = 0;
int singlestep = 0; int singlestep = 0;
int smp_cpus = 1; int smp_cpus = 1;
int max_cpus = 1; unsigned int max_cpus = 1;
int smp_cores = 1; int smp_cores = 1;
int smp_threads = 1; int smp_threads = 1;
int acpi_enabled = 1; int acpi_enabled = 1;
@ -3111,7 +3111,6 @@ int main(int argc, char **argv, char **envp)
const char *qtest_log = NULL; const char *qtest_log = NULL;
const char *pid_file = NULL; const char *pid_file = NULL;
const char *incoming = NULL; const char *incoming = NULL;
bool defconfig = true;
bool userconfig = true; bool userconfig = true;
bool nographic = false; bool nographic = false;
DisplayType display_type = DT_DEFAULT; DisplayType display_type = DT_DEFAULT;
@ -3213,8 +3212,6 @@ int main(int argc, char **argv, char **envp)
popt = lookup_opt(argc, argv, &optarg, &optind); popt = lookup_opt(argc, argv, &optarg, &optind);
switch (popt->index) { switch (popt->index) {
case QEMU_OPTION_nodefconfig: case QEMU_OPTION_nodefconfig:
defconfig = false;
break;
case QEMU_OPTION_nouserconfig: case QEMU_OPTION_nouserconfig:
userconfig = false; userconfig = false;
break; break;
@ -3222,7 +3219,7 @@ int main(int argc, char **argv, char **envp)
} }
} }
if (defconfig && userconfig) { if (userconfig) {
if (qemu_read_default_config_file() < 0) { if (qemu_read_default_config_file() < 0) {
exit(1); exit(1);
} }
@ -4334,8 +4331,8 @@ int main(int argc, char **argv, char **envp)
machine_class->max_cpus = machine_class->max_cpus ?: 1; /* Default to UP */ machine_class->max_cpus = machine_class->max_cpus ?: 1; /* Default to UP */
if (max_cpus > machine_class->max_cpus) { if (max_cpus > machine_class->max_cpus) {
error_report("Number of SMP CPUs requested (%d) exceeds max CPUs " error_report("Invalid SMP CPUs %d. The max CPUs "
"supported by machine '%s' (%d)", max_cpus, "supported by machine '%s' is %d", max_cpus,
machine_class->name, machine_class->max_cpus); machine_class->name, machine_class->max_cpus);
exit(1); exit(1);
} }