git: 980746e5cb26 - main - fbt: simplify arm64 function-prologue parsing
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Sat, 03 Jun 2023 17:05:18 UTC
The branch main has been updated by christos:
URL: https://cgit.FreeBSD.org/src/commit/?id=980746e5cb264a70ad3dcbbf38ba919ad3436aa1
commit 980746e5cb264a70ad3dcbbf38ba919ad3436aa1
Author: Christos Margiolis <christos@FreeBSD.org>
AuthorDate: 2023-06-03 17:04:33 +0000
Commit: Christos Margiolis <christos@FreeBSD.org>
CommitDate: 2023-06-03 17:04:33 +0000
fbt: simplify arm64 function-prologue parsing
Reviewed by: markj
Approved by: markj (mentor)
Sponsored by: The FreeBSD Foundation
Differential Revision: https://reviews.freebsd.org/D40364
---
sys/cddl/dev/fbt/aarch64/fbt_isa.c | 42 +++++++++++++++-----------------------
1 file changed, 16 insertions(+), 26 deletions(-)
diff --git a/sys/cddl/dev/fbt/aarch64/fbt_isa.c b/sys/cddl/dev/fbt/aarch64/fbt_isa.c
index cc4ea42715c8..4b32d42ca0b4 100644
--- a/sys/cddl/dev/fbt/aarch64/fbt_isa.c
+++ b/sys/cddl/dev/fbt/aarch64/fbt_isa.c
@@ -130,35 +130,25 @@ fbt_provide_module_function(linker_file_t lf, int symindx,
*/
if (*instr == NOP_INSTR)
found = true;
- if (!found) {
- for (; instr < limit; instr++) {
+ for (; !found && instr < limit; instr++) {
+ /*
+ * Functions start with "stp xt1, xt2, [xn, <const>]!" or
+ * "sub sp, sp, <const>".
+ *
+ * Sometimes the compiler will have a sub instruction that is
+ * not of the above type so don't stop if we see one.
+ */
+ if ((*instr & LDP_STP_MASK) == STP_64) {
/*
- * Some functions start with
- * "stp xt1, xt2, [xn, <const>]!"
+ * Assume any other store of this type means we are
+ * past the function prologue.
*/
- if ((*instr & LDP_STP_MASK) == STP_64) {
- /*
- * Assume any other store of this type means we
- * are past the function prolog.
- */
- if (((*instr >> ADDR_SHIFT) & ADDR_MASK) == 31)
- found = true;
- break;
- }
-
- /*
- * Some functions start with a "sub sp, sp, <const>"
- * Sometimes the compiler will have a sub instruction
- * that is not of the above type so don't stop if we
- * see one.
- */
- if ((*instr & SUB_MASK) == SUB_INSTR &&
- ((*instr >> SUB_RD_SHIFT) & SUB_R_MASK) == 31 &&
- ((*instr >> SUB_RN_SHIFT) & SUB_R_MASK) == 31) {
+ if (((*instr >> ADDR_SHIFT) & ADDR_MASK) == 31)
found = true;
- break;
- }
- }
+ } else if ((*instr & SUB_MASK) == SUB_INSTR &&
+ ((*instr >> SUB_RD_SHIFT) & SUB_R_MASK) == 31 &&
+ ((*instr >> SUB_RN_SHIFT) & SUB_R_MASK) == 31)
+ found = true;
}
if (!found)