lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID:
 <TYZPR03MB8801CA715C617955A87B202AD1E42@TYZPR03MB8801.apcprd03.prod.outlook.com>
Date: Sun, 19 Jan 2025 08:42:24 +0800
From: Ethan Zhao <etzhao@...look.com>
To: Xin Li <xin@...or.com>, "H. Peter Anvin" <hpa@...or.com>
Cc: x86@...nel.org, linux-kernel@...r.kernel.org,
 dave.hansen@...ux.intel.com, tglx@...utronix.de, stable@...r.kernel.org,
 Ethan Zhao <haifeng.zhao@...ux.intel.com>
Subject: Re: BUG ? exc_page_fault() was optimized out of fred_hwexc() by gcc
 with default kernel build option (-O2).

On 1/19/2025 2:34 AM, Xin Li wrote:
> On 1/18/2025 5:50 AM, Ethan Zhao wrote:
>> Hi, Xin, Peter
>>
>>    While checking the asm code of arch/x86/entry/entry_fred.o about 
>> function fred_hwexc(),
>> found the code was generated as following :
>>
>> 0000000000000200 <fred_hwexc.constprop.0>:
>>   200:   0f b6 87 a4 00 00 00    movzbl 0xa4(%rdi),%eax
>>   207:   3c 0e                   cmp    $0xe,%al /* match X86_TRAP_PF */
>>   209:   75 05                   jne    210 
>> <fred_hwexc.constprop.0+0x10>
>>   20b:   e9 00 00 00 00          jmp    210 
>> <fred_hwexc.constprop.0+0x10>
>>   210:   3c 0b                   cmp    $0xb,%al
>>   212:   74 6a                   je     27e 
>> <fred_hwexc.constprop.0+0x7e>
>>   214:   77 17                   ja     22d 
>> <fred_hwexc.constprop.0+0x2d>
>>   216:   3c 06                   cmp    $0x6,%al
>>   218:   0f 84 83 00 00 00       je     2a1 
>> <fred_hwexc.constprop.0+0xa1>
>>   21e:   76 29                   jbe    249 
>> <fred_hwexc.constprop.0+0x49>
>>   220:   3c 08                   cmp    $0x8,%al
>>   222:   74 78                   je     29c 
>> <fred_hwexc.constprop.0+0x9c>
>>   224:   3c 0a                   cmp    $0xa,%al
>>   226:   75 18                   jne    240 
>> <fred_hwexc.constprop.0+0x40>
>>   228:   e9 00 00 00 00          jmp    22d 
>> <fred_hwexc.constprop.0+0x2d>
>>   22d:   3c 11                   cmp    $0x11,%al
>>   22f:   74 66                   je     297 
>> <fred_hwexc.constprop.0+0x97>
>>   231:   76 2c                   jbe    25f 
>> <fred_hwexc.constprop.0+0x5f>
>>   233:   3c 13                   cmp    $0x13,%al
>>   235:   74 5b                   je     292 
>> <fred_hwexc.constprop.0+0x92>
>>   237:   3c 15                   cmp    $0x15,%al
>>   239:   75 1b                   jne    256 
>> <fred_hwexc.constprop.0+0x56>
>>   23b:   e9 00 00 00 00          jmp    240 
>> <fred_hwexc.constprop.0+0x40>
>>   240:   3c 07                   cmp    $0x7,%al
>>   242:   75 49                   jne    28d 
>> <fred_hwexc.constprop.0+0x8d>
>>   244:   e9 00 00 00 00          jmp    249 
>> <fred_hwexc.constprop.0+0x49>
>>   249:   3c 01                   cmp    $0x1,%al
>>   24b:   74 3b                   je     288 
>> <fred_hwexc.constprop.0+0x88>
>>   24d:   3c 05                   cmp    $0x5,%al
>>   24f:   75 1b                   jne    26c 
>> <fred_hwexc.constprop.0+0x6c>
>>   251:   e9 00 00 00 00          jmp    256 
>> <fred_hwexc.constprop.0+0x56>
>>   256:   3c 12                   cmp    $0x12,%al
>>   258:   75 33                   jne    28d 
>> <fred_hwexc.constprop.0+0x8d>
>>   25a:   e9 00 00 00 00          jmp    25f 
>> <fred_hwexc.constprop.0+0x5f>
>>
>> seems the following calling to exc_page_fault() was optimized out 
>> from fred_hwexc() by gcc,
>>
>> if(likely(regs->fred_ss.vector==X86_TRAP_PF))
>> returnexc_page_fault(regs,error_code);
>>
>> gcc version 11.4.0 (Ubuntu 11.4.0-1ubuntu1~22.04)
>>
>> GNU objdump (GNU Binutils) 2.43
>>
>>
>> default kernel config.
>> .config:CONFIG_X86_FRED=y
>>
>> my understanding, -O2 is the default kernel KBUILD_CFLAGS
>> So, Are there any workaround needed to make the kernel works with 
>> default build ?
>> or just as Peter said in another loop, manually loading some event 
>> bits to make the
>> over-smart gcc behave normally ?or fall back to -O(ption)0 ?
>>
>> Any idea, much appreciated !
>
> This is an optimization done in the original code:
>
> static noinstr void fred_hwexc(struct pt_regs *regs, unsigned long 
> error_code)
> {
>         /* Optimize for #PF. That's the only exception which matters 
> performance wise */
>         if (likely(regs->fred_ss.vector == X86_TRAP_PF))

The following line code was lost in the asm code after compiling !

Thanks,

Ethan

> return exc_page_fault(regs, error_code);
>
>         switch (regs->fred_ss.vector) {
>

Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ