target/hexagon: Add guest reg reading functionality
Signed-off-by: Matheus Tavares Bernardino <quic_mathbern@quicinc.com> Reviewed-by: Taylor Simpson <ltaylorsimpson@gmail.com> Signed-off-by: Brian Cain <brian.cain@oss.qualcomm.com>
This commit is contained in:
committed by
Brian Cain
parent
e6f692e627
commit
8c87f82cf9
@@ -770,6 +770,25 @@ static void hexagon_cpu_class_init(ObjectClass *c, const void *data)
|
||||
#endif
|
||||
}
|
||||
|
||||
#ifndef CONFIG_USER_ONLY
|
||||
uint32_t hexagon_greg_read(CPUHexagonState *env, uint32_t reg)
|
||||
{
|
||||
if (reg <= HEX_GREG_G3) {
|
||||
return env->greg[reg];
|
||||
}
|
||||
switch (reg) {
|
||||
case HEX_GREG_GPCYCLELO:
|
||||
return hexagon_get_sys_pcycle_count_low(env);
|
||||
case HEX_GREG_GPCYCLEHI:
|
||||
return hexagon_get_sys_pcycle_count_high(env);
|
||||
default:
|
||||
qemu_log_mask(LOG_UNIMP, "reading greg %" PRId32
|
||||
" not yet supported.\n", reg);
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
static void hexagon_cpu_class_base_init(ObjectClass *c, const void *data)
|
||||
{
|
||||
HexagonCPUClass *mcc = HEXAGON_CPU_CLASS(c);
|
||||
|
||||
@@ -220,6 +220,7 @@ G_NORETURN void hexagon_raise_exception_err(CPUHexagonState *env,
|
||||
* not stopped.
|
||||
*/
|
||||
bool hexagon_thread_is_enabled(CPUHexagonState *thread_env);
|
||||
uint32_t hexagon_greg_read(CPUHexagonState *env, uint32_t reg);
|
||||
void hexagon_cpu_soft_reset(CPUHexagonState *env);
|
||||
#endif
|
||||
|
||||
|
||||
@@ -1878,13 +1878,25 @@ uint64_t HELPER(sreg_read_pair)(CPUHexagonState *env, uint32_t reg)
|
||||
}
|
||||
|
||||
uint32_t HELPER(greg_read)(CPUHexagonState *env, uint32_t reg)
|
||||
|
||||
{
|
||||
g_assert_not_reached();
|
||||
return hexagon_greg_read(env, reg);
|
||||
}
|
||||
|
||||
uint64_t HELPER(greg_read_pair)(CPUHexagonState *env, uint32_t reg)
|
||||
|
||||
{
|
||||
g_assert_not_reached();
|
||||
if (reg == HEX_GREG_G0 || reg == HEX_GREG_G2) {
|
||||
return (uint64_t)(env->greg[reg]) |
|
||||
(((uint64_t)(env->greg[reg + 1])) << 32);
|
||||
}
|
||||
switch (reg) {
|
||||
case HEX_GREG_GPCYCLELO:
|
||||
return hexagon_get_sys_pcycle_count(env);
|
||||
default:
|
||||
return (uint64_t)hexagon_greg_read(env, reg) |
|
||||
((uint64_t)(hexagon_greg_read(env, reg + 1)) << 32);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
|
||||
Reference in New Issue
Block a user