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: <F81D1486B7B82141+ZuQp4YQkAA2cB9Rw@HX09040029.powercore.com.cn>
Date: Fri, 13 Sep 2024 20:02:41 +0800
From: Luming Yu <luming.yu@...ngroup.cn>
To: Christophe Leroy <christophe.leroy@...roup.eu>
Cc: linuxppc-dev@...ts.ozlabs.org, linux-kernel@...r.kernel.org,
	mpe@...erman.id.au, npiggin@...il.com, jialong.yang@...ngroup.cn,
	luming.yu@...il.com
Subject: Re: [PATCH 1/2] powerpc/entry: convert to common and generic entry

On Fri, Sep 13, 2024 at 10:30:56AM +0200, Christophe Leroy wrote:
> 
> 
> Le 13/09/2024 à 09:38, Luming Yu a écrit :
> > On Fri, Sep 13, 2024 at 08:54:12AM +0200, Christophe Leroy wrote:
> > > 
> > > 
> > > Le 13/09/2024 à 03:40, Luming Yu a écrit :
> > > > On Thu, Sep 12, 2024 at 12:23:29PM +0200, Christophe Leroy wrote:
> > > > > 
> > > > > 
> > > > > Le 12/09/2024 à 10:24, Luming Yu a écrit :
> > > > > > From: Yu Luming <luming.yu@...il.com>
> > > > > > 
> > > > > > convert powerpc entry code in syscall and fault to use syscall_work
> > > > > > and irqentry_state as well as common calls from generic entry infrastructure.
> > > > > > 
> > > > > > Signed-off-by: Luming Yu <luming.yu@...ngroup.cn>
> > > > > > ---
> > > > > >     arch/powerpc/Kconfig                   | 1 +
> > > > > >     arch/powerpc/include/asm/hw_irq.h      | 5 +++++
> > > > > >     arch/powerpc/include/asm/processor.h   | 6 ++++++
> > > > > >     arch/powerpc/include/asm/syscall.h     | 5 +++++
> > > > > >     arch/powerpc/include/asm/thread_info.h | 1 +
> > > > > >     arch/powerpc/kernel/syscall.c          | 6 +++++-
> > > > > >     arch/powerpc/mm/fault.c                | 5 +++++
> > > > > >     7 files changed, 28 insertions(+), 1 deletion(-)
> > > > > 
> > > > > There is another build problem:
> > > > > 
> > > > >     CC      kernel/entry/common.o
> > > > > kernel/entry/common.c: In function 'irqentry_exit':
> > > > > kernel/entry/common.c:335:21: error: implicit declaration of function
> > > > > 'regs_irqs_disabled'; did you mean 'raw_irqs_disabled'?
> > > > > [-Werror=implicit-function-declaration]
> > > > >     335 |         } else if (!regs_irqs_disabled(regs)) {
> > > > >         |                     ^~~~~~~~~~~~~~~~~~
> > > > >         |                     raw_irqs_disabled
> > > > > 
> > > > > 
> > > > > You have put regs_irqs_disabled() in a section dedicated to PPC64, so it
> > > > > fails on PPC32.
> > > > > 
> > > > > 
> > > > > After fixing this problem and providing an empty asm/entry-common.h it is
> > > > > now possible to build the kernel. But that's not enough, the board is stuck
> > > > > after:
> > > > > 
> > > > > ...
> > > > > [    2.871391] Freeing unused kernel image (initmem) memory: 1228K
> > > > > [    2.877990] Run /init as init process
> > > > 
> > > > Thanks for these questions. :-)
> > > > I haven't gotten chance to run it in ppc32 qemu.
> > > > the common syscall trace enter lost this hunk
> > > > -       if (!is_32bit_task())
> > > > -               audit_syscall_entry(regs->gpr[0], regs->gpr[3], regs->gpr[4],
> > > > -                                   regs->gpr[5], regs->gpr[6]);
> > > > -       else
> > > > -               audit_syscall_entry(regs->gpr[0],
> > > > -                                   regs->gpr[3] & 0xffffffff,
> > > > -                                   regs->gpr[4] & 0xffffffff,
> > > > -                                   regs->gpr[5] & 0xffffffff,
> > > > -                                   regs->gpr[6] & 0xffffffff);
> > > > which I don't understand whether we need a arch callbacks for it.
> > > 
> > > I don't thing so.
> > > 
> > > As far as I can see, audit_syscall_entry() is called by
> > > syscall_enter_audit() in kernel/entry/common.c
> > > 
> > > And the masking of arguments based on is_32bit_task() is done in
> > > syscall_get_arguments() with is called by
> > > syscall_enter_audit() just before calling audit_syscall_entry() and which is
> > > an arch callback that does the same as the removed hunk.
> > so, syscall_get_arguments is the ppc arch callback. thanks. :-)
> > > > 
> > > > Before I sent out the RFC patch set, the very limited compile and boot test goes well with a ppc64 qemu VM. Surely, there will be a lot of test, debug and following up patch set update that is necessary to make it a complete convert.
> > > 
> > > Even on ppc64 it doesn't build, at the first place because
> > > arch/powerpc/include/asm/entry-common.h is missing in your patch. Did you
> > > forget to 'git add' it ?
> > oh, I forget that I was testing this patch on top of the early user notifier patch:
> > https://eur01.safelinks.protection.outlook.com/?url=https%3A%2F%2Fgithub.com%2Flinuxppc%2Fissues%2Fissues%2F477&data=05%7C02%7Cchristophe.leroy%40csgroup.eu%7C35a08ca9a81f4c6ff8ce08dcd3c73555%7C8b87af7d86474dc78df45f69a2011bb5%7C0%7C0%7C638618099770810941%7CUnknown%7CTWFpbGZsb3d8eyJWIjoiMC4wLjAwMDAiLCJQIjoiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn0%3D%7C0%7C%7C%7C&sdata=yCQWLIAXL%2BNHnzrh0e91WIBvF0c5WfF6pY6ZMHstocA%3D&reserved=0, https://eur01.safelinks.protection.outlook.com/?url=https%3A%2F%2Fpatchwork.ozlabs.org%2Fproject%2Flinuxppc-dev%2Fpatch%2F1FD36D52828D2506%2B20231218031309.2063-1-luming.yu%40shingroup.cn%2F&data=05%7C02%7Cchristophe.leroy%40csgroup.eu%7C35a08ca9a81f4c6ff8ce08dcd3c73555%7C8b87af7d86474dc78df45f69a2011bb5%7C0%7C0%7C638618099770819779%7CUnknown%7CTWFpbGZsb3d8eyJWIjoiMC4wLjAwMDAiLCJQIjoiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn0%3D%7C0%7C%7C%7C&sdata=0WBSUlpAbL6EMdPEAtJv1HUHkbeUjjUcP98wYf9IxM4%3D&reserved=0
> > and the entry-common.h is as follows:
> > [root@...alhost linux]# cat arch/powerpc/include/asm/entry-common.h
> > /* SPDX-License-Identifier: GPL-2.0 */
> > #ifndef ARCH_POWERPC_ENTRY_COMMON_H
> > #define ARCH_POWERPC_ENTRY_COMMON_H
> > 
> > #include <linux/user-return-notifier.h>
> > 
> > static inline void arch_exit_to_user_mode_prepare(struct pt_regs *regs,
> >                                                    unsigned long ti_work)
> > {
> >          if (ti_work & _TIF_USER_RETURN_NOTIFY)
> >                  fire_user_return_notifiers();
> > }
> > 
> > #define arch_exit_to_user_mode_prepare arch_exit_to_user_mode_prepare
> > 
> > #endif
> > 
> > As you could see , it looks irrelevant.
> > > 
> > > And same as with PPC32, when I build PPC64 with an empty asm/entry-common.h,
> > > it doesn't work. So, I guess you had some needed code in that file and you
> > > have to send it.
> > 
> > please send me your kernel config and let me reproduce and double check
> > if there could be another bit of code make the difference. My test p8 64bit VM boots
> > an unmodified fedora 38 user space just fine with the patch.
> > After boot, the only difference is make install of kernel could hang for a while, that
> > I'm not sure how that could happen yet. and I plan to do some unit test for many common
> > features like : lockdep, ptrace, rcu, audit...
> > > 
> > 
> 
> 
> I tested with both ppc64_defconfig and ppc64le_defconfig. With those two
> configs QEMU remains stuck after the following lines. I use QEMU with
> machine pseries:
> 
> [    2.701874][    T1] Running code patching self-tests ...
> [    2.734007][    T1] registered taskstats version 1
> [    2.735891][    T1] Loading compiled-in X.509 certificates
> [    2.756472][    T1] Loaded X.509 cert 'Build time autogenerated kernel
> key: 003f25410c2285abf44b4685b6d63682a2dc9f11'
> [    2.784474][    T1] Demotion targets for Node 0: null
> [    2.784748][    T1] page_owner is disabled
> [    2.786795][    T1] Secure boot mode disabled
> [    2.787436][    T1] ima: No TPM chip found, activating TPM-bypass!
> [    2.787568][    T1] Loading compiled-in module X.509 certificates
> [    2.790854][    T1] Loaded X.509 cert 'Build time autogenerated kernel
> key: 003f25410c2285abf44b4685b6d63682a2dc9f11'
> [    2.791289][    T1] ima: Allocated hash algorithm: sha256
> [    2.796260][    T1] Secure boot mode disabled
> [    2.796448][    T1] Trusted boot mode disabled
> [    2.796560][    T1] ima: No architecture policies found
> [    2.799580][    T1] printk: legacy console [netcon0] enabled
> [    2.799696][    T1] netconsole: network logging started
> [    2.880282][    T1] Freeing unused kernel image (initmem) memory: 6528K
> [    2.884618][    T1] Checked W+X mappings: passed, no W+X pages found
> [    2.885366][    T1] rodata_test: all tests were successful
> [    2.885749][    T1] Run /init as init process
> [    3.214730][   T58] mount (58) used greatest stack depth: 28672 bytes
> left
> ...
> nothing happens after that.
reproduced with ppc64_defconfig
[    0.818972][    T1] Run /init as init process
[    5.851684][  T240] request_module: modprobe binfmt-4c46 cannot be processed, kmod busy with 50 threads for more than 5 seconds now
[    5.851742][  T240] kworker/u33:18 (240) used greatest stack depth: 13584 bytes left
[    5.860081][  T232] kworker/u33:16 (232) used greatest stack depth: 13072 bytes left
[    5.863145][  T210] kworker/u35:13 (210) used greatest stack depth: 12928 bytes left
[    5.865000][    T1] Failed to execute /init (error -8)
[    5.868897][    T1] Run /sbin/init as init process
[   10.891673][  T315] request_module: modprobe binfmt-4c46 cannot be processed, kmod busy with 50 threads for more than 5 seconds now
[   10.894036][    T1] Starting init: /sbin/init exists but couldn't execute it (error -8)
[   10.901455][    T1] Run /etc/init as init process
[   10.903154][    T1] Run /bin/init as init process
[   10.904747][    T1] Run /bin/sh as init process
[   15.931679][  T367] request_module: modprobe binfmt-4c46 cannot be processed, kmod busy with 50 threads for more than 5 seconds now
[   15.934689][    T1] Starting init: /bin/sh exists but couldn't execute it (error -8)
[   15.940766][    T1] Kernel panic - not syncing: No working init found.  Try passing init= option to kernel. See Linux Documentation/admin-guide/init.rst for guidance.
[   15.946981][    T1] CPU: 13 PID: 1 Comm: swapper/0 Not tainted 6.7.0-rc1 #24
[   15.950050][    T1] Hardware name: IBM pSeries (emulated by qemu) POWER8 (raw) 0x4d0200 0xf000004 of:SLOF,git-3a259d hv:linux,kvm pSeries
[   15.955633][    T1] Call Trace:
[   15.956714][    T1] [c0000000080fbd20] [c0000000011811e8] dump_stack_lvl+0x6c/0x9c (unreliable)
[   15.959302][    T1] [c0000000080fbd50] [c00000000016b654] panic+0x178/0x424
[   15.961929][    T1] [c0000000080fbdf0] [c00000000001048c] kernel_init+0x19c/0x1a0
[   15.965310][    T1] [c0000000080fbe50] [c00000000000d394] ret_from_kernel_user_thread+0x14/0x1c
[   15.968494][    T1] --- interrupt: 0 at 0x0
[   15.989760][    T1] pstore: backend (nvram) writing error (-1)
qemu-system-ppc64: OS terminated: `
[root@...alhost home]#
It would take some time to debug out from the issue. Stay tuned.
Thanks very much!
> 
> 
> For PPC32 I use pmac32_defconfig and QEMU machine mac99
> 
> Christophe
> 


Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ