target/hexagon: Implement {g,s}etimask helpers
Reviewed-by: Taylor Simpson <ltaylorsimpson@gmail.com> Signed-off-by: Brian Cain <brian.cain@oss.qualcomm.com>
Brian Cain committed
Jun 22, 2026 at 15:28 UTC
c7e290f89393b717e12a81262c8a89417a1a981d
1 file changed
+34
-2
target/hexagon/op_helper.c
+34
-2
@@ -1499,12 +1499,44 @@ void HELPER(resume)(CPUHexagonState *env, uint32_t mask)
1499
1500
uint32_t HELPER(getimask)(CPUHexagonState *env, uint32_t tid)
1501
{
1502
- g_assert_not_reached();
1502
+ CPUState *cs;
1503
+ BQL_LOCK_GUARD();
1504
+ CPU_FOREACH(cs) {
1505
+ HexagonCPU *found_cpu = HEXAGON_CPU(cs);
1506
+ CPUHexagonState *found_env = &found_cpu->env;
1507
+ if (found_env->threadId == tid) {
1508
+ uint32_t imask = found_env->t_sreg[HEX_SREG_IMASK];
1509
+ qemu_log_mask(CPU_LOG_INT, "%s: tid " TARGET_FMT_lx
1510
+ " imask = 0x%" PRIx32 "\n", __func__,
1511
+ env->threadId,
1512
+ (uint32_t)GET_FIELD(IMASK_MASK, imask));
1513
+ return GET_FIELD(IMASK_MASK, imask);
1514
+ }
1515
+ }
1516
+ return 0;
1517
}
1518
1519
void HELPER(setimask)(CPUHexagonState *env, uint32_t tid, uint32_t imask)
1520
{
1507
- g_assert_not_reached();
1521
+ CPUState *cs;
1522
+
1523
+ BQL_LOCK_GUARD();
1524
+ CPU_FOREACH(cs) {
1525
+ HexagonCPU *found_cpu = HEXAGON_CPU(cs);
1526
+ CPUHexagonState *found_env = &found_cpu->env;
1527
+
1528
+ if (tid == found_env->threadId) {
1529
+ SET_SYSTEM_FIELD(found_env, HEX_SREG_IMASK, IMASK_MASK, imask);
1530
+ qemu_log_mask(CPU_LOG_INT, "%s: tid " TARGET_FMT_lx
1531
+ " imask 0x%" PRIx32 "\n",
1532
+ __func__, found_env->threadId, imask);
1533
+ hex_interrupt_update(found_env);
1534
+ return;
1535
+ }
1536
+ }
1537
+ qemu_log_mask(LOG_GUEST_ERROR,
1538
+ "setimask used with an invalid tid near PC: 0x%"
1539
+ PRIx32 "\n", env->next_PC);
1540
}
1541
1542
void HELPER(sreg_write_masked)(CPUHexagonState *env, uint32_t reg, uint32_t val)