target: e2k: define CPUs we're testing against, define gdb arch
This commit is contained in:
parent
da7593ed5d
commit
3267e9ddab
|
@ -85,11 +85,41 @@ void cpu_e2k_set_id(CPUE2KState *env, unsigned int cpu)
|
|||
qemu_log_mask(LOG_UNIMP, "cpu_e2k_set_id: not implemented\n");
|
||||
}
|
||||
|
||||
/* https://www.altlinux.org/Модели_процессоров_Эльбрус */
|
||||
#define DEFAULT_CPU_MODEL "e8c"
|
||||
static const struct e2k_def_t e2k_defs[] = {
|
||||
{
|
||||
.name = "any",
|
||||
.isa_version = 4,
|
||||
}
|
||||
.name = "e8c", // default choice
|
||||
.canonical_name = "MCST Elbrus 8C",
|
||||
.gdb_arch = "elbrus-8c",
|
||||
.isa_version = 4,
|
||||
},
|
||||
{
|
||||
.name = "e2c+", // however it works better
|
||||
.canonical_name = "MCST Elbrus 2C+ (Monocube)",
|
||||
.gdb_arch = "elbrus-v2",
|
||||
.isa_version = 2,
|
||||
},
|
||||
#if 0 /* for reference, never tested */
|
||||
{
|
||||
.name = "e2s",
|
||||
.canonical_name = "MCST Elbrus 4C",
|
||||
.gdb_arch = "elbrus-v3",
|
||||
.isa_version = 3,
|
||||
},
|
||||
{
|
||||
.name = "e8c2",
|
||||
.canonical_name = "MCST Elbrus 8CB",
|
||||
.gdb_arch = "elbrus-v5",
|
||||
.isa_version = 5,
|
||||
},
|
||||
{
|
||||
.name = "e16c",
|
||||
.canonical_name = "MCST Elbrus 16C",
|
||||
.gdb_arch = "elbrus-v6",
|
||||
.isa_version = 6,
|
||||
},
|
||||
#endif
|
||||
};
|
||||
|
||||
static inline void cpu_dump_state_br(CPUE2KState *env, FILE *f, int flags)
|
||||
|
@ -173,9 +203,7 @@ static bool e2k_cpu_has_work(CPUState *cs)
|
|||
|
||||
static char *e2k_cpu_type_name(const char *cpu_model)
|
||||
{
|
||||
// TODO: e2k_cpu_type_name
|
||||
char *name = g_strdup_printf("%s", cpu_model);
|
||||
return name;
|
||||
return g_strdup(cpu_model);
|
||||
}
|
||||
|
||||
static ObjectClass *e2k_cpu_class_by_name(const char *cpu_model)
|
||||
|
@ -183,6 +211,12 @@ static ObjectClass *e2k_cpu_class_by_name(const char *cpu_model)
|
|||
ObjectClass *oc;
|
||||
char *typename;
|
||||
|
||||
#ifdef CONFIG_USER_ONLY
|
||||
if (!strcasecmp(cpu_model, "any")) {
|
||||
cpu_model = DEFAULT_CPU_MODEL;
|
||||
}
|
||||
#endif // CONFIG_USER_ONLY
|
||||
|
||||
typename = e2k_cpu_type_name(cpu_model);
|
||||
oc = object_class_by_name(typename);
|
||||
g_free(typename);
|
||||
|
@ -223,6 +257,14 @@ static void e2k_cpu_initfn(Object* obj)
|
|||
}
|
||||
}
|
||||
|
||||
static gchar* e2k_cpu_gdb_arch_name(CPUState *cs)
|
||||
{
|
||||
E2KCPU *cpu = E2K_CPU(cs);
|
||||
CPUE2KState *env = &cpu->env;
|
||||
|
||||
return g_strdup_printf("%s:%d", env->def.gdb_arch, TARGET_LONG_BITS);
|
||||
}
|
||||
|
||||
static void e2k_cpu_class_init(ObjectClass *oc, void *data)
|
||||
{
|
||||
E2KCPUClass *ecc = E2K_CPU_CLASS(oc);
|
||||
|
@ -244,6 +286,7 @@ static void e2k_cpu_class_init(ObjectClass *oc, void *data)
|
|||
cc->disas_set_info = cpu_e2k_disas_set_info;
|
||||
cc->tcg_initialize = e2k_tcg_initialize;
|
||||
|
||||
cc->gdb_arch_name = e2k_cpu_gdb_arch_name;
|
||||
cc->gdb_read_register = e2k_cpu_gdb_read_register;
|
||||
cc->gdb_write_register = e2k_cpu_gdb_write_register;
|
||||
cc->gdb_num_core_regs = 574;
|
||||
|
@ -290,3 +333,16 @@ static void e2k_cpu_register_types(void)
|
|||
}
|
||||
|
||||
type_init(e2k_cpu_register_types)
|
||||
|
||||
void e2k_cpu_list(void)
|
||||
{
|
||||
unsigned int i;
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(e2k_defs); i++) {
|
||||
qemu_printf("%6s (%-30s) ISA version: v%d\n",
|
||||
e2k_defs[i].name,
|
||||
e2k_defs[i].canonical_name,
|
||||
e2k_defs[i].isa_version
|
||||
);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -242,8 +242,10 @@ typedef enum {
|
|||
} Exception;
|
||||
|
||||
struct e2k_def_t {
|
||||
const char *name;
|
||||
uint32_t isa_version;
|
||||
const char *name;
|
||||
const char *canonical_name;
|
||||
const char *gdb_arch;
|
||||
uint32_t isa_version;
|
||||
};
|
||||
|
||||
typedef struct {
|
||||
|
@ -460,12 +462,14 @@ static inline void cpu_get_tb_cpu_state(CPUE2KState *env, target_ulong *pc,
|
|||
}
|
||||
|
||||
void e2k_cpu_do_interrupt(CPUState *cs);
|
||||
void e2k_cpu_list(void);
|
||||
int e2k_cpu_signal_handler(int host_signum, void *pinfo, void *puc);
|
||||
int e2k_cpu_gdb_read_register(CPUState *cs, GByteArray *mem_buf, int n);
|
||||
int e2k_cpu_gdb_write_register(CPUState *cs, uint8_t *mem_buf, int n);
|
||||
void e2k_break_save_state(CPUE2KState *env);
|
||||
|
||||
#define cpu_signal_handler e2k_cpu_signal_handler
|
||||
#define cpu_list e2k_cpu_list
|
||||
|
||||
static inline uint64_t e2k_state_desc_lo(E2KDescState *desc)
|
||||
{
|
||||
|
|
Loading…
Reference in New Issue