]> www.infradead.org Git - users/hch/misc.git/commit
x86/its: FineIBT-paranoid vs ITS
authorPeter Zijlstra <peterz@infradead.org>
Wed, 23 Apr 2025 07:57:31 +0000 (09:57 +0200)
committerDave Hansen <dave.hansen@linux.intel.com>
Fri, 9 May 2025 20:39:36 +0000 (13:39 -0700)
commite52c1dc7455d32c8a55f9949d300e5e87d011fa6
tree5e64ba6e1e40d504f1f8559250a6a49bf834c1df
parent872df34d7c51a79523820ea6a14860398c639b87
x86/its: FineIBT-paranoid vs ITS

FineIBT-paranoid was using the retpoline bytes for the paranoid check,
disabling retpolines, because all parts that have IBT also have eIBRS
and thus don't need no stinking retpolines.

Except... ITS needs the retpolines for indirect calls must not be in
the first half of a cacheline :-/

So what was the paranoid call sequence:

  <fineibt_paranoid_start>:
   0:   41 ba 78 56 34 12       mov    $0x12345678, %r10d
   6:   45 3b 53 f7             cmp    -0x9(%r11), %r10d
   a:   4d 8d 5b <f0>           lea    -0x10(%r11), %r11
   e:   75 fd                   jne    d <fineibt_paranoid_start+0xd>
  10:   41 ff d3                call   *%r11
  13:   90                      nop

Now becomes:

  <fineibt_paranoid_start>:
   0:   41 ba 78 56 34 12       mov    $0x12345678, %r10d
   6:   45 3b 53 f7             cmp    -0x9(%r11), %r10d
   a:   4d 8d 5b f0             lea    -0x10(%r11), %r11
   e:   2e e8 XX XX XX XX cs call __x86_indirect_paranoid_thunk_r11

  Where the paranoid_thunk looks like:

   1d:  <ea>                    (bad)
   __x86_indirect_paranoid_thunk_r11:
   1e:  75 fd                   jne 1d
   __x86_indirect_its_thunk_r11:
   20:  41 ff eb                jmp *%r11
   23:  cc                      int3

[ dhansen: remove initialization to false ]

Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
Signed-off-by: Pawan Gupta <pawan.kumar.gupta@linux.intel.com>
Signed-off-by: Dave Hansen <dave.hansen@linux.intel.com>
Reviewed-by: Alexandre Chartre <alexandre.chartre@oracle.com>
arch/x86/include/asm/alternative.h
arch/x86/kernel/alternative.c
arch/x86/lib/retpoline.S
arch/x86/net/bpf_jit_comp.c
tools/objtool/arch/x86/decode.c