From: Juergen Gross <jgross@suse.com>
To: Boris Ostrovsky <boris.ostrovsky@oracle.com>,
Nicolai Stange <nstange@suse.de>,
Greg KH <gregkh@linuxfoundation.org>
Cc: Stefano Stabellini <sstabellini@kernel.org>,
Thomas Gleixner <tglx@linutronix.de>,
Ingo Molnar <mingo@redhat.com>, Borislav Petkov <bp@alien8.de>,
Dave Hansen <dave.hansen@linux.intel.com>,
x86@kernel.org, "H. Peter Anvin" <hpa@zytor.com>,
xen-devel@lists.xenproject.org, linux-kernel@vger.kernel.org,
jpoimboe@redhat.com, Ben Hutchings <ben@decadent.org.uk>
Subject: Re: Build warnings in Xen 5.15.y and 5.10.y with retbleed backports
Date: Sun, 17 Jul 2022 07:20:23 +0200 [thread overview]
Message-ID: <6eea38ab-17d2-7bdc-1277-9964a3828a9e@suse.com> (raw)
In-Reply-To: <ed82e54e-ccc4-f514-7018-8410d0f5bb82@oracle.com>
[-- Attachment #1.1.1: Type: text/plain, Size: 5518 bytes --]
On 17.07.22 00:47, Boris Ostrovsky wrote:
>
>
> On 7/16/22 12:35 PM, Nicolai Stange wrote:
>> Hi,
>>
>> I see a patch for this has been queued up for 5.10 already ([1]), I'm
>> just sharing my findings in support of this patch here -- it doesn't
>> merely exchange one warning for another, but fixes a real issue and
>> should perhaps get applied to other stable branches as well.
>>
>> TL;DR: for this particular warning, objtool would exit early and fail to
>> create any .orc_unwind* ELF sections for head_64.o, which are consumed
>> by the ORC unwinder at runtime.
>>
>>
>> Boris Ostrovsky <boris.ostrovsky@oracle.com> writes:
>>
>>> On 7/12/22 3:31 PM, Greg KH wrote:
>>>> On Tue, Jul 12, 2022 at 03:19:39PM -0400, Boris Ostrovsky wrote:
>>>>>
>>>>> On 7/12/22 12:38 PM, Greg KH wrote:
>>>>>> Hi all,
>>>>>>
>>>>>> I'm seeing the following build warning:
>>>>>> arch/x86/kernel/head_64.o: warning: objtool:
>>>>>> xen_hypercall_mmu_update(): can't find starting instruction
>>>>>> in the 5.15.y and 5.10.y retbleed backports.
>>
>> The reason for this is that with RET being multibyte, it can cross those
>> "xen_hypecall_*" symbol boundaries, because ...
>>
>>>>>>
>>>>>> I don't know why just this one hypercall is being called out by objtool,
>>>>>> and this warning isn't in 5.18 and Linus's tree due to I think commit
>>>>>> 5b2fc51576ef ("x86/ibt,xen: Sprinkle the ENDBR") being there.
>>>>>>
>>>>>> But, is this a ret call that we "forgot" here? It's a "real" ret in
>>>>>> Linus's branch:
>>>>>>
>>>>>> .pushsection .noinstr.text, "ax"
>>>>>> .balign PAGE_SIZE
>>>>>> SYM_CODE_START(hypercall_page)
>>>>>> .rept (PAGE_SIZE / 32)
>>>>>> UNWIND_HINT_FUNC
>>>>>> ANNOTATE_NOENDBR
>>>>>> ANNOTATE_UNRET_SAFE
>>>>>> ret
>>>>>> /*
>>>>>> * Xen will write the hypercall page, and sort out ENDBR.
>>>>>> */
>>>>>> .skip 31, 0xcc
>>>>>> .endr
>>>>>>
>>>>>> while 5.15.y and older has:
>>>>>> .pushsection .text
>>>>>> .balign PAGE_SIZE
>>>>>> SYM_CODE_START(hypercall_page)
>>>>>> .rept (PAGE_SIZE / 32)
>>>>>> UNWIND_HINT_FUNC
>>>>>> .skip 31, 0x90
>>
>> ... the "31" is no longer correct, ...
>>
>>>>>> ANNOTATE_UNRET_SAFE
>>>>>> RET
>>
>> ... as with RET occupying more than one byte, the resulting hypercall
>> entry's total size won't add up to 32 anymore.
>
>
> Right! I haven't thought about that part. I think this has been broken since
> 14b476e07fab ("x86: Prepare asm files for straight-line-speculation").
>
> It still shouldn't matter as far as correct execution is concerned which is
> probably why noone complained.
>
>
>>
>> Note that those xen_hypercall_* symbols' values are getting statically
>> calculated as 'hypercall page + n * 32' in the HYPERCALL() #define from
>> xen-head.S. So there's a mismatch and with RET == 'ret; int3', the
>> resulting .text effectively becomes
>>
>> 101e: 90 nop
>> 101f: c3 ret
>>
>> 0000000000001020 <xen_hypercall_mmu_update>:
>> 1020: cc int3
>> 1021: 90 nop
>> 1022: 90 nop
>>
>>
>> This is probably already not what has been intended, but because 'ret'
>> and 'int3' both are single-byte encoded, objtool would still be able to
>> find at least some "starting instruction" at this point.
>>
>> But with RET == 'jmp __x86_return_thunk', it becomes
>>
>> 101e: 90 nop
>> 101f: e9 .byte 0xe9
>>
>> 0000000000001020 <xen_hypercall_mmu_update>:
>> 1020: 00 00 add %al,(%rax)
>> 1022: 00 00 add %al,(%rax)
>> 1024: 90 nop
>>
>> Here the 'e9 00 00 00 00' jmp crosses the symbol boundary and objtool
>> errors out.
>>
>
>
> Ah, thanks for explanation.
>
>
> Then I think we need to replace
>
> .skip 31, 0x90
>
> with something like
>
> #if defined(CONFIG_RETHUNK) && !defined(__DISABLE_EXPORTS) && !defined(BUILD_VDSO)
> #define SKIP_BYTES 27 /* RET is 'jmp __x86_return_thunk' (5 bytes) */
> #else /* CONFIG_RETPOLINE */
> #ifdef CONFIG_SLS
> #define SKIP_BYTES 30 /* RET is 'ret; int3' (2 bytes) */
> #else
> #define SKIP_BYTES 31 /* RET is 'ret' (1 byte) */
> #endif
> .skip SKIP_BYTES, 0x90
>
> (I don't have patched 5.15 so I am going by what mainline looks like)
>
> Or replace RET with ret. (Although at least with unpatched 5.15 the warning
> below is still generated)
What about filling the complete hypercall page just with "int 3" or "ud2"?
Any try to do a hypercall before the hypercall page has been initialized
is a bug anyway. What good can come from calling a function which will
return a basically random value instead of doing a privileged operation?
Juergen
[-- Attachment #1.1.2: OpenPGP public key --]
[-- Type: application/pgp-keys, Size: 3149 bytes --]
[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 495 bytes --]
next prev parent reply other threads:[~2022-07-17 5:20 UTC|newest]
Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-07-12 16:38 Greg KH
2022-07-12 19:19 ` Boris Ostrovsky
2022-07-12 19:31 ` Greg KH
2022-07-12 20:22 ` Boris Ostrovsky
2022-07-16 16:35 ` Nicolai Stange
2022-07-16 22:47 ` Boris Ostrovsky
2022-07-17 5:20 ` Juergen Gross [this message]
2022-07-18 13:36 ` Boris Ostrovsky
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=6eea38ab-17d2-7bdc-1277-9964a3828a9e@suse.com \
--to=jgross@suse.com \
--cc=ben@decadent.org.uk \
--cc=boris.ostrovsky@oracle.com \
--cc=bp@alien8.de \
--cc=dave.hansen@linux.intel.com \
--cc=gregkh@linuxfoundation.org \
--cc=hpa@zytor.com \
--cc=jpoimboe@redhat.com \
--cc=linux-kernel@vger.kernel.org \
--cc=mingo@redhat.com \
--cc=nstange@suse.de \
--cc=sstabellini@kernel.org \
--cc=tglx@linutronix.de \
--cc=x86@kernel.org \
--cc=xen-devel@lists.xenproject.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
all inboxes | Powered by JetHome®