mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
From: Peter Zijlstra <peterz@infradead.org>
To: Borislav Petkov <bp@alien8.de>
Cc: x86@kernel.org, linux-kernel@vger.kernel.org,
	David.Kaplan@amd.com, Andrew.Cooper3@citrix.com,
	jpoimboe@kernel.org, gregkh@linuxfoundation.org
Subject: Re: [RFC][PATCH 02/17] x86/cpu: Clean up SRSO return thunk mess
Date: Thu, 10 Aug 2023 14:37:56 +0200	[thread overview]
Message-ID: <20230810123756.GY212435@hirez.programming.kicks-ass.net> (raw)
In-Reply-To: <20230810115148.GEZNTPVLBmPL6uz4Af@fat_crate.local>

On Thu, Aug 10, 2023 at 01:51:48PM +0200, Borislav Petkov wrote:
> On Wed, Aug 09, 2023 at 09:12:20AM +0200, Peter Zijlstra wrote:
> > Where Zen1/2 flush the BTB using the instruction decoder trick
> > (test,movabs) Zen3/4 use instruction aliasing. SRSO adds RSB (RAP in
> 
> BTB aliasing.
> 
> > AMD speak) stuffing to force a return mis-predict.
> 
> No it doesn't. It causes BTB aliasing which evicts any potentially
> poisoned entries.

It does; so zen1/2 use the decoder thing to flush BTB entry of the RET,
both retbleed and srso do.

Then zen3/4 use the aliassing trick to flush the BTB entry of the RET.

Then both srso options use RSB/RAP stuffing to force a mispredict there.
Retbleed doesn't do this.

retbleed is about BTB, srso does both BTB and RSB/RAP.

> > That is; the AMD retbleed is a form of Speculative-Type-Confusion
> > where the branch predictor is trained to use the BTB to predict the
> > RET address, while AMD inception/SRSO is a form of
> > Speculative-Type-Confusion where another instruction is trained to be
> > treated like a CALL instruction and poison the RSB (RAP).
> 
> Nope, Andy explained it already in the 0th message.

I'm still of the opinion that branch-type-confusion is an integral part
of setting up the srso RSB/RAP trickery. It just targets a different
predictor, RSB/RAP vs BTB.

> > Pick one of three options at boot.
> 
> Yes, provided microarchitecturally that works, I'm all for removing the
> __ret alternative.

So this patch doesn't actually change anything except one layer of
indirection.

Your thing does:

SYNC_FUNC_START(foo)
	...
	ALTERNATIVE "ret; int3",
		    "jmp __x86_return_thunk", X86_FEATURE_RETHUNK
SYM_FUNC_END(foo)

SYM_FUNC_START(__x86_return_thunk)
	ALTERNATIVE("jmp __ret",
		    "call srso_safe_ret", X86_FEATURE_SRSO,
		    "call srso_alias_safe_ret", X86_FEATURE_SRSO_ALIAS);
	int3
SYM_FUNC_END(__x86_return_thunk)


So what was RET, jumps to __x86_return_thunk, which then jumps to the
actual return thunk.

After this patch things look equivalent to:

SYM_FUNC_START(foo)
	...
	ALTERNATIVE "ret; int3"
		    "jmp __x86_return_thunk", X86_FEATURE_RETHUNK
		    "jmp srso_return_thunk, X86_FEATURE_SRSO
		    "jmp srsi_alias_return_thunk", X86_FEATURE_SRSO_ALIAS
SYM_FUNC_END(foo)

SYM_CODE_START(srso_return_thunk)
	UNWIND_HINT_FUNC
	ANNOTATE_NOENDBR
	call srso_safe_ret;
	ud2
SYM_CODE_END(srso_return_thunk)

SYM_CODE_START(srso_alias_return_thunk)
	UNWIND_HINT_FUNC
	ANNOTATE_NOENDBR
	call srso_alias_safe_ret;
	ud2
SYM_CODE_END(srso_alias_return_thunk)


Except of course we don't have an actual ALTERNATIVE at the ret site,
but .return_sites and rewriting things to either "ret; int3" or whatever
function is in x86_return_thunk.


Before this patch, only one ret thunk is used at any one time, after
this patch still only one ret thunk is used.

fundamentally, you can only ever use one ret.

IOW this patch changes nothing for SRSO, it still does a jump to a call.
But it does clean up retbleed, which you had as a jump to a jump, back
to just a jump, and it does get rid of that extra alternative layer yo
had by using the one we already have at .return_sites rewrite.


  reply	other threads:[~2023-08-10 12:38 UTC|newest]

Thread overview: 80+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-08-09  7:12 [RFC][PATCH 00/17] Fix up the recent SRSO patches Peter Zijlstra
2023-08-09  7:12 ` [RFC][PATCH 01/17] x86/alternative: Unconditional custom return thunk Peter Zijlstra
2023-08-09  9:31   ` Nikolay Borisov
2023-08-10 11:37   ` Borislav Petkov
2023-08-09  7:12 ` [RFC][PATCH 02/17] x86/cpu: Clean up SRSO return thunk mess Peter Zijlstra
2023-08-09 15:45   ` Nikolay Borisov
2023-08-10 11:51   ` Borislav Petkov
2023-08-10 12:37     ` Peter Zijlstra [this message]
2023-08-10 12:56       ` Borislav Petkov
2023-08-10 13:22         ` Peter Zijlstra
2023-08-11  7:01       ` Peter Zijlstra
2023-08-11 17:00         ` Nick Desaulniers
2023-08-12 11:20           ` Peter Zijlstra
2023-08-09  7:12 ` [RFC][PATCH 03/17] x86/cpu: Make srso_untrain_ret consistent Peter Zijlstra
2023-08-10 12:00   ` Borislav Petkov
2023-08-09  7:12 ` [RFC][PATCH 04/17] objtool/x86: Fix SRSO mess Peter Zijlstra
2023-08-10 12:06   ` Borislav Petkov
2023-08-10 12:48     ` Peter Zijlstra
2023-08-10 12:50       ` Peter Zijlstra
2023-08-10 15:02         ` Borislav Petkov
2023-08-10 15:22           ` Peter Zijlstra
2023-08-09  7:12 ` [RFC][PATCH 05/17] x86/cpu: Cleanup the untrain mess Peter Zijlstra
2023-08-09 12:51   ` Josh Poimboeuf
2023-08-09 13:12     ` Peter Zijlstra
2023-08-09 13:26       ` Peter Zijlstra
2023-08-12 18:30         ` Borislav Petkov
2023-08-09  7:12 ` [RFC][PATCH 06/17] x86/cpu: Add SRSO untrain to retbleed= Peter Zijlstra
2023-08-09 13:42   ` Josh Poimboeuf
2023-08-09 14:06     ` Peter Zijlstra
2023-08-09 14:28       ` Josh Poimboeuf
2023-08-09 15:08         ` Peter Zijlstra
2023-08-09 15:43           ` Josh Poimboeuf
2023-08-09 14:31     ` Andrew.Cooper3
2023-08-09 14:39       ` Josh Poimboeuf
2023-08-10 15:44   ` Borislav Petkov
2023-08-10 16:10     ` Josh Poimboeuf
2023-08-11 10:27       ` Borislav Petkov
2023-08-12 11:32         ` Peter Zijlstra
2023-08-12 12:12           ` Borislav Petkov
2023-08-14 15:45           ` David Laight
2023-08-12 11:24       ` Peter Zijlstra
2023-08-12 12:10         ` Borislav Petkov
2023-08-14 10:56           ` Peter Zijlstra
2023-08-09  7:12 ` [RFC][PATCH 07/17] x86/cpu/kvm: Provide UNTRAIN_RET_VM Peter Zijlstra
2023-08-09 13:50   ` Josh Poimboeuf
2023-08-09 14:06     ` Peter Zijlstra
2023-08-09 14:30       ` Josh Poimboeuf
2023-08-09 15:10         ` Peter Zijlstra
2023-08-13 10:36   ` Borislav Petkov
2023-08-14 10:35     ` Peter Zijlstra
2023-08-09  7:12 ` [RFC][PATCH 08/17] x86/cpu: Add IBPB on VMEXIT to retbleed= Peter Zijlstra
2023-08-09  7:12 ` [RFC][PATCH 09/17] x86: Remove CONFIG_CPU_SRSO Peter Zijlstra
2023-08-09 13:57   ` Josh Poimboeuf
2023-08-09  7:12 ` [RFC][PATCH 10/17] x86: Remove CPU_IBPB_ENTRY Peter Zijlstra
2023-08-09  7:12 ` [RFC][PATCH 11/17] x86/cpu: Remove all SRSO interface nonsense Peter Zijlstra
2023-08-09 13:10   ` Andrew.Cooper3
2023-08-09 13:36     ` Peter Zijlstra
2023-08-09 14:05   ` Josh Poimboeuf
2023-08-09 14:43     ` Peter Zijlstra
2023-08-09 14:51       ` Josh Poimboeuf
2023-08-09 15:34   ` Josh Poimboeuf
2023-08-09  7:12 ` [RFC][PATCH 12/17] x86/cpu: Rename original retbleed return thunk Peter Zijlstra
2023-08-09 14:20   ` Josh Poimboeuf
2023-08-09 14:22     ` Peter Zijlstra
2023-08-10 11:06       ` Andrew.Cooper3
2023-08-10 13:02         ` Peter Zijlstra
2023-08-13 15:23           ` Andrew.Cooper3
2023-08-14 10:34             ` Peter Zijlstra
2023-08-14 11:31               ` Andrew.Cooper3
2023-08-14 12:06                 ` Peter Zijlstra
2023-08-09  7:12 ` [RFC][PATCH 13/17] objtool/x86: Add arch_is_offset_insn() Peter Zijlstra
2023-08-09  9:56   ` Nikolay Borisov
2023-08-09 14:34   ` Josh Poimboeuf
2023-08-09  7:12 ` [RFC][PATCH 14/17] objtool: Add comments to the arch_is_$foo() magic symbols Peter Zijlstra
2023-08-09  7:12 ` [RFC][PATCH 15/17] x86/cpu: Rename srso_(.*)_alias to srso_alias_\1 Peter Zijlstra
2023-08-09  7:12 ` [RFC][PATCH 16/17] x86/alternatives: Simplify ALTERNATIVE_n() Peter Zijlstra
2023-08-09  7:12 ` [RFC][PATCH 17/17] x86/cpu: Use fancy alternatives to get rid of entry_untrain_ret() Peter Zijlstra
2023-08-09  9:04 ` [RFC][PATCH 00/17] Fix up the recent SRSO patches Nikolay Borisov
2023-08-09 10:04 ` Andrew.Cooper3
2023-08-09 11:58   ` Peter Zijlstra

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20230810123756.GY212435@hirez.programming.kicks-ass.net \
    --to=peterz@infradead.org \
    --cc=Andrew.Cooper3@citrix.com \
    --cc=David.Kaplan@amd.com \
    --cc=bp@alien8.de \
    --cc=gregkh@linuxfoundation.org \
    --cc=jpoimboe@kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=x86@kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox

Powered by JetHome