On 20/07/15 18:12, Will Deacon wrote:
diff --git a/arch/arm64/include/asm/alternative.h
b/arch/arm64/include/asm/alternative.h
index c385a0c4057f..31b19ad18f7e 100644
--- a/arch/arm64/include/asm/alternative.h
+++ b/arch/arm64/include/asm/alternative.h
@@ -77,6 +77,46 @@ void free_alternatives_memory(void);
.org . - (662b-661b) + (664b-663b)
.endm
+/*
+ * Begin an alternative code sequence.
+ *
+ * The code that follows this marco will be assembled and linked as
+ * normal. There are no restrictions on this code.
s/marco/macro/
Will fix this.
+ */
+.macro alternative_if_not cap
+ .pushsection .altinstructions, "a"
+ altinstruction_entry 661f, 663f, \cap, 662f-661f, 664f-663f
+ .popsection
+661:
+.endm
+
+/*
+ * Provide the alternative code sequence.
+ *
+ * The code that follows this macro is assembled into a special
+ * section to be used for dynamic patching. Code that follows this
+ * macro must:
+ *
+ * 1. Be exactly the same length (in bytes) as the default code
+ * sequence.
+ *
+ * 2. Not jump to local labels defined outside of the alternative
+ * sequence.
Actually, we fix up the branch target during patching. What you can't do
is jump into *another* alternative sequence.
Ok. I will update this.
I saw that there must be branch target patching (due to branches to
__save_vgic_v3_state) but got it into my head that branches to local
labels confused the assembler. I guess I must made an unrelated syntax
error because I just done a few tests and can't reproduce anything like
that.
Daniel.
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/