mirror of
https://github.com/izzy2lost/xemu.git
synced 2026-07-06 00:20:22 -07:00
Merge remote-tracking branch 'remotes/ehabkost/tags/machine-next-pull-request' into staging
Machine and x86 queue, 2018-03-19 * cpu_model/cpu_type cleanups * x86: Fix on Intel Processor Trace CPUID checks # gpg: Signature made Mon 19 Mar 2018 20:07:14 GMT # gpg: using RSA key 2807936F984DC5A6 # 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/machine-next-pull-request: i386: Disable Intel PT if packets IP payloads have LIP values cpu: drop unnecessary NULL check and cpu_common_class_by_name() cpu: get rid of unused cpu_init() defines Use cpu_create(type) instead of cpu_init(cpu_model) cpu: add CPU_RESOLVING_TYPE macro tests: add machine 'none' with -cpu test nios2: 10m50_devboard: replace cpu_model with cpu_type Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
+3
-1
@@ -723,6 +723,7 @@ int main(int argc, char **argv)
|
||||
{
|
||||
const char *filename;
|
||||
const char *cpu_model;
|
||||
const char *cpu_type;
|
||||
const char *log_file = NULL;
|
||||
const char *log_mask = NULL;
|
||||
struct target_pt_regs regs1, *regs = ®s1;
|
||||
@@ -900,7 +901,8 @@ int main(int argc, char **argv)
|
||||
tcg_exec_init(0);
|
||||
/* NOTE: we need to init the CPU at this stage to get
|
||||
qemu_host_page_size */
|
||||
cpu = cpu_init(cpu_model);
|
||||
cpu_type = parse_cpu_model(cpu_model);
|
||||
cpu = cpu_create(cpu_type);
|
||||
env = cpu->env_ptr;
|
||||
#if defined(TARGET_SPARC) || defined(TARGET_PPC)
|
||||
cpu_reset(cpu);
|
||||
|
||||
@@ -817,6 +817,29 @@ void cpu_exec_realizefn(CPUState *cpu, Error **errp)
|
||||
#endif
|
||||
}
|
||||
|
||||
const char *parse_cpu_model(const char *cpu_model)
|
||||
{
|
||||
ObjectClass *oc;
|
||||
CPUClass *cc;
|
||||
gchar **model_pieces;
|
||||
const char *cpu_type;
|
||||
|
||||
model_pieces = g_strsplit(cpu_model, ",", 2);
|
||||
|
||||
oc = cpu_class_by_name(CPU_RESOLVING_TYPE, model_pieces[0]);
|
||||
if (oc == NULL) {
|
||||
error_report("unable to find CPU model '%s'", model_pieces[0]);
|
||||
g_strfreev(model_pieces);
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
|
||||
cpu_type = object_class_get_name(oc);
|
||||
cc = CPU_CLASS(oc);
|
||||
cc->parse_features(cpu_type, model_pieces[1], &error_fatal);
|
||||
g_strfreev(model_pieces);
|
||||
return cpu_type;
|
||||
}
|
||||
|
||||
#if defined(CONFIG_USER_ONLY)
|
||||
static void breakpoint_invalidate(CPUState *cpu, target_ulong pc)
|
||||
{
|
||||
|
||||
@@ -24,9 +24,9 @@ static void machine_none_init(MachineState *mch)
|
||||
{
|
||||
CPUState *cpu = NULL;
|
||||
|
||||
/* Initialize CPU (if a model has been specified) */
|
||||
if (mch->cpu_model) {
|
||||
cpu = cpu_init(mch->cpu_model);
|
||||
/* Initialize CPU (if user asked for it) */
|
||||
if (mch->cpu_type) {
|
||||
cpu = cpu_create(mch->cpu_type);
|
||||
if (!cpu) {
|
||||
error_report("Unable to initialize CPU");
|
||||
exit(1);
|
||||
|
||||
@@ -75,7 +75,7 @@ static void nios2_10m50_ghrd_init(MachineState *machine)
|
||||
phys_ram_alias);
|
||||
|
||||
/* Create CPU -- FIXME */
|
||||
cpu = NIOS2_CPU(cpu_generic_init(TYPE_NIOS2_CPU, "nios2"));
|
||||
cpu = NIOS2_CPU(cpu_create(TYPE_NIOS2_CPU));
|
||||
|
||||
/* Register: CPU interrupt controller (PIC) */
|
||||
cpu_irq = nios2_cpu_pic_init(cpu);
|
||||
|
||||
@@ -252,7 +252,6 @@ struct MachineState {
|
||||
char *kernel_filename;
|
||||
char *kernel_cmdline;
|
||||
char *initrd_filename;
|
||||
const char *cpu_model;
|
||||
const char *cpu_type;
|
||||
AccelState *accelerator;
|
||||
CPUArchIdList *possible_cpus;
|
||||
|
||||
+2
-14
@@ -662,8 +662,7 @@ ObjectClass *cpu_class_by_name(const char *typename, const char *cpu_model);
|
||||
CPUState *cpu_create(const char *typename);
|
||||
|
||||
/**
|
||||
* cpu_parse_cpu_model:
|
||||
* @typename: The CPU base type or CPU type.
|
||||
* parse_cpu_model:
|
||||
* @cpu_model: The model string including optional parameters.
|
||||
*
|
||||
* processes optional parameters and registers them as global properties
|
||||
@@ -671,18 +670,7 @@ CPUState *cpu_create(const char *typename);
|
||||
* Returns: type of CPU to create or prints error and terminates process
|
||||
* if an error occurred.
|
||||
*/
|
||||
const char *cpu_parse_cpu_model(const char *typename, const char *cpu_model);
|
||||
|
||||
/**
|
||||
* cpu_generic_init:
|
||||
* @typename: The CPU base type.
|
||||
* @cpu_model: The model string including optional parameters.
|
||||
*
|
||||
* Instantiates a CPU, processes optional parameters and realizes the CPU.
|
||||
*
|
||||
* Returns: A #CPUState or %NULL if an error occurred.
|
||||
*/
|
||||
CPUState *cpu_generic_init(const char *typename, const char *cpu_model);
|
||||
const char *parse_cpu_model(const char *cpu_model);
|
||||
|
||||
/**
|
||||
* cpu_has_work:
|
||||
|
||||
+6
-2
@@ -45,6 +45,7 @@ static const char *argv0;
|
||||
static int gdbstub_port;
|
||||
static envlist_t *envlist;
|
||||
static const char *cpu_model;
|
||||
static const char *cpu_type;
|
||||
unsigned long mmap_min_addr;
|
||||
unsigned long guest_base;
|
||||
int have_guest_base;
|
||||
@@ -4114,7 +4115,7 @@ void init_task_state(TaskState *ts)
|
||||
CPUArchState *cpu_copy(CPUArchState *env)
|
||||
{
|
||||
CPUState *cpu = ENV_GET_CPU(env);
|
||||
CPUState *new_cpu = cpu_init(cpu_model);
|
||||
CPUState *new_cpu = cpu_create(cpu_type);
|
||||
CPUArchState *new_env = new_cpu->env_ptr;
|
||||
CPUBreakpoint *bp;
|
||||
CPUWatchpoint *wp;
|
||||
@@ -4597,10 +4598,13 @@ int main(int argc, char **argv, char **envp)
|
||||
if (cpu_model == NULL) {
|
||||
cpu_model = cpu_get_model(get_elf_eflags(execfd));
|
||||
}
|
||||
cpu_type = parse_cpu_model(cpu_model);
|
||||
|
||||
tcg_exec_init(0);
|
||||
/* NOTE: we need to init the CPU at this stage to get
|
||||
qemu_host_page_size */
|
||||
cpu = cpu_init(cpu_model);
|
||||
|
||||
cpu = cpu_create(cpu_type);
|
||||
env = cpu->env_ptr;
|
||||
cpu_reset(cpu);
|
||||
|
||||
|
||||
@@ -67,37 +67,6 @@ CPUState *cpu_create(const char *typename)
|
||||
return cpu;
|
||||
}
|
||||
|
||||
const char *cpu_parse_cpu_model(const char *typename, const char *cpu_model)
|
||||
{
|
||||
ObjectClass *oc;
|
||||
CPUClass *cc;
|
||||
gchar **model_pieces;
|
||||
const char *cpu_type;
|
||||
|
||||
model_pieces = g_strsplit(cpu_model, ",", 2);
|
||||
|
||||
oc = cpu_class_by_name(typename, model_pieces[0]);
|
||||
if (oc == NULL) {
|
||||
error_report("unable to find CPU model '%s'", model_pieces[0]);
|
||||
g_strfreev(model_pieces);
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
|
||||
cpu_type = object_class_get_name(oc);
|
||||
cc = CPU_CLASS(oc);
|
||||
cc->parse_features(cpu_type, model_pieces[1], &error_fatal);
|
||||
g_strfreev(model_pieces);
|
||||
return cpu_type;
|
||||
}
|
||||
|
||||
CPUState *cpu_generic_init(const char *typename, const char *cpu_model)
|
||||
{
|
||||
/* TODO: all callers of cpu_generic_init() need to be converted to
|
||||
* call cpu_parse_features() only once, before calling cpu_generic_init().
|
||||
*/
|
||||
return cpu_create(cpu_parse_cpu_model(typename, cpu_model));
|
||||
}
|
||||
|
||||
bool cpu_paging_enabled(const CPUState *cpu)
|
||||
{
|
||||
CPUClass *cc = CPU_GET_CLASS(cpu);
|
||||
@@ -317,41 +286,24 @@ static bool cpu_common_has_work(CPUState *cs)
|
||||
|
||||
ObjectClass *cpu_class_by_name(const char *typename, const char *cpu_model)
|
||||
{
|
||||
CPUClass *cc;
|
||||
|
||||
if (!cpu_model) {
|
||||
return NULL;
|
||||
}
|
||||
cc = CPU_CLASS(object_class_by_name(typename));
|
||||
CPUClass *cc = CPU_CLASS(object_class_by_name(typename));
|
||||
|
||||
assert(cpu_model && cc->class_by_name);
|
||||
return cc->class_by_name(cpu_model);
|
||||
}
|
||||
|
||||
static ObjectClass *cpu_common_class_by_name(const char *cpu_model)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static void cpu_common_parse_features(const char *typename, char *features,
|
||||
Error **errp)
|
||||
{
|
||||
char *featurestr; /* Single "key=value" string being parsed */
|
||||
char *val;
|
||||
static bool cpu_globals_initialized;
|
||||
/* Single "key=value" string being parsed */
|
||||
char *featurestr = features ? strtok(features, ",") : NULL;
|
||||
|
||||
/* TODO: all callers of ->parse_features() need to be changed to
|
||||
* call it only once, so we can remove this check (or change it
|
||||
* to assert(!cpu_globals_initialized).
|
||||
* Current callers of ->parse_features() are:
|
||||
* - cpu_generic_init()
|
||||
*/
|
||||
if (cpu_globals_initialized) {
|
||||
return;
|
||||
}
|
||||
/* should be called only once, catch invalid users */
|
||||
assert(!cpu_globals_initialized);
|
||||
cpu_globals_initialized = true;
|
||||
|
||||
featurestr = features ? strtok(features, ",") : NULL;
|
||||
|
||||
while (featurestr) {
|
||||
val = strchr(featurestr, '=');
|
||||
if (val) {
|
||||
@@ -457,7 +409,6 @@ static void cpu_class_init(ObjectClass *klass, void *data)
|
||||
DeviceClass *dc = DEVICE_CLASS(klass);
|
||||
CPUClass *k = CPU_CLASS(klass);
|
||||
|
||||
k->class_by_name = cpu_common_class_by_name;
|
||||
k->parse_features = cpu_common_parse_features;
|
||||
k->reset = cpu_common_reset;
|
||||
k->get_arch_id = cpu_common_get_arch_id;
|
||||
|
||||
+1
-2
@@ -466,10 +466,9 @@ enum {
|
||||
|
||||
void alpha_translate_init(void);
|
||||
|
||||
#define cpu_init(cpu_model) cpu_generic_init(TYPE_ALPHA_CPU, cpu_model)
|
||||
|
||||
#define ALPHA_CPU_TYPE_SUFFIX "-" TYPE_ALPHA_CPU
|
||||
#define ALPHA_CPU_TYPE_NAME(model) model ALPHA_CPU_TYPE_SUFFIX
|
||||
#define CPU_RESOLVING_TYPE TYPE_ALPHA_CPU
|
||||
|
||||
void alpha_cpu_list(FILE *f, fprintf_function cpu_fprintf);
|
||||
/* you can call this signal handler from your SIGBUS and SIGSEGV
|
||||
|
||||
+1
-2
@@ -2302,10 +2302,9 @@ static inline bool arm_excp_unmasked(CPUState *cs, unsigned int excp_idx,
|
||||
return unmasked || pstate_unmasked;
|
||||
}
|
||||
|
||||
#define cpu_init(cpu_model) cpu_generic_init(TYPE_ARM_CPU, cpu_model)
|
||||
|
||||
#define ARM_CPU_TYPE_SUFFIX "-" TYPE_ARM_CPU
|
||||
#define ARM_CPU_TYPE_NAME(name) (name ARM_CPU_TYPE_SUFFIX)
|
||||
#define CPU_RESOLVING_TYPE TYPE_ARM_CPU
|
||||
|
||||
#define cpu_signal_handler cpu_arm_signal_handler
|
||||
#define cpu_list arm_cpu_list
|
||||
|
||||
+1
-2
@@ -267,10 +267,9 @@ enum {
|
||||
#define TARGET_PHYS_ADDR_SPACE_BITS 32
|
||||
#define TARGET_VIRT_ADDR_SPACE_BITS 32
|
||||
|
||||
#define cpu_init(cpu_model) cpu_generic_init(TYPE_CRIS_CPU, cpu_model)
|
||||
|
||||
#define CRIS_CPU_TYPE_SUFFIX "-" TYPE_CRIS_CPU
|
||||
#define CRIS_CPU_TYPE_NAME(name) (name CRIS_CPU_TYPE_SUFFIX)
|
||||
#define CPU_RESOLVING_TYPE TYPE_CRIS_CPU
|
||||
|
||||
#define cpu_signal_handler cpu_cris_signal_handler
|
||||
|
||||
|
||||
+1
-1
@@ -266,7 +266,7 @@ static inline int cpu_mmu_index(CPUHPPAState *env, bool ifetch)
|
||||
|
||||
void hppa_translate_init(void);
|
||||
|
||||
#define cpu_init(cpu_model) cpu_generic_init(TYPE_HPPA_CPU, cpu_model)
|
||||
#define CPU_RESOLVING_TYPE TYPE_HPPA_CPU
|
||||
|
||||
void hppa_cpu_list(FILE *f, fprintf_function cpu_fprintf);
|
||||
|
||||
|
||||
+5
-8
@@ -195,6 +195,8 @@
|
||||
* bit[02]: Support Single-Range Output scheme;
|
||||
*/
|
||||
#define INTEL_PT_MINIMAL_ECX 0x7
|
||||
/* generated packets which contain IP payloads have LIP values */
|
||||
#define INTEL_PT_IP_LIP (1 << 31)
|
||||
#define INTEL_PT_ADDR_RANGES_NUM 0x2 /* Number of configurable address ranges */
|
||||
#define INTEL_PT_ADDR_RANGES_NUM_MASK 0x3
|
||||
#define INTEL_PT_MTC_BITMAP (0x0249 << 16) /* Support ART(0,3,6,9) */
|
||||
@@ -781,13 +783,7 @@ static char *x86_cpu_type_name(const char *model_name)
|
||||
static ObjectClass *x86_cpu_class_by_name(const char *cpu_model)
|
||||
{
|
||||
ObjectClass *oc;
|
||||
char *typename;
|
||||
|
||||
if (cpu_model == NULL) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
typename = x86_cpu_type_name(cpu_model);
|
||||
char *typename = x86_cpu_type_name(cpu_model);
|
||||
oc = object_class_by_name(typename);
|
||||
g_free(typename);
|
||||
return oc;
|
||||
@@ -4173,7 +4169,8 @@ static int x86_cpu_filter_features(X86CPU *cpu)
|
||||
((eax_1 & INTEL_PT_ADDR_RANGES_NUM_MASK) <
|
||||
INTEL_PT_ADDR_RANGES_NUM) ||
|
||||
((ebx_1 & (INTEL_PT_PSB_BITMAP | INTEL_PT_CYCLE_BITMAP)) !=
|
||||
(INTEL_PT_PSB_BITMAP | INTEL_PT_CYCLE_BITMAP))) {
|
||||
(INTEL_PT_PSB_BITMAP | INTEL_PT_CYCLE_BITMAP)) ||
|
||||
(ecx_0 & INTEL_PT_IP_LIP)) {
|
||||
/*
|
||||
* Processor Trace capabilities aren't configurable, so if the
|
||||
* host can't emulate the capabilities we report on
|
||||
|
||||
+1
-2
@@ -1589,10 +1589,9 @@ uint64_t cpu_get_tsc(CPUX86State *env);
|
||||
|
||||
#define PHYS_ADDR_MASK MAKE_64BIT_MASK(0, TCG_PHYS_ADDR_BITS)
|
||||
|
||||
#define cpu_init(cpu_model) cpu_generic_init(TYPE_X86_CPU, cpu_model)
|
||||
|
||||
#define X86_CPU_TYPE_SUFFIX "-" TYPE_X86_CPU
|
||||
#define X86_CPU_TYPE_NAME(name) (name X86_CPU_TYPE_SUFFIX)
|
||||
#define CPU_RESOLVING_TYPE TYPE_X86_CPU
|
||||
|
||||
#ifdef TARGET_X86_64
|
||||
#define TARGET_DEFAULT_CPU_TYPE X86_CPU_TYPE_NAME("qemu64")
|
||||
|
||||
+1
-2
@@ -255,10 +255,9 @@ void lm32_watchpoint_insert(CPULM32State *env, int index, target_ulong address,
|
||||
void lm32_watchpoint_remove(CPULM32State *env, int index);
|
||||
bool lm32_cpu_do_semihosting(CPUState *cs);
|
||||
|
||||
#define cpu_init(cpu_model) cpu_generic_init(TYPE_LM32_CPU, cpu_model)
|
||||
|
||||
#define LM32_CPU_TYPE_SUFFIX "-" TYPE_LM32_CPU
|
||||
#define LM32_CPU_TYPE_NAME(model) model LM32_CPU_TYPE_SUFFIX
|
||||
#define CPU_RESOLVING_TYPE TYPE_LM32_CPU
|
||||
|
||||
#define cpu_list lm32_cpu_list
|
||||
#define cpu_signal_handler cpu_lm32_signal_handler
|
||||
|
||||
+1
-2
@@ -527,10 +527,9 @@ enum {
|
||||
#define TARGET_PHYS_ADDR_SPACE_BITS 32
|
||||
#define TARGET_VIRT_ADDR_SPACE_BITS 32
|
||||
|
||||
#define cpu_init(cpu_model) cpu_generic_init(TYPE_M68K_CPU, cpu_model)
|
||||
|
||||
#define M68K_CPU_TYPE_SUFFIX "-" TYPE_M68K_CPU
|
||||
#define M68K_CPU_TYPE_NAME(model) model M68K_CPU_TYPE_SUFFIX
|
||||
#define CPU_RESOLVING_TYPE TYPE_M68K_CPU
|
||||
|
||||
#define cpu_signal_handler cpu_m68k_signal_handler
|
||||
#define cpu_list m68k_cpu_list
|
||||
|
||||
@@ -343,7 +343,7 @@ int cpu_mb_signal_handler(int host_signum, void *pinfo,
|
||||
#define TARGET_PHYS_ADDR_SPACE_BITS 32
|
||||
#define TARGET_VIRT_ADDR_SPACE_BITS 32
|
||||
|
||||
#define cpu_init(cpu_model) cpu_generic_init(TYPE_MICROBLAZE_CPU, cpu_model)
|
||||
#define CPU_RESOLVING_TYPE TYPE_MICROBLAZE_CPU
|
||||
|
||||
#define cpu_signal_handler cpu_mb_signal_handler
|
||||
|
||||
|
||||
+1
-2
@@ -739,10 +739,9 @@ enum {
|
||||
|
||||
int cpu_mips_signal_handler(int host_signum, void *pinfo, void *puc);
|
||||
|
||||
#define cpu_init(cpu_model) cpu_generic_init(TYPE_MIPS_CPU, cpu_model)
|
||||
|
||||
#define MIPS_CPU_TYPE_SUFFIX "-" TYPE_MIPS_CPU
|
||||
#define MIPS_CPU_TYPE_NAME(model) model MIPS_CPU_TYPE_SUFFIX
|
||||
#define CPU_RESOLVING_TYPE TYPE_MIPS_CPU
|
||||
|
||||
bool cpu_supports_cps_smp(const char *cpu_type);
|
||||
bool cpu_supports_isa(const char *cpu_type, unsigned int isa);
|
||||
|
||||
+1
-2
@@ -119,10 +119,9 @@ void moxie_translate_init(void);
|
||||
int cpu_moxie_signal_handler(int host_signum, void *pinfo,
|
||||
void *puc);
|
||||
|
||||
#define cpu_init(cpu_model) cpu_generic_init(TYPE_MOXIE_CPU, cpu_model)
|
||||
|
||||
#define MOXIE_CPU_TYPE_SUFFIX "-" TYPE_MOXIE_CPU
|
||||
#define MOXIE_CPU_TYPE_NAME(model) model MOXIE_CPU_TYPE_SUFFIX
|
||||
#define CPU_RESOLVING_TYPE TYPE_MOXIE_CPU
|
||||
|
||||
#define cpu_signal_handler cpu_moxie_signal_handler
|
||||
|
||||
|
||||
+1
-1
@@ -230,7 +230,7 @@ void nios2_check_interrupts(CPUNios2State *env);
|
||||
# define TARGET_VIRT_ADDR_SPACE_BITS 32
|
||||
#endif
|
||||
|
||||
#define cpu_init(cpu_model) cpu_generic_init(TYPE_NIOS2_CPU, cpu_model)
|
||||
#define CPU_RESOLVING_TYPE TYPE_NIOS2_CPU
|
||||
|
||||
#define cpu_gen_code cpu_nios2_gen_code
|
||||
#define cpu_signal_handler cpu_nios2_signal_handler
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user