[prev in list] [next in list] [prev in thread] [next in thread]
List: openbsd-tech
Subject: Re: psci function id register on arm64
From: Mark Kettenis <mark.kettenis () xs4all ! nl>
Date: 2018-01-28 11:36:22
Message-ID: 58dc25c047bba101 () bloch ! sibelius ! xs4all ! nl
[Download RAW message or body]
> Date: Sun, 28 Jan 2018 14:35:52 +1100
> From: Jonathan Gray <jsg@jsg.id.au>
>
> semarie reported problems with running arm64 on qemu which turned
> out to be triggered by the psci version call.
>
> [ using 979488 bytes of bsd ELF symbol table ]
> Copyright (c) 1982, 1986, 1989, 1991, 1993
> The Regents of the University of California. All rights reserved.
> Copyright (c) 1995-2018 OpenBSD. All rights reserved. https://www.OpenBSD.org
>
> OpenBSD 6.2-current (GENERIC) #160: Wed Jan 24 18:26:59 MST 2018
> deraadt@arm64.openbsd.org:/usr/src/sys/arch/arm64/compile/GENERIC
> real mem = 2105647104 (2008MB)
> avail mem = 2017124352 (1923MB)
> mainbus0 at root: unknown model
> cpu0 at mainbus0: ARM Cortex-A57 r1p0
> efi0 at mainbus0: UEFI 2.0.5
> efi0: Das U-Boot rev 0x0
> psci0 at mainbus0Stopped at psci_attach+0xf4:
> ddb> tr
> hvc_call() at psci_attach+0xf0
> psci_attach() at mainbus_attach_node+0x244
> mainbus_attach_node() at mainbus_attach+0x1ec
> mainbus_attach() at config_attach+0x214
> config_attach() at config_rootfound+0xc0
> config_rootfound() at cpu_configure+0x34
> cpu_configure() at main+0x348
> main() at $x.2+0x70
> ddb> sh reg
> x0 0xffffffff84000000
> x1 0
> x2 0
> x3 0
> x4 0xffffff80008bf258 initstack+0x4a68
> x5 0x1323
> x6 0x861e4d1cb67f8248
> x7 0x861e4d1cb67f8248
> x8 0xffffff8000571978 hvc_call
> x9 0x84000008
> x10 0x84000009
> x11 0
> x12 0
> x13 0
> x14 0xffffff80073ad744 _end+0x6a5ac0c
> x15 0xffffff8000671f20 ap_bits_user
> x16 0xb64c1a07
> x17 0xef56e85d
> x18 0xffffff80008bf200 initstack+0x4a10
> x19 0xffffff80073ac200 _end+0x6a596c8
> x20 0xffffff80008bf310 initstack+0x4b20
> x21 0xffffff8000800000 $d.5
> x22 0
> x23 0xffffff80073ac224 _end+0x6a596ec
> x24 0xffffff8000813388 psci_cd
> x25 0xffffff8000813360 psci_ca
> x26 0xffffff8000950000 gf_log+0x1bc
> x27 0x4085f000
> x28 0x40200000
> x29 0xffffff80008bf2b0 initstack+0x4ac0
> x30 0
> sp 0xffffff80008bf200 initstack+0x4a10
> spsr 0x600003c5
> elr 0xffffff8000571978 hvc_call
> lr 0xffffff8000254d08 psci_attach+0xf4
> psci_attach+0xf4:
>
> Though it seems other calls had trouble before that, likely since the
> psci changes made in december.
>
> Attempting to power down...
> Stopped at boot+0xd4:
> ddb> tr
> hvc_call() at boot+0xd0
> boot() at sys_reboot+0x2c
> reboot() at svc_handler+0x1bc
> svc_handler() at do_el0_sync+0xbc
> do_el0_sync() at handle_el0_sync+0x68
> handle_el0_sync() at 0x4ca7b07a4
> --- trap ---
> ddb> sh reg
> x0 0xffffffff84000008
> x1 0
> x2 0
> x3 0
> x4 0xffffff8000277918 hvc_call
> x5 0
> x6 0x33781a588ce87b4c
> x7 0x33781a588ce87b4c
> x8 0xffffff80072f7200 _end+0x69a49d8
> x9 0x25bf00aba3ce1b98
> x10 0x16707157c
> x11 0x64
> x12 0x1dcd662 __ALIGN_SIZE+0x1bcd662
> x13 0xc
> x14 0xffffff8007235184 _end+0x68e295c
> x15 0
> x16 0
> x17 0x10
> x18 0xffffff8018b00d90
> x19 0x1008
> x20 0xffffff8000805000 nv2tov_type+0x8
> x21 0x37
> x22 0x37
> x23 0xffffff8018b00f00
> x24 0xffffff8000800000 $d.5
> x25 0xffffff8000856360 sysent
> x26 0x37
> x27 0xffffff80008566d2 sysent+0x372
> x28 0x1
> x29 0xffffff8018b00da0
> x30 0x4f49c4fa00000000
> sp 0xffffff8018b00d90
> spsr 0x600003c5
> elr 0xffffff8000277918 hvc_call
> lr 0xffffff80002433f0 boot+0xd4
> boot+0xd4:
>
> qemu-system-aarch64 doesn't recognise the psci call when the high 32 bits
> of x0 are not zero. The PSCI implemented by the ATF in the
> overdrive 1000 only looks at the low 32 bits. And all the function ids
> we use set bit 31. Bit 30 is used to indicate smc64/hvc64 calling
> convention. The smc calling convention specification states that up to
> six registers are used, but nothing we call needs that many yet.
>
> Tested on overdrive 1000, and 32/64 bit qemu -M virt.
Hmm, the spec defines the function numbers as uint32. So using
uint32_t would make more sense.
ok kettenis@ with that change.
> Index: psci.c
> ===================================================================
> RCS file: /cvs/src/sys/dev/fdt/psci.c,v
> retrieving revision 1.4
> diff -u -p -r1.4 psci.c
> --- psci.c 17 Jan 2018 10:17:33 -0000 1.4
> +++ psci.c 28 Jan 2018 02:46:10 -0000
> @@ -45,10 +45,10 @@ struct psci_softc {
> struct device sc_dev;
> register_t (*sc_callfn)(register_t, register_t, register_t,
> register_t);
> - int sc_psci_version;
> - int sc_system_off;
> - int sc_system_reset;
> - int sc_cpu_on;
> + register_t sc_psci_version;
> + register_t sc_system_off;
> + register_t sc_system_reset;
> + register_t sc_cpu_on;
> };
>
> struct psci_softc *psci_sc;
>
>
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic