Re: [RESEND][PATCH 1/6] x86/bugs: Add asm helpers for executing VERW

Pawan Gupta
2023-10-25T06:28:35Z

On Sat, Oct 21, 2023 at 12:55:45AM +0100, Andrew Cooper wrote:
> On 20/10/2023 9:44 pm, Pawan Gupta wrote:
> > +#define EXEC_VERW \
> > + __EXEC_VERW(551f); \
> > + /* nopl __KERNEL_DS(%rax) */ \
> > + .byte 0x0f, 0x1f, 0x80, 0x00, 0x00; \
> > +551: .word __KERNEL_DS; \
>
> Is this actually wise from a perf point of view?
>
> You're causing a data access to the instruction stream, and not only
> that, the immediate next instruction. Some parts don't take kindly to
> snoops hitting L1I.
>
> A better option would be to simply have
>
> .section .text.entry
> .align CACHELINE
> mds_verw_sel:
> .word __KERNEL_DS
> int3
> .align CACHELINE
>
>
> And then just have EXEC_VERW be
>
> verw mds_verw_sel(%rip)
>
> in the fastpaths. That keeps the memory operand in .text.entry it works
> on Meltdown-vulnerable CPUs, but creates effectively a data cacheline
> that isn't mixed into anywhere in the frontend, which also gets far
> better locality of reference.

With .text.entry section I am getting getting below warnings and an
error:

-----------------------------------------------------------------
LD vmlinux.o
vmlinux.o: warning: objtool: .text.entry+0x0: unreachable instruction
vmlinux.o: warning: objtool: .text.entry+0x40: unreachable instruction
vmlinux.o: warning: objtool: .text.entry+0x80: unreachable instruction
vmlinux.o: warning: objtool: .text.entry+0xc0: unreachable instruction
vmlinux.o: warning: objtool: .text.entry+0x100: unreachable instruction
vmlinux.o: warning: objtool: .text.entry+0x140: unreachable instruction
vmlinux.o: warning: objtool: .text.entry+0x180: unreachable instruction
vmlinux.o: warning: objtool: .text.entry+0x1c0: unreachable instruction
vmlinux.o: warning: objtool: .text.entry+0x200: unreachable instruction
vmlinux.o: warning: objtool: .text.entry+0x240: unreachable instruction
vmlinux.o: warning: objtool: .text.entry+0x280: unreachable instruction
vmlinux.o: warning: objtool: .text.entry+0x2c0: unreachable instruction
vmlinux.o: warning: objtool: .text.entry+0x300: unreachable instruction
vmlinux.o: warning: objtool: .altinstr_replacement+0x2c: relocation to !ENDBR: .text.entry+0x0
vmlinux.o: warning: objtool: .altinstr_replacement+0x1c4: relocation to !ENDBR: .text.entry+0x0
vmlinux.o: warning: objtool: .altinstr_replacement+0x1d0: relocation to !ENDBR: .text.entry+0x0
vmlinux.o: warning: objtool: .altinstr_replacement+0x2d2: relocation to !ENDBR: .text.entry+0x80
vmlinux.o: warning: objtool: .altinstr_replacement+0x5d5: relocation to !ENDBR: .text.entry+0xc0
OBJCOPY modules.builtin.modinfo
GEN modules.builtin
MODPOST vmlinux.symvers
UPD include/generated/utsversion.h
CC init/version-timestamp.o
LD .tmp_vmlinux.kallsyms1
ld: error: unplaced orphan section `.text.entry' from `vmlinux.o'
make[2]: *** [scripts/Makefile.vmlinux:36: vmlinux] Error 1
-----------------------------------------------------------------

... because my config has CONFIG_LD_ORPHAN_WARN_LEVEL="error" and
objtool needs to be told about this entry.

Do you think its worth fighting these warnings and error, or simply use
.rodata section for verw memory operand?