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 <keesc...@chromium.org>
Cc: Nick Desaulniers <ndesaulni...@google.com>
Cc: Juergen Gross <jgr...@suse.com>
Cc: "Srivatsa S. Bhat (VMware)" <sriva...@csail.mit.edu>
Cc: Alexey Makhalov <amakha...@vmware.com>
Cc: Thomas Gleixner <t...@linutronix.de>
Cc: Ingo Molnar <mi...@redhat.com>
Cc: Borislav Petkov <b...@alien8.de>
Cc: Dave Hansen <dave.han...@linux.intel.com>
Cc: "H. Peter Anvin" <h...@zytor.com>
Cc: VMware PV-Drivers Reviewers <pv-driv...@vmware.com>
Cc: x...@kernel.org
Cc: virtualization@lists.linux-foundation.org
Cc: linux-ker...@vger.kernel.org
Cc: l...@lists.linux.dev
Signed-off-by: Bill Wendling <mo...@google.com>
Suggested-by: Peter Zijlstra <pet...@infradead.org>
Reported-and-tested-by: Nathan Chancellor <nat...@kernel.org>

Reviewed-by: Juergen Gross <jgr...@suse.com>


Juergen

Attachment: OpenPGP_0xB0DE9DD628BF132F.asc
Description: OpenPGP public key

Attachment: OpenPGP_signature
Description: OpenPGP digital signature

_______________________________________________
Virtualization mailing list
Virtualization@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/virtualization

Reply via email to