blob: 3a6ba4e130400c07e2dbbd2d94ebbb6eca34b91d [file]
/* SPDX-License-Identifier: GPL-2.0-or-later */
#include "qemu/osdep.h"
#include "qemu.h"
#include "loader.h"
#include "target_elf.h"
#include "target/hexagon/cpu.h"
abi_ulong get_elf_hwcap(CPUState *cs)
{
HexagonCPUClass *mcc = HEXAGON_CPU_GET_CLASS(cs);
abi_ulong hwcaps;
uint32_t hex_ver;
if (!mcc->hex_def) {
return 0;
}
hex_ver = mcc->hex_def->hex_version;
switch (hex_ver) {
case HEX_VER_V5:
hwcaps = HWCAP_HEXAGON_ISA_V5;
break;
case HEX_VER_V55:
hwcaps = HWCAP_HEXAGON_ISA_V55;
break;
case HEX_VER_V60:
case HEX_VER_V61:
hwcaps = HWCAP_HEXAGON_ISA_V60;
break;
case HEX_VER_V62:
hwcaps = HWCAP_HEXAGON_ISA_V62;
break;
case HEX_VER_V65:
hwcaps = HWCAP_HEXAGON_ISA_V65;
break;
case HEX_VER_V66:
hwcaps = HWCAP_HEXAGON_ISA_V66;
break;
case HEX_VER_V67:
hwcaps = HWCAP_HEXAGON_ISA_V67;
break;
case HEX_VER_V68:
hwcaps = HWCAP_HEXAGON_ISA_V68;
break;
case HEX_VER_V69:
hwcaps = HWCAP_HEXAGON_ISA_V69;
break;
case HEX_VER_V71:
hwcaps = HWCAP_HEXAGON_ISA_V71;
break;
case HEX_VER_V73:
hwcaps = HWCAP_HEXAGON_ISA_V73;
break;
case HEX_VER_V75:
hwcaps = HWCAP_HEXAGON_ISA_V75;
break;
case HEX_VER_V79:
hwcaps = HWCAP_HEXAGON_ISA_V79;
break;
case HEX_VER_V81:
hwcaps = HWCAP_HEXAGON_ISA_V81;
break;
default:
return 0;
}
hwcaps |= HWCAP_HEXAGON_HVX;
hwcaps |= HWCAP_HEXAGON_HVX_LENGTH_128B;
if (hex_ver >= HEX_VER_V68) {
hwcaps |= HWCAP_HEXAGON_HVX_IEEE_FP;
}
return hwcaps;
}
const char *get_elf_cpu_model(uint32_t eflags)
{
static char buf[32];
int err;
switch (eflags) {
case 0x04:
return "v5";
case 0x05:
return "v55";
case 0x60:
return "v60";
case 0x61:
return "v61";
case 0x62:
return "v62";
case 0x65:
return "v65";
case 0x66:
return "v66";
case 0x67:
case 0x8067: /* v67t */
return "v67";
case 0x68:
return "v68";
case 0x69:
return "v69";
case 0x71:
case 0x8071: /* v71t */
return "v71";
case 0x73:
return "v73";
case 0x75:
return "v75";
case 0x79:
return "v79";
case 0x81:
return "v81";
}
err = snprintf(buf, sizeof(buf), "unknown (0x%x)", eflags);
return err >= 0 && err < sizeof(buf) ? buf : "unknown";
}