[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PULL v2 36/44] Hexagon (iclass): update J4_hintjumpr slot constraints
|
From: |
Taylor Simpson |
|
Subject: |
[PULL v2 36/44] Hexagon (iclass): update J4_hintjumpr slot constraints |
|
Date: |
Thu, 18 May 2023 13:04:03 -0700 |
From: Matheus Tavares Bernardino <quic_mathbern@quicinc.com>
The Hexagon PRM says that "The assembler automatically encodes
instructions in the packet in the proper order. In the binary encoding
of a packet, the instructions must be ordered from Slot 3 down to
Slot 0."
Prior to the architecture version v73, the slot constraints from
instruction "hintjr" only allowed it to be executed at slot 2.
With that in mind, consider the packet:
{
hintjr(r0)
nop
nop
if (!p0) memd(r1+#0) = r1:0
}
To satisfy the ordering rule quoted from the PRM, the assembler would,
thus, move one of the nops to the first position, so that it can be
assigned to slot 3 and the subsequent hintjr to slot 2.
However, since v73, hintjr can be executed at either slot 2 or 3. So
there is no need to reorder that packet and the assembler will encode it
as is. When QEMU tries to execute it, however, we end up hitting a
"misaliged store" exception because both the store and the hintjr will
be assigned to store 0, and some functions like `slot_is_predicated()`
expect the decode machinery to assign only one instruction per slot. In
particular, the mentioned function will traverse the packet until it
finds the first instruction at the desired slot which, for slot 0, will
be hintjr. Since hintjr is not predicated, the result is that we try to
execute the store regardless of the predicate. And because the predicate
is false, we had not previously loaded hex_store_addr[0] or
hex_store_width[0]. As a result, the store will decide de width based on
trash memory, causing it to be misaligned.
Update the slot constraints for hintjr so that QEMU can properly handle
such encodings.
Note: to avoid similar-but-not-identical issues in the future, we should
look for multiple instructions at the same slot during decoding time and
throw an invalid packet exception. That will be done in the subsequent
commit.
Signed-off-by: Matheus Tavares Bernardino <quic_mathbern@quicinc.com>
Reviewed-by: Taylor Simpson <tsimpson@quicinc.com>
Signed-off-by: Taylor Simpson <tsimpson@quicinc.com>
Message-Id:
<0fcd8293642c6324119fbbab44741164bcbd04fb.1673616964.git.quic_mathbern@quicinc.com>
---
target/hexagon/iclass.c | 6 ++++--
1 file changed, 4 insertions(+), 2 deletions(-)
diff --git a/target/hexagon/iclass.c b/target/hexagon/iclass.c
index 6091286993..c3f8523b27 100644
--- a/target/hexagon/iclass.c
+++ b/target/hexagon/iclass.c
@@ -1,5 +1,5 @@
/*
- * Copyright(c) 2019-2021 Qualcomm Innovation Center, Inc. All Rights
Reserved.
+ * Copyright(c) 2019-2023 Qualcomm Innovation Center, Inc. All Rights
Reserved.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -51,8 +51,10 @@ SlotMask find_iclass_slots(Opcode opcode, int itype)
return SLOTS_0;
} else if ((opcode == J2_trap0) ||
(opcode == Y2_isync) ||
- (opcode == J2_pause) || (opcode == J4_hintjumpr)) {
+ (opcode == J2_pause)) {
return SLOTS_2;
+ } else if (opcode == J4_hintjumpr) {
+ return SLOTS_23;
} else if (GET_ATTRIB(opcode, A_CRSLOT23)) {
return SLOTS_23;
} else if (GET_ATTRIB(opcode, A_RESTRICT_PREFERSLOT0)) {
--
2.25.1
- [PULL v2 25/44] Hexagon (target/hexagon) Make special new_value for USR, (continued)
- [PULL v2 25/44] Hexagon (target/hexagon) Make special new_value for USR, Taylor Simpson, 2023/05/18
- [PULL v2 10/44] meson.build Add CONFIG_HEXAGON_IDEF_PARSER, Taylor Simpson, 2023/05/18
- [PULL v2 35/44] Hexagon: append eflags to unknown cpu model string, Taylor Simpson, 2023/05/18
- [PULL v2 08/44] Hexagon (target/hexagon) Add v73 scalar instructions, Taylor Simpson, 2023/05/18
- [PULL v2 30/44] Hexagon (target/hexagon) Move items to DisasContext, Taylor Simpson, 2023/05/18
- [PULL v2 31/44] Hexagon (target/hexagon) Additional instructions handled by idef-parser, Taylor Simpson, 2023/05/18
- [PULL v2 27/44] Hexagon (target/hexagon) Move new_pred_value to DisasContext, Taylor Simpson, 2023/05/18
- [PULL v2 33/44] Hexagon (target/hexagon/*.py): raise exception on reg parsing error, Taylor Simpson, 2023/05/18
- [PULL v2 28/44] Hexagon (target/hexagon) Move pred_written to DisasContext, Taylor Simpson, 2023/05/18
- [PULL v2 04/44] Hexagon (target/hexagon) Add v68 HVX instructions, Taylor Simpson, 2023/05/18
- [PULL v2 36/44] Hexagon (iclass): update J4_hintjumpr slot constraints,
Taylor Simpson <=
- [PULL v2 29/44] Hexagon (target/hexagon) Move pkt_has_store_s1 to DisasContext, Taylor Simpson, 2023/05/18
- [PULL v2 19/44] Hexagon (target/hexagon) Mark registers as read during packet analysis, Taylor Simpson, 2023/05/18
- [PULL v2 40/44] gdbstub: add test for untimely stop-reply packets, Taylor Simpson, 2023/05/18
- [PULL v2 41/44] Hexagon: add core gdbstub xml data for LLDB, Taylor Simpson, 2023/05/18
- [PULL v2 43/44] Hexagon (gdbstub): add HVX support, Taylor Simpson, 2023/05/18
- [PULL v2 42/44] Hexagon (gdbstub): fix p3:0 read and write via stub, Taylor Simpson, 2023/05/18
- [PULL v2 44/44] Hexagon (linux-user/hexagon): handle breakpoints, Taylor Simpson, 2023/05/18
- Re: [PULL v2 00/44] Hexagon update, Richard Henderson, 2023/05/19