On 06/02/18 12:30, Zhenzhong Duan wrote: > 在 2018/2/6 19:56, Andrew Cooper 写道: >> On 06/02/18 11:41, Zhenzhong Duan wrote: >>> On 2018/2/6 18:50, Andrew Cooper wrote: >>>> On 06/02/18 10:29, zhenzhong.duan wrote: >>>>> >>>>> >>>>> 2018年2月6日 17:20于 Andrew Cooper <andrew.coop...@citrix.com >>>>> <mailto:andrew.coop...@citrix.com>>写道: >>>>> > >>>>> > On 06/02/2018 09:13, Zhenzhong Duan wrote: >>>>> > > 在 2018/2/6 16:59, Andrew Cooper 写道: >>>>> > >> On 06/02/2018 08:43, Zhenzhong Duan wrote: >>>>> > >>> When ( ibrs && thunk == THUNK_DEFAULT && !retpoline_safe() ) >>>>> is true, >>>>> > >>> thunk is set to THUNK_JMP rather than THUNK_RETPOLINE. >>>>> > >>> >>>>> > >>> When (!ibrs && thunk == THUNK_DEFAULT && !retpoline_safe() ) >>>>> is true, >>>>> > >>> we should do the same. >>>>> > >>> >>>>> > >>> Signed-off-by: Zhenzhong Duan <zhenzhong.d...@oracle.com >>>>> <mailto:zhenzhong.d...@oracle.com>> >>>>> > >> Why? What improvement is this intended to give? >>>>> > > No improvement, I just feel if retpoline isn't safe, THUNK_JMP is >>>>> > > better and safer. >>>>> > > Above first check is working that way. >>>>> > >>>>> > If your only two choices are unsafe repoline or plain jumps, >>>>> then unsafe >>>>> > repoline is far far far safer. >>>>> > >>>>> > Its unsafe properties only kick in on an RSB underflow, and an >>>>> attacker >>>>> > would have to do call-depths analysis of the running binary to >>>>> identify >>>>> > which rets to attempt to poison. >>>>> > >>>>> Thanks for explaining. >>>>> So, for a retpoline safe processor, it just stop using RSB when >>>>> it's empty to avoid underflow? >>>>> >>>> >>>> The qualification of whether a processor is retpoline-safe or not >>>> is whether an RSB underflow causes a BTB lookup (unsafe) or not (safe). >>>> >>>> RSB underflows will always occur; you cannot get rid of them, but >>>> in most cases (i.e. pre-Skylake) they don't fall back to using a >>>> prediction source which can be poisoned by an attacker. >>> Understood. >>>> >>>>> Another question: >>>>> >>>>> if (opt_thunk == THUNK_DEFAULT && opt_ibrs == -1 && >>>>> CONFIG_INDIRECT_THUNK && !cpu_has_lfence_dispatch && >>>>> !retpoline_safe()) >>>>> results in "thunk = THUNK_JMP" regardless of the value of >>>>> "boot_cpu_has(X86_FEATURE_IBRSB)" >>>>> >>>> >>>> Your formatting is hard to follow, >>> Sorry, sent from mobile. >>>> but cpu_has_lfence_dispatch can only be false when virtualised >>>> under an SP2-unaware hypervisor on AMD hardware, at which point >>>> retpoline_safe() will return true. Also, AMD don't have IBRS in >>>> microcode and their future plans don't appear to involve using that >>>> particular CPUID bit. >>> That does make sense for AMD. But what about Intel hardware which >>> has (!cpu_has_lfence_dispatch && !retpoline_safe() && >>> !boot_cpu_has(X86_FEATURE_IBRSB)), should we prefer THUNK_RETPOLINE? >> >> Yes, and we do end up choosing RETPOLINE in those circumstances, as >> we hit the default case you originally tried to patch. > > If that's the case, I think we need another patch like below. > > @@ -223,7 +223,7 @@ void __init init_speculation_mitigations(void) > */ > else if ( retpoline_safe() ) > thunk = THUNK_RETPOLINE; > - else > + else if ( boot_cpu_has(X86_FEATURE_IBRSB) ) > ibrs = true; > } > /* Without compiler thunk support, use IBRS if available. */ > > As ibrs was set to true when !boot_cpu_has(X86_FEATURE_IBRSB) with > current code, then thunk was set to THUNK_JMP rather than THUNK_RETPOLINE.
You are correct. This is a side effect of an optimisation which was requested during review. I'll draft a patch. ~Andrew
_______________________________________________ Xen-devel mailing list Xen-devel@lists.xenproject.org https://lists.xenproject.org/mailman/listinfo/xen-devel