Message ID | 2e2509a242fd5f3e23df4a06530c18060c4d321e.1576916812.git.christophe.leroy@c-s.fr (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | Enable CONFIG_VMAP_STACK on PPC32 | expand |
Christophe Leroy <christophe.leroy@c-s.fr> writes: > diff --git a/arch/powerpc/kernel/head_32.S b/arch/powerpc/kernel/head_32.S > index 90ef355e958b..3be041166db4 100644 > --- a/arch/powerpc/kernel/head_32.S > +++ b/arch/powerpc/kernel/head_32.S > @@ -272,14 +272,20 @@ __secondary_hold_acknowledge: > */ > . = 0x200 > DO_KVM 0x200 > +MachineCheck: > EXCEPTION_PROLOG_0 > +#ifdef CONFIG_VMAP_STACK > + li r11, MSR_KERNEL & ~(MSR_IR | MSR_RI) /* can take DTLB miss */ > + mtmsr r11 > +#endif > #ifdef CONFIG_PPC_CHRP > mfspr r11, SPRN_SPRG_THREAD > + tovirt_vmstack(r11, r11) This didn't build: arch/powerpc/kernel/head_32.S:283: Error: syntax error; found `r', expected `,' arch/powerpc/kernel/head_32.S:283: Error: found 'r', expected: ')' arch/powerpc/kernel/head_32.S:283: Error: bad expression arch/powerpc/kernel/head_32.S:283: Error: junk at end of line: `r11,%r11),0xc0000000@h' I fixed it by dropping the brackets. cheers
On Sat, Dec 21, 2019 at 08:32:38AM +0000, Christophe Leroy wrote: > A few changes to retrieve DAR and DSISR from struct regs > instead of retrieving them directly, as they may have > changed due to a TLB miss. > > Also modifies hash_page() and friends to work with virtual > data addresses instead of physical ones. Same on load_up_fpu() > and load_up_altivec(). > > Signed-off-by: Christophe Leroy <christophe.leroy@c-s.fr> This patch results in qemu boot failures (mac99 with pmac32_defconfig). Images fail silently; there is no console output. Reverting the patch fixes the problem. Bisect log is attached below. Assuming this was tested on real hardware, am I correct to assume that qemu for ppc32 (more specifically, qemu's mac99 and g3beige machines) no longer works with the upstream kernel ? Thanks, Guenter --- # bad: [33b40134e5cfbbccad7f3040d1919889537a3df7] Merge git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net # good: [d4e9056daedca3891414fe3c91de3449a5dad0f2] initramfs: do not show compression mode choice if INITRAMFS_SOURCE is empty git bisect start '33b40134e5cf' 'd4e9056daedc' # good: [9717c1cea16e3eae81ca226f4c3670bb799b61ad] Merge tag 'drm-next-2020-02-04' of git://anongit.freedesktop.org/drm/drm git bisect good 9717c1cea16e3eae81ca226f4c3670bb799b61ad # bad: [4c25df5640ae6e4491ee2c50d3f70c1559ef037d] Merge branch 'topic/user-access-begin' into next git bisect bad 4c25df5640ae6e4491ee2c50d3f70c1559ef037d # good: [846a17a53aeeee426cbc1252f517a6660eab1427] powerpc/powernv: Use common code for the symbol_map export git bisect good 846a17a53aeeee426cbc1252f517a6660eab1427 # good: [afe1ec5ab83029baf0f8368a255dc6b998bde576] powerpc/8xx: Split breakpoint exception git bisect good afe1ec5ab83029baf0f8368a255dc6b998bde576 # bad: [43e76cd368fbb67e767da5363ffeaa3989993c8c] powerpc: Do not consider weak unresolved symbol relocations as bad git bisect bad 43e76cd368fbb67e767da5363ffeaa3989993c8c # bad: [af1725d2493dcad4eeb7e63141678181fcd8a2ff] powerpc/kconfig: Move CONFIG_PPC32 into Kconfig.cputype git bisect bad af1725d2493dcad4eeb7e63141678181fcd8a2ff # good: [94dd54c51a410b9ffa6356c3ed2ab0317f998ded] powerpc/32s: Avoid crossing page boundary while changing SRR0/1. git bisect good 94dd54c51a410b9ffa6356c3ed2ab0317f998ded # bad: [0f9aee0cb9da7db7d96f63cfa2dc5e4f1bffeb87] powerpc/mm: Don't log user reads to 0xffffffff git bisect bad 0f9aee0cb9da7db7d96f63cfa2dc5e4f1bffeb87 # bad: [cd08f109e26231b279bcc0388428afcac6408ec6] powerpc/32s: Enable CONFIG_VMAP_STACK git bisect bad cd08f109e26231b279bcc0388428afcac6408ec6 # first bad commit: [cd08f109e26231b279bcc0388428afcac6408ec6] powerpc/32s: Enable CONFIG_VMAP_STACK
Le 06/02/2020 à 21:31, Guenter Roeck a écrit : > On Sat, Dec 21, 2019 at 08:32:38AM +0000, Christophe Leroy wrote: >> A few changes to retrieve DAR and DSISR from struct regs >> instead of retrieving them directly, as they may have >> changed due to a TLB miss. >> >> Also modifies hash_page() and friends to work with virtual >> data addresses instead of physical ones. Same on load_up_fpu() >> and load_up_altivec(). >> >> Signed-off-by: Christophe Leroy <christophe.leroy@c-s.fr> > > This patch results in qemu boot failures (mac99 with pmac32_defconfig). > Images fail silently; there is no console output. Reverting the patch > fixes the problem. Bisect log is attached below. > > Assuming this was tested on real hardware, am I correct to assume that qemu > for ppc32 (more specifically, qemu's mac99 and g3beige machines) no longer > works with the upstream kernel ? Before submitting the series, I successfully tested: - Real HW with powerpc 8xx - Real HW with powerpc 832x - Qemu's mac99 I'll re-check the upstream kernel. In the mean time, you can still unselect CONFIG_VMAP_STACK in your config. Christophe
On 02/07/2020 06:13 AM, Christophe Leroy wrote: > > > Le 06/02/2020 à 21:31, Guenter Roeck a écrit : >> On Sat, Dec 21, 2019 at 08:32:38AM +0000, Christophe Leroy wrote: >>> A few changes to retrieve DAR and DSISR from struct regs >>> instead of retrieving them directly, as they may have >>> changed due to a TLB miss. >>> >>> Also modifies hash_page() and friends to work with virtual >>> data addresses instead of physical ones. Same on load_up_fpu() >>> and load_up_altivec(). >>> >>> Signed-off-by: Christophe Leroy <christophe.leroy@c-s.fr> >> >> This patch results in qemu boot failures (mac99 with pmac32_defconfig). >> Images fail silently; there is no console output. Reverting the patch >> fixes the problem. Bisect log is attached below. >> >> Assuming this was tested on real hardware, am I correct to assume that >> qemu >> for ppc32 (more specifically, qemu's mac99 and g3beige machines) no >> longer >> works with the upstream kernel ? > > Before submitting the series, I successfully tested: > - Real HW with powerpc 8xx > - Real HW with powerpc 832x > - Qemu's mac99 > > I'll re-check the upstream kernel. > This is still working for me with the upstream kernel: >> ============================================================= >> OpenBIOS 1.1 [Oct 19 2017 07:00] >> Configuration device id QEMU version 1 machine id 1 >> CPUs: 1 >> Memory: 1024M >> UUID: 00000000-0000-0000-0000-000000000000 >> CPU type PowerPC,G4 milliseconds isn't unique. Welcome to OpenBIOS v1.1 built on Oct 19 2017 07:00 >> [ppc] Kernel already loaded (0x01000000 + 0x00902a90) (initrd 0x01a03000 + 0x001d1a3b) >> [ppc] Kernel command line: early_ioremap_debug console=ttyS0 OF stdout device is: /pci@f2000000/mac-io@c/escc@13000/ch-a@13020 Preparing to boot Linux version 5.5.0+ (root@pc16570vm.idsi0.si.c-s.fr) (gcc version 5.5.0 (GCC)) #3111 Fri Feb 7 07:23:08 UTC 2020 Detected machine type: 00000400 command line: memory layout at init: memory_limit : 00000000 (16 MB aligned) alloc_bottom : 01bd5000 alloc_top : 30000000 alloc_top_hi : 40000000 rmo_top : 30000000 ram_top : 40000000 copying OF device tree... Building dt strings... Building dt structure... Device tree strings 0x01bd6000 -> 0x01bd50a4 Device tree struct 0x01bd7000 -> 0x3fde7ef8 Quiescing Open Firmware ... Booting Linux via __start() @ 0x01000000 ... Hello World ! Total memory = 1024MB; using 2048kB for hash table Activating Kernel Userspace Execution Prevention Activating Kernel Userspace Access Protection Linux version 5.5.0+ (root@pc16570vm.idsi0.si.c-s.fr) (gcc version 5.5.0 (GCC)) #3111 Fri Feb 7 07:23:08 UTC 2020 Found initrd at 0xc1a03000:0xc1bd4a3b ioremap() called early from pmac_feature_init+0xd8/0xad0. Use early_ioremap() instead Found UniNorth memory controller & host bridge @ 0xf8000000 revision: 0xa2cfbc60 Mapped at 0xff3c0000 ioremap() called early from probe_one_macio+0x124/0x228. Use early_ioremap() instead Found a Keylargo mac-io controller, rev: 0, mapped at 0x(ptrval) PowerMac motherboard: PowerMac G4 AGP Graphics ioremap() called early from udbg_scc_init+0x164/0x35c. Use early_ioremap() instead boot stdout isn't a display ! ioremap() called early from find_via_cuda+0x9c/0x3d4. Use early_ioremap() instead Using PowerMac machine description printk: bootconsole [udbg0] enabled ----------------------------------------------------- phys_mem_size = 0x40000000 dcache_bsize = 0x20 icache_bsize = 0x20 cpu_features = 0x000000000401a00a possible = 0x00000000277de14b always = 0x0000000000000000 cpu_user_features = 0x9c000001 0x00000000 mmu_features = 0x00000001 Hash_size = 0x200000 Hash_mask = 0x7fff ----------------------------------------------------- ioremap() called early from pmac_pci_init+0x1b8/0x6e4. Use early_ioremap() instead ioremap() called early from pmac_pci_init+0x1d0/0x6e4. Use early_ioremap() instead Found UniNorth PCI host bridge at 0x00000000f2000000. Firmware bus number: 0->0 PCI host bridge /pci@f2000000 (primary) ranges: IO 0x00000000f2000000..0x00000000f27fffff -> 0x0000000000000000 ioremap() called early from pci_process_bridge_OF_ranges+0x1e4/0x2c0. Use early_ioremap() instead MEM 0x0000000080000000..0x000000008fffffff -> 0x0000000080000000 ioremap() called early from pmac_setup_arch+0x10c/0x294. Use early_ioremap() instead ioremap() called early from pmac_nvram_init+0x140/0x4f8. Use early_ioremap() instead nvram: Checking bank 0... Invalid signature Invalid checksum nvram: gen0=0, gen1=0 nvram: Active bank is: 0 nvram: OF partition at 0xffffffff nvram: XP partition at 0xffffffff nvram: NR partition at 0xffffffff Zone ranges: DMA [mem 0x0000000000000000-0x000000002fffffff] Normal empty HighMem [mem 0x0000000030000000-0x000000003fffffff] Movable zone start for each node Early memory node ranges node 0: [mem 0x0000000000000000-0x000000003fffffff] Initmem setup node 0 [mem 0x0000000000000000-0x000000003fffffff] Built 1 zonelists, mobility grouping on. Total pages: 260608 Kernel command line: early_ioremap_debug console=ttyS0 Dentry cache hash table entries: 131072 (order: 7, 524288 bytes, linear) Inode-cache hash table entries: 65536 (order: 6, 262144 bytes, linear) mem auto-init: stack:off, heap alloc:off, heap free:off Memory: 1026364K/1048576K available (6476K kernel code, 684K rwdata, 1612K rodata, 268K init, 186K bss, 22212K reserved, 0K cma-reserved, 262144K highmem) Kernel virtual memory layout: * 0xffbcf000..0xfffff000 : fixmap * 0xff400000..0xff800000 : highmem PTEs * 0xfeb36000..0xff400000 : early ioremap * 0xf1000000..0xfeb36000 : vmalloc & ioremap SLUB: HWalign=32, Order=0-3, MinObjects=0, CPUs=1, Nodes=1 NR_IRQS: 512, nr_irqs: 512, preallocated irqs: 16 mpic: Setting up MPIC " MPIC 1 " version 1.2 at 80040000, max 1 CPUs mpic: ISU size: 64, shift: 6, mask: 3f mpic: Initializing for 64 sources GMT Delta read from XPRAM: 0 minutes, DST: on clocksource: timebase: mask: 0xffffffffffffffff max_cycles: 0x171024e7e0, max_idle_ns: 440795205315 ns clocksource: timebase mult[a000000] shift[24] registered Console: colour dummy device 80x25 pid_max: default: 32768 minimum: 301 Mount-cache hash table entries: 2048 (order: 1, 8192 bytes, linear) Mountpoint-cache hash table entries: 2048 (order: 1, 8192 bytes, linear) devtmpfs: initialized random: get_random_u32 called from bucket_table_alloc.isra.27+0x64/0x188 with crng_init=0 clocksource: jiffies: mask: 0xffffffff max_cycles: 0xffffffff, max_idle_ns: 7645041785100000 ns futex hash table entries: 256 (order: -1, 3072 bytes, linear) NET: Registered protocol family 16 PCI: Probing PCI hardware PCI host bridge to bus 0000:00 pci_bus 0000:00: root bus resource [io 0x0000-0x7fffff] pci_bus 0000:00: root bus resource [mem 0x80000000-0x8fffffff] pci_bus 0000:00: root bus resource [bus 00-ff] pci_bus 0000:00: busn_res: [bus 00-ff] end is updated to ff pci 0000:00:0b.0: [106b:0020] type 00 class 0x060000 pci 0000:00:0c.0: [106b:0022] type 00 class 0xff0000 pci 0000:00:0c.0: reg 0x10: [mem 0x80000000-0x8007ffff] pci 0000:00:0d.0: [106b:003f] type 00 class 0x0c0310 pci 0000:00:0d.0: reg 0x10: [mem 0x80080000-0x800800ff] pci 0000:00:0e.0: [10ec:8029] type 00 class 0x020000 pci 0000:00:0e.0: reg 0x10: [io 0x1000-0x10ff] pci 0000:00:0e.0: reg 0x30: [mem 0x800c0000-0x800fffff pref] pci_bus 0000:00: busn_res: [bus 00-ff] end is updated to 00 pci_bus 0000:00: resource 4 [io 0x0000-0x7fffff] pci_bus 0000:00: resource 5 [mem 0x80000000-0x8fffffff] vgaarb: loaded SCSI subsystem initialized usbcore: registered new interface driver usbfs usbcore: registered new interface driver hub usbcore: registered new device driver usb clocksource: Switched to clocksource timebase NET: Registered protocol family 2 tcp_listen_portaddr_hash hash table entries: 512 (order: 0, 4096 bytes, linear) TCP established hash table entries: 8192 (order: 3, 32768 bytes, linear) TCP bind hash table entries: 8192 (order: 3, 32768 bytes, linear) TCP: Hash tables configured (established 8192 bind 8192) UDP hash table entries: 512 (order: 1, 8192 bytes, linear) UDP-Lite hash table entries: 512 (order: 1, 8192 bytes, linear) NET: Registered protocol family 1 RPC: Registered named UNIX socket transport module. RPC: Registered udp transport module. RPC: Registered tcp transport module. RPC: Registered tcp NFSv4.1 backchannel transport module. PCI: CLS 0 bytes, default 32 Trying to unpack rootfs image as initramfs... Freeing initrd memory: 1860K Initialise system trusted keyrings workingset: timestamp_bits=30 max_order=18 bucket_order=0 NFS: Registering the id_resolver key type Key type id_resolver registered Key type id_legacy registered Key type asymmetric registered Asymmetric key parser 'x509' registered bounce: pool size: 64 pages Block layer SCSI generic (bsg) driver version 0.4 loaded (major 253) io scheduler mq-deadline registered io scheduler kyber registered Non-volatile memory driver v1.3 brd: module loaded loop: module loaded MacIO PCI driver attached to Keylargo chipset Macintosh Cuda and Egret driver. mesh: configured for synchronous 5 MB/s st: Version 20160209, fixed bufsize 32768, s/g segs 256 Detected ADB keyboard, type ANSI. input: ADB keyboard as /devices/virtual/input/input0 random: fast init done input: ADB mouse as /devices/virtual/input/input1 pata-macio 0.00020000:ata-3: Activating pata-macio chipset KeyLargo ATA-3, Apple bus ID 0 scsi host0: pata_macio ata1: PATA max MWDMA2 irq 16 pata-macio 0.00021000:ata-3: Activating pata-macio chipset KeyLargo ATA-3, Apple bus ID 1 scsi host1: pata_macio ata2: PATA max MWDMA2 irq 18 pcnet32: pcnet32.c:v1.35 21.Apr.2008 tsbogend@alpha.franken.de PPP generic driver version 2.4.2 PPP Deflate Compression module registered ohci_hcd: USB 1.1 'Open' Host Controller (OHCI) Driver ohci-pci: OHCI PCI platform driver ohci-pci 0000:00:0d.0: OHCI PCI host controller ohci-pci 0000:00:0d.0: new USB bus registered, assigned bus number 1 ohci-pci 0000:00:0d.0: irq 28, io mem 0x80080000 hub 1-0:1.0: USB hub found hub 1-0:1.0: 3 ports detected usbcore: registered new interface driver appletouch rtc-generic rtc-generic: registered as rtc0 APM Battery Driver usbcore: registered new interface driver usbhid usbhid: USB HID core driver oprofile: using timer interrupt. Initializing XFRM netlink socket NET: Registered protocol family 17 NET: Registered protocol family 15 Key type dns_resolver registered drmem: No dynamic reconfiguration memory found Loading compiled-in X.509 certificates rtc-generic rtc-generic: setting system clock to 2020-02-07T07:46:01 UTC (1581061561) Warning: unable to open an initial console. ata2.00: ATAPI: QEMU DVD-ROM, 2.5+, max UDMA/100 scsi 1:0:0:0: CD-ROM QEMU QEMU DVD-ROM 2.5+ PQ: 0 ANSI: 5 sr 1:0:0:0: [sr0] scsi3-mmc drive: 4x/4x cd/rw xa/form2 tray cdrom: Uniform CD-ROM driver Revision: 3.20 sr 1:0:0:0: Attached scsi generic sg0 type 5 Freeing unused kernel memory: 268K This architecture does not have kernel memory protection. Run /init as init process Christophe
On 2/7/20 12:28 AM, Christophe Leroy wrote: > > > On 02/07/2020 06:13 AM, Christophe Leroy wrote: >> >> >> Le 06/02/2020 à 21:31, Guenter Roeck a écrit : >>> On Sat, Dec 21, 2019 at 08:32:38AM +0000, Christophe Leroy wrote: >>>> A few changes to retrieve DAR and DSISR from struct regs >>>> instead of retrieving them directly, as they may have >>>> changed due to a TLB miss. >>>> >>>> Also modifies hash_page() and friends to work with virtual >>>> data addresses instead of physical ones. Same on load_up_fpu() >>>> and load_up_altivec(). >>>> >>>> Signed-off-by: Christophe Leroy <christophe.leroy@c-s.fr> >>> >>> This patch results in qemu boot failures (mac99 with pmac32_defconfig). >>> Images fail silently; there is no console output. Reverting the patch >>> fixes the problem. Bisect log is attached below. >>> >>> Assuming this was tested on real hardware, am I correct to assume that qemu >>> for ppc32 (more specifically, qemu's mac99 and g3beige machines) no longer >>> works with the upstream kernel ? >> >> Before submitting the series, I successfully tested: >> - Real HW with powerpc 8xx >> - Real HW with powerpc 832x >> - Qemu's mac99 >> >> I'll re-check the upstream kernel. >> > > This is still working for me with the upstream kernel: > Interesting. What is your kernel configuration, your qemu version, and your qemu command line ? It works for me with CONFIG_VMAP_STACK=n, but not with pmac32_defconfig. Thanks, Guenter
On 02/07/2020 01:08 PM, Guenter Roeck wrote: > On 2/7/20 12:28 AM, Christophe Leroy wrote: >> >> >> On 02/07/2020 06:13 AM, Christophe Leroy wrote: >>> >>> >>> Le 06/02/2020 à 21:31, Guenter Roeck a écrit : >>>> On Sat, Dec 21, 2019 at 08:32:38AM +0000, Christophe Leroy wrote: >>>>> A few changes to retrieve DAR and DSISR from struct regs >>>>> instead of retrieving them directly, as they may have >>>>> changed due to a TLB miss. >>>>> >>>>> Also modifies hash_page() and friends to work with virtual >>>>> data addresses instead of physical ones. Same on load_up_fpu() >>>>> and load_up_altivec(). >>>>> >>>>> Signed-off-by: Christophe Leroy <christophe.leroy@c-s.fr> >>>> >>>> This patch results in qemu boot failures (mac99 with pmac32_defconfig). >>>> Images fail silently; there is no console output. Reverting the patch >>>> fixes the problem. Bisect log is attached below. >>>> >>>> Assuming this was tested on real hardware, am I correct to assume >>>> that qemu >>>> for ppc32 (more specifically, qemu's mac99 and g3beige machines) no >>>> longer >>>> works with the upstream kernel ? >>> >>> Before submitting the series, I successfully tested: >>> - Real HW with powerpc 8xx >>> - Real HW with powerpc 832x >>> - Qemu's mac99 >>> >>> I'll re-check the upstream kernel. >>> >> >> This is still working for me with the upstream kernel: >> > > Interesting. What is your kernel configuration, your qemu version, and > your qemu command line ? Config is pmac32_defconfig + CONFIG_DEVTMPFS (But kernel also boots without CONFIG_DEVTMPFS) QEMU emulator version 2.11.2 qemu-system-ppc -kernel vmlinux -M mac99 -initrd rootfs.cpio.gz -s -m 1024 Works with both GCC 5.5 and GCC 8.1 Christophe
On 2/7/20 5:29 AM, Christophe Leroy wrote: > > > On 02/07/2020 01:08 PM, Guenter Roeck wrote: >> On 2/7/20 12:28 AM, Christophe Leroy wrote: >>> >>> >>> On 02/07/2020 06:13 AM, Christophe Leroy wrote: >>>> >>>> >>>> Le 06/02/2020 à 21:31, Guenter Roeck a écrit : >>>>> On Sat, Dec 21, 2019 at 08:32:38AM +0000, Christophe Leroy wrote: >>>>>> A few changes to retrieve DAR and DSISR from struct regs >>>>>> instead of retrieving them directly, as they may have >>>>>> changed due to a TLB miss. >>>>>> >>>>>> Also modifies hash_page() and friends to work with virtual >>>>>> data addresses instead of physical ones. Same on load_up_fpu() >>>>>> and load_up_altivec(). >>>>>> >>>>>> Signed-off-by: Christophe Leroy <christophe.leroy@c-s.fr> >>>>> >>>>> This patch results in qemu boot failures (mac99 with pmac32_defconfig). >>>>> Images fail silently; there is no console output. Reverting the patch >>>>> fixes the problem. Bisect log is attached below. >>>>> >>>>> Assuming this was tested on real hardware, am I correct to assume that qemu >>>>> for ppc32 (more specifically, qemu's mac99 and g3beige machines) no longer >>>>> works with the upstream kernel ? >>>> >>>> Before submitting the series, I successfully tested: >>>> - Real HW with powerpc 8xx >>>> - Real HW with powerpc 832x >>>> - Qemu's mac99 >>>> >>>> I'll re-check the upstream kernel. >>>> >>> >>> This is still working for me with the upstream kernel: >>> >> >> Interesting. What is your kernel configuration, your qemu version, and >> your qemu command line ? > > Config is pmac32_defconfig + CONFIG_DEVTMPFS (But kernel also boots without CONFIG_DEVTMPFS) > > QEMU emulator version 2.11.2 > > qemu-system-ppc -kernel vmlinux -M mac99 -initrd rootfs.cpio.gz -s -m 1024 > > Works with both GCC 5.5 and GCC 8.1 > Actually, the problem is that I have locking selftest options enabled in my tests. Everything works if I disable those. The "culprit" seems to be CONFIG_PROVE_LOCKING. Can you retest with CONFIG_PROVE_LOCKING=y ? Thanks, Guenter
On 02/07/2020 01:44 PM, Guenter Roeck wrote: > On 2/7/20 5:29 AM, Christophe Leroy wrote: >> >> >> On 02/07/2020 01:08 PM, Guenter Roeck wrote: >>> On 2/7/20 12:28 AM, Christophe Leroy wrote: >>>> >>>> >>>> On 02/07/2020 06:13 AM, Christophe Leroy wrote: >>>>> >>>>> >>>>> Le 06/02/2020 à 21:31, Guenter Roeck a écrit : >>>>>> On Sat, Dec 21, 2019 at 08:32:38AM +0000, Christophe Leroy wrote: >>>>>>> A few changes to retrieve DAR and DSISR from struct regs >>>>>>> instead of retrieving them directly, as they may have >>>>>>> changed due to a TLB miss. >>>>>>> >>>>>>> Also modifies hash_page() and friends to work with virtual >>>>>>> data addresses instead of physical ones. Same on load_up_fpu() >>>>>>> and load_up_altivec(). >>>>>>> >>>>>>> Signed-off-by: Christophe Leroy <christophe.leroy@c-s.fr> >>>>>> >>>>>> This patch results in qemu boot failures (mac99 with >>>>>> pmac32_defconfig). >>>>>> Images fail silently; there is no console output. Reverting the patch >>>>>> fixes the problem. Bisect log is attached below. >>>>>> >>>>>> Assuming this was tested on real hardware, am I correct to assume >>>>>> that qemu >>>>>> for ppc32 (more specifically, qemu's mac99 and g3beige machines) >>>>>> no longer >>>>>> works with the upstream kernel ? >>>>> >>>>> Before submitting the series, I successfully tested: >>>>> - Real HW with powerpc 8xx >>>>> - Real HW with powerpc 832x >>>>> - Qemu's mac99 >>>>> >>>>> I'll re-check the upstream kernel. >>>>> >>>> >>>> This is still working for me with the upstream kernel: >>>> >>> >>> Interesting. What is your kernel configuration, your qemu version, and >>> your qemu command line ? >> >> Config is pmac32_defconfig + CONFIG_DEVTMPFS (But kernel also boots >> without CONFIG_DEVTMPFS) >> >> QEMU emulator version 2.11.2 >> >> qemu-system-ppc -kernel vmlinux -M mac99 -initrd rootfs.cpio.gz -s -m >> 1024 >> >> Works with both GCC 5.5 and GCC 8.1 >> > Actually, the problem is that I have locking selftest options enabled > in my tests. Everything works if I disable those. The "culprit" seems > to be CONFIG_PROVE_LOCKING. Can you retest with CONFIG_PROVE_LOCKING=y ? > With CONFIG_PROVE_LOCKING, I get a deadlock after: [...] Kernel virtual memory layout: * 0xffbcf000..0xfffff000 : fixmap * 0xff400000..0xff800000 : highmem PTEs * 0xfeb36000..0xff400000 : early ioremap * 0xf1000000..0xfeb36000 : vmalloc & ioremap SLUB: HWalign=32, Order=0-3, MinObjects=0, CPUs=1, Nodes=1 Running RCU self tests NR_IRQS: 512, nr_irqs: 512, preallocated irqs: 16 mpic: Resetting mpic: Setting up MPIC " MPIC 1 " version 1.2 at 80040000, max 1 CPUs mpic: ISU size: 64, shift: 6, mask: 3f mpic: Initializing for 64 sources GMT Delta read from XPRAM: 0 minutes, DST: on time_init: decrementer frequency = 100.000000 MHz time_init: processor frequency = 900.000000 MHz clocksource: timebase: mask: 0xffffffffffffffff max_cycles: 0x171024e7e0, max_idle_ns: 440795205315 ns clocksource: timebase mult[a000000] shift[24] registered clockevent: decrementer mult[1999999a] shift[32] cpu[0] Console: colour dummy device 80x25 Lock dependency validator: Copyright (c) 2006 Red Hat, Inc., Ingo Molnar Please test the patch I'll send out in a few minutes. Thanks Christophe
diff --git a/arch/powerpc/kernel/entry_32.S b/arch/powerpc/kernel/entry_32.S index 7e5a1722e4f2..3795654d15d1 100644 --- a/arch/powerpc/kernel/entry_32.S +++ b/arch/powerpc/kernel/entry_32.S @@ -1339,7 +1339,7 @@ _GLOBAL(enter_rtas) lis r6,1f@ha /* physical return address for rtas */ addi r6,r6,1f@l tophys(r6,r6) - tophys(r7,r1) + tophys_novmstack r7, r1 lwz r8,RTASENTRY(r4) lwz r4,RTASBASE(r4) mfmsr r9 diff --git a/arch/powerpc/kernel/fpu.S b/arch/powerpc/kernel/fpu.S index 0bb991ddd264..3235a8da6af7 100644 --- a/arch/powerpc/kernel/fpu.S +++ b/arch/powerpc/kernel/fpu.S @@ -94,6 +94,9 @@ END_FTR_SECTION_IFSET(CPU_FTR_VSX) /* enable use of FP after return */ #ifdef CONFIG_PPC32 mfspr r5,SPRN_SPRG_THREAD /* current task's THREAD (phys) */ +#ifdef CONFIG_VMAP_STACK + tovirt(r5, r5) +#endif lwz r4,THREAD_FPEXC_MODE(r5) ori r9,r9,MSR_FP /* enable FP for current */ or r9,r9,r4 diff --git a/arch/powerpc/kernel/head_32.S b/arch/powerpc/kernel/head_32.S index 90ef355e958b..3be041166db4 100644 --- a/arch/powerpc/kernel/head_32.S +++ b/arch/powerpc/kernel/head_32.S @@ -272,14 +272,20 @@ __secondary_hold_acknowledge: */ . = 0x200 DO_KVM 0x200 +MachineCheck: EXCEPTION_PROLOG_0 +#ifdef CONFIG_VMAP_STACK + li r11, MSR_KERNEL & ~(MSR_IR | MSR_RI) /* can take DTLB miss */ + mtmsr r11 +#endif #ifdef CONFIG_PPC_CHRP mfspr r11, SPRN_SPRG_THREAD + tovirt_vmstack(r11, r11) lwz r11, RTAS_SP(r11) cmpwi cr1, r11, 0 bne cr1, 7f #endif /* CONFIG_PPC_CHRP */ - EXCEPTION_PROLOG_1 + EXCEPTION_PROLOG_1 for_rtas=1 7: EXCEPTION_PROLOG_2 addi r3,r1,STACK_FRAME_OVERHEAD #ifdef CONFIG_PPC_CHRP @@ -294,7 +300,7 @@ __secondary_hold_acknowledge: . = 0x300 DO_KVM 0x300 DataAccess: - EXCEPTION_PROLOG + EXCEPTION_PROLOG handle_dar_dsisr=1 get_and_save_dar_dsisr_on_stack r4, r5, r11 BEGIN_MMU_FTR_SECTION #ifdef CONFIG_PPC_KUAP @@ -334,7 +340,7 @@ END_MMU_FTR_SECTION_IFSET(MMU_FTR_HPTE_TABLE) . = 0x600 DO_KVM 0x600 Alignment: - EXCEPTION_PROLOG + EXCEPTION_PROLOG handle_dar_dsisr=1 save_dar_dsisr_on_stack r4, r5, r11 addi r3,r1,STACK_FRAME_OVERHEAD EXC_XFER_STD(0x600, alignment_exception) @@ -645,6 +651,9 @@ handle_page_fault_tramp_1: handle_page_fault_tramp_2: EXC_XFER_LITE(0x300, handle_page_fault) +stack_overflow: + vmap_stack_overflow_exception + AltiVecUnavailable: EXCEPTION_PROLOG #ifdef CONFIG_ALTIVEC diff --git a/arch/powerpc/kernel/head_32.h b/arch/powerpc/kernel/head_32.h index 521cb50bc3c9..73a035b40dbf 100644 --- a/arch/powerpc/kernel/head_32.h +++ b/arch/powerpc/kernel/head_32.h @@ -38,10 +38,12 @@ andi. r11, r11, MSR_PR .endm -.macro EXCEPTION_PROLOG_1 +.macro EXCEPTION_PROLOG_1 for_rtas=0 #ifdef CONFIG_VMAP_STACK + .ifeq \for_rtas li r11, MSR_KERNEL & ~(MSR_IR | MSR_RI) /* can take DTLB miss */ mtmsr r11 + .endif subi r11, r1, INT_FRAME_SIZE /* use r1 if kernel */ #else tophys(r11,r1) /* use tophys(r1) if kernel */ diff --git a/arch/powerpc/kernel/vector.S b/arch/powerpc/kernel/vector.S index 8eb867dbad5f..25c14a0981bf 100644 --- a/arch/powerpc/kernel/vector.S +++ b/arch/powerpc/kernel/vector.S @@ -67,6 +67,9 @@ _GLOBAL(load_up_altivec) #ifdef CONFIG_PPC32 mfspr r5,SPRN_SPRG_THREAD /* current task's THREAD (phys) */ oris r9,r9,MSR_VEC@h +#ifdef CONFIG_VMAP_STACK + tovirt(r5, r5) +#endif #else ld r4,PACACURRENT(r13) addi r5,r4,THREAD /* Get THREAD */ diff --git a/arch/powerpc/mm/book3s32/hash_low.S b/arch/powerpc/mm/book3s32/hash_low.S index 8bbbd9775c8a..c11b0a005196 100644 --- a/arch/powerpc/mm/book3s32/hash_low.S +++ b/arch/powerpc/mm/book3s32/hash_low.S @@ -25,6 +25,12 @@ #include <asm/feature-fixups.h> #include <asm/code-patching-asm.h> +#ifdef CONFIG_VMAP_STACK +#define ADDR_OFFSET 0 +#else +#define ADDR_OFFSET PAGE_OFFSET +#endif + #ifdef CONFIG_SMP .section .bss .align 2 @@ -47,8 +53,8 @@ mmu_hash_lock: .text _GLOBAL(hash_page) #ifdef CONFIG_SMP - lis r8, (mmu_hash_lock - PAGE_OFFSET)@h - ori r8, r8, (mmu_hash_lock - PAGE_OFFSET)@l + lis r8, (mmu_hash_lock - ADDR_OFFSET)@h + ori r8, r8, (mmu_hash_lock - ADDR_OFFSET)@l lis r0,0x0fff b 10f 11: lwz r6,0(r8) @@ -66,9 +72,12 @@ _GLOBAL(hash_page) cmplw 0,r4,r0 ori r3,r3,_PAGE_USER|_PAGE_PRESENT /* test low addresses as user */ mfspr r5, SPRN_SPRG_PGDIR /* phys page-table root */ +#ifdef CONFIG_VMAP_STACK + tovirt(r5, r5) +#endif blt+ 112f /* assume user more likely */ - lis r5, (swapper_pg_dir - PAGE_OFFSET)@ha /* if kernel address, use */ - addi r5 ,r5 ,(swapper_pg_dir - PAGE_OFFSET)@l /* kernel page table */ + lis r5, (swapper_pg_dir - ADDR_OFFSET)@ha /* if kernel address, use */ + addi r5 ,r5 ,(swapper_pg_dir - ADDR_OFFSET)@l /* kernel page table */ rlwimi r3,r9,32-12,29,29 /* MSR_PR -> _PAGE_USER */ 112: #ifndef CONFIG_PTE_64BIT @@ -80,6 +89,9 @@ _GLOBAL(hash_page) lwzx r8,r8,r5 /* Get L1 entry */ rlwinm. r8,r8,0,0,20 /* extract pt base address */ #endif +#ifdef CONFIG_VMAP_STACK + tovirt(r8, r8) +#endif #ifdef CONFIG_SMP beq- hash_page_out /* return if no mapping */ #else @@ -137,9 +149,9 @@ retry: #ifdef CONFIG_SMP eieio - lis r8, (mmu_hash_lock - PAGE_OFFSET)@ha + lis r8, (mmu_hash_lock - ADDR_OFFSET)@ha li r0,0 - stw r0, (mmu_hash_lock - PAGE_OFFSET)@l(r8) + stw r0, (mmu_hash_lock - ADDR_OFFSET)@l(r8) #endif /* Return from the exception */ @@ -152,9 +164,9 @@ retry: #ifdef CONFIG_SMP hash_page_out: eieio - lis r8, (mmu_hash_lock - PAGE_OFFSET)@ha + lis r8, (mmu_hash_lock - ADDR_OFFSET)@ha li r0,0 - stw r0, (mmu_hash_lock - PAGE_OFFSET)@l(r8) + stw r0, (mmu_hash_lock - ADDR_OFFSET)@l(r8) blr #endif /* CONFIG_SMP */ @@ -329,7 +341,7 @@ END_FTR_SECTION_IFCLR(CPU_FTR_NEED_COHERENT) patch_site 1f, patch__hash_page_A1 patch_site 2f, patch__hash_page_A2 /* Get the address of the primary PTE group in the hash table (r3) */ -0: lis r0, (Hash_base - PAGE_OFFSET)@h /* base address of hash table */ +0: lis r0, (Hash_base - ADDR_OFFSET)@h /* base address of hash table */ 1: rlwimi r0,r3,LG_PTEG_SIZE,HASH_LEFT,HASH_RIGHT /* VSID -> hash */ 2: rlwinm r3,r4,20+LG_PTEG_SIZE,HASH_LEFT,HASH_RIGHT /* PI -> hash */ xor r3,r3,r0 /* make primary hash */ @@ -343,10 +355,10 @@ END_FTR_SECTION_IFCLR(CPU_FTR_NEED_COHERENT) beq+ 10f /* no PTE: go look for an empty slot */ tlbie r4 - lis r4, (htab_hash_searches - PAGE_OFFSET)@ha - lwz r6, (htab_hash_searches - PAGE_OFFSET)@l(r4) + lis r4, (htab_hash_searches - ADDR_OFFSET)@ha + lwz r6, (htab_hash_searches - ADDR_OFFSET)@l(r4) addi r6,r6,1 /* count how many searches we do */ - stw r6, (htab_hash_searches - PAGE_OFFSET)@l(r4) + stw r6, (htab_hash_searches - ADDR_OFFSET)@l(r4) /* Search the primary PTEG for a PTE whose 1st (d)word matches r5 */ mtctr r0 @@ -378,10 +390,10 @@ END_FTR_SECTION_IFCLR(CPU_FTR_NEED_COHERENT) beq+ found_empty /* update counter of times that the primary PTEG is full */ - lis r4, (primary_pteg_full - PAGE_OFFSET)@ha - lwz r6, (primary_pteg_full - PAGE_OFFSET)@l(r4) + lis r4, (primary_pteg_full - ADDR_OFFSET)@ha + lwz r6, (primary_pteg_full - ADDR_OFFSET)@l(r4) addi r6,r6,1 - stw r6, (primary_pteg_full - PAGE_OFFSET)@l(r4) + stw r6, (primary_pteg_full - ADDR_OFFSET)@l(r4) patch_site 0f, patch__hash_page_C /* Search the secondary PTEG for an empty slot */ @@ -415,8 +427,8 @@ END_FTR_SECTION_IFCLR(CPU_FTR_NEED_COHERENT) * lockup here but that shouldn't happen */ -1: lis r4, (next_slot - PAGE_OFFSET)@ha /* get next evict slot */ - lwz r6, (next_slot - PAGE_OFFSET)@l(r4) +1: lis r4, (next_slot - ADDR_OFFSET)@ha /* get next evict slot */ + lwz r6, (next_slot - ADDR_OFFSET)@l(r4) addi r6,r6,HPTE_SIZE /* search for candidate */ andi. r6,r6,7*HPTE_SIZE stw r6,next_slot@l(r4) diff --git a/arch/powerpc/mm/book3s32/mmu.c b/arch/powerpc/mm/book3s32/mmu.c index 69b2419accef..0a1c65a2c565 100644 --- a/arch/powerpc/mm/book3s32/mmu.c +++ b/arch/powerpc/mm/book3s32/mmu.c @@ -413,6 +413,7 @@ void __init MMU_init_hw(void) void __init MMU_init_hw_patch(void) { unsigned int hmask = Hash_mask >> (16 - LG_HPTEG_SIZE); + unsigned int hash; if (ppc_md.progress) ppc_md.progress("hash:patch", 0x345); @@ -424,8 +425,12 @@ void __init MMU_init_hw_patch(void) /* * Patch up the instructions in hashtable.S:create_hpte */ - modify_instruction_site(&patch__hash_page_A0, 0xffff, - ((unsigned int)Hash - PAGE_OFFSET) >> 16); + if (IS_ENABLED(CONFIG_VMAP_STACK)) + hash = (unsigned int)Hash; + else + hash = (unsigned int)Hash - PAGE_OFFSET; + + modify_instruction_site(&patch__hash_page_A0, 0xffff, hash >> 16); modify_instruction_site(&patch__hash_page_A1, 0x7c0, hash_mb << 6); modify_instruction_site(&patch__hash_page_A2, 0x7c0, hash_mb2 << 6); modify_instruction_site(&patch__hash_page_B, 0xffff, hmask); diff --git a/arch/powerpc/platforms/Kconfig.cputype b/arch/powerpc/platforms/Kconfig.cputype index 000dd297337c..e90bbb7f74b6 100644 --- a/arch/powerpc/platforms/Kconfig.cputype +++ b/arch/powerpc/platforms/Kconfig.cputype @@ -31,12 +31,14 @@ config PPC_BOOK3S_6xx select PPC_HAVE_PMU_SUPPORT select PPC_HAVE_KUEP select PPC_HAVE_KUAP + select HAVE_ARCH_VMAP_STACK config PPC_BOOK3S_601 bool "PowerPC 601" select PPC_BOOK3S_32 select PPC_FPU select PPC_HAVE_KUAP + select HAVE_ARCH_VMAP_STACK config PPC_85xx bool "Freescale 85xx"
A few changes to retrieve DAR and DSISR from struct regs instead of retrieving them directly, as they may have changed due to a TLB miss. Also modifies hash_page() and friends to work with virtual data addresses instead of physical ones. Same on load_up_fpu() and load_up_altivec(). Signed-off-by: Christophe Leroy <christophe.leroy@c-s.fr> --- arch/powerpc/kernel/entry_32.S | 2 +- arch/powerpc/kernel/fpu.S | 3 +++ arch/powerpc/kernel/head_32.S | 15 ++++++++--- arch/powerpc/kernel/head_32.h | 4 ++- arch/powerpc/kernel/vector.S | 3 +++ arch/powerpc/mm/book3s32/hash_low.S | 46 +++++++++++++++++++++------------- arch/powerpc/mm/book3s32/mmu.c | 9 +++++-- arch/powerpc/platforms/Kconfig.cputype | 2 ++ 8 files changed, 60 insertions(+), 24 deletions(-)