target: e2k: define CPUs we're testing against, define gdb arch

This commit is contained in:
Alibek Omarov 2020-12-07 20:27:13 +03:00
parent da7593ed5d
commit 3267e9ddab
2 changed files with 68 additions and 8 deletions

View File

@ -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
);
}
}

View File

@ -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)
{