mirror of
https://github.com/xen-project/xen.git
synced 2026-10-28 10:11:27 +01:00
x86/altcall: Check and optimise altcall targets
When converting indirect to direct calls, there is no need to execute endbr64 instructions. Detect and optimise this case, leaving a warning in the case that no endbr64 was found, as it likely indicates a build error. Signed-off-by: Andrew Cooper <andrew.cooper3@citrix.com> Reviewed-by: Jan Beulich <jbeulich@suse.com>
This commit is contained in:
1 parent
a0d8a94360
commit
12e3410e07
1 file changed
+23
@@ -18,6 +18,7 @@
|
||||
#include <xen/delay.h>
|
||||
#include <xen/types.h>
|
||||
#include <asm/apic.h>
|
||||
#include <asm/endbr.h>
|
||||
#include <asm/processor.h>
|
||||
#include <asm/alternative.h>
|
||||
#include <xen/init.h>
|
||||
@@ -279,6 +280,28 @@ static void init_or_livepatch _apply_alternatives(struct alt_instr *start,
|
||||
|
||||
if ( dest )
|
||||
{
|
||||
/*
|
||||
* When building for CET-IBT, all function pointer targets
|
||||
* should have an endbr64 instruction.
|
||||
*
|
||||
* If this is not the case, leave a warning because
|
||||
* something is probably wrong with the build. A CET-IBT
|
||||
* enabled system might have exploded already.
|
||||
*
|
||||
* Otherwise, skip the endbr64 instruction. This is a
|
||||
* marginal perf improvement which saves on instruction
|
||||
* decode bandwidth.
|
||||
*/
|
||||
if ( IS_ENABLED(CONFIG_HAS_CC_CET_IBT) )
|
||||
{
|
||||
if ( is_endbr64(dest) )
|
||||
dest += ENDBR64_LEN;
|
||||
else
|
||||
printk(XENLOG_WARNING
|
||||
"altcall %ps dest %ps has no endbr64\n",
|
||||
orig, dest);
|
||||
}
|
||||
|
||||
disp = dest - (orig + 5);
|
||||
ASSERT(disp == (int32_t)disp);
|
||||
*(int32_t *)(buf + 1) = disp;
|
||||
|
||||