Thread (1 message) 1 message, 1 author, 2022-09-15

Re: [PATCH v2 1/1] x86/paravirt: write paravirt ident function in assembly

From: Juergen Gross via Virtualization <hidden>
Date: 2022-09-15 07:01:25
Also in: linux-hardening, lkml, llvm

On 14.09.22 18:21, Bill Wendling wrote:
The ZERO_CALL_USED_REGS feature may zero out caller-saved registers
before returning. However, alternate code may call this function without
first saving %[re]di, because the proper clobbers aren't taken into
account.

This shows up in spurious_kernel_fault() where the "pte_offset_kernel()"
call results in this assembly code:

.Ltmp151:
         #APP
         # ALT: oldnstr
.Ltmp152:
.Ltmp153:
.Ltmp154:
         .section        .discard.retpoline_safe,"",@progbits
         .quad   .Ltmp154
         .text

         callq   *pv_ops+536(%rip)

.Ltmp155:
         .section        .parainstructions,"a",@progbits
         .p2align        3, 0x0
         .quad   .Ltmp153
         .byte   67
         .byte   .Ltmp155-.Ltmp153
         .short  1
         .text
.Ltmp156:
         # ALT: padding
         .zero   (-(((.Ltmp157-.Ltmp158)-(.Ltmp156-.Ltmp152))>0))*((.Ltmp157-.Ltmp158)-(.Ltmp156-.Ltmp152)),144
.Ltmp159:
         .section        .altinstructions,"a",@progbits
.Ltmp160:
         .long   .Ltmp152-.Ltmp160
.Ltmp161:
         .long   .Ltmp158-.Ltmp161
         .short  33040
         .byte   .Ltmp159-.Ltmp152
         .byte   .Ltmp157-.Ltmp158
         .text

         .section        .altinstr_replacement,"ax",@progbits
         # ALT: replacement 1
.Ltmp158:
         movq    %rdi, %rax
.Ltmp157:
         .text
         #NO_APP
.Ltmp162:
         testb   $-128, %dil

The %dil register was zeroed out by the call to "*pv_ops+536(%rip)".

In general, the _paravirt_ident_64() function appears like it shouldn't
have any instrumentation or other modifications applied to it. Thus just
write it in assembly to avoid having to continually modify it whenever a
new feature comes along.

Link: https://github.com/KSPP/linux/issues/192
Cc: Kees Cook <redacted>
Cc: Nick Desaulniers <ndesaulniers@google.com>
Cc: Juergen Gross <jgross@suse.com>
Cc: "Srivatsa S. Bhat (VMware)" <redacted>
Cc: Alexey Makhalov <redacted>
Cc: Thomas Gleixner <redacted>
Cc: Ingo Molnar <mingo@redhat.com>
Cc: Borislav Petkov <bp@alien8.de>
Cc: Dave Hansen <dave.hansen@linux.intel.com>
Cc: "H. Peter Anvin" <hpa@zytor.com>
Cc: VMware PV-Drivers Reviewers <redacted>
Cc: x86@kernel.org
Cc: virtualization@lists.linux-foundation.org
Cc: linux-kernel@vger.kernel.org
Cc: llvm@lists.linux.dev
Signed-off-by: Bill Wendling <morbo@google.com>
Suggested-by: Peter Zijlstra <peterz@infradead.org>
Reported-and-tested-by: Nathan Chancellor <nathan@kernel.org>
Reviewed-by: Juergen Gross <jgross@suse.com>


Juergen
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help