Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 13 Feb 2020 16:23:44 +0100
From:      Ralf Wenk <iz-rpi03@hs-karlsruhe.de>
To:        Kyle Evans <kevans@freebsd.org>
Cc:        Andrew Turner <andrew@freebsd.org>, Oleksandr Tymoshenko <gonzo@freebsd.org>, freebsd-arm <freebsd-arm@freebsd.org>, Emmanuel Vadot <manu@freebsd.org>
Subject:   Re: A investigative hack that makes (for example) head -r356529 boot  and operate normally an RPi4B (finally!): protect all armstub8-gic.bin's loaded content from replacement by the kernel
Message-ID:  <E1j2GLA-000N0i-EO@iz-wera-new.HS-Karlsruhe.DE>
In-Reply-To: <E1j2G3j-000Mzo-Dw@iz-wera-new.HS-Karlsruhe.DE>
References:  <7E7605DC-021D-448A-8459-8EC26BA9836D.ref@yahoo.com>  <7E7605DC-021D-448A-8459-8EC26BA9836D@yahoo.com> <E1j2EmR-000Mwm-ID@iz-wera-new.HS-Karlsruhe.DE> <CACNAnaHVYeuoK=4f7XzokpAVjcqd6ovD58-0LdP_vPGjiXQgdw@mail.gmail.com> <E1j2FRX-000MyR-1O@iz-wera-new.HS-Karlsruhe.DE> <E1j2G3j-000Mzo-Dw@iz-wera-new.HS-Karlsruhe.DE>

next in thread | previous in thread | raw e-mail | index | archive | help
On 2020-02-13 at 16:05 +0100 Ralf Wenk wrote:
> On 2020-02-13 at 15:26 +0100 Ralf Wenk wrote:
> > On 2020-02-13 at 7:49 -0600 Kyle Evans wrote:
> > > On Thu, Feb 13, 2020 at 7:43 AM Ralf Wenk <iz-rpi03@hs-karlsruhe.de> wrote:
> > > >
> > > > On 2020-02-12 at 18:00 -0800 Mark Millard wrote via freebsd-arm:
> > > > > [...]
> > > > >
> > > > > # svnlite diff /usr/src/sys/dev/fdt/fdt_common.c
> > > > > Index: /usr/src/sys/dev/fdt/fdt_common.c
> > > > > ===================================================================
> > > > > --- /usr/src/sys/dev/fdt/fdt_common.c (revision 357529)
> > > > > +++ /usr/src/sys/dev/fdt/fdt_common.c (working copy)
> > > > > @@ -485,7 +485,18 @@
> > > > >
> > > > >       tuples = res_len / tuple_size;
> > > > >       reservep = (pcell_t *)&reserve;
> > > > > +#ifdef __aarch64__
> > > > > +     //HACK!!!
> > > > > +     // Reserve the first few pages, for example to
> > > > > +     // preserve armstub8-gic.bin or armstub.bin
> > > > > +     // content.
> > > > > +     mr[0].mr_start= 0;
> > > > > +     mr[0].mr_size= 2*4096;
> > > > > +     tuples++;
> > > > > +     for (i = 1; i < tuples; i++) {
> > > > > +#else
> > > > >       for (i = 0; i < tuples; i++) {
> > > > > +#endif
> > > > >
> > > > >               rv = fdt_data_to_res(reservep, addr_cells, size_cells,
> > > > >                       (u_long *)&mr[i].mr_start, (u_long *)&mr[i].mr_size);
> > > > > @@ -512,6 +523,11 @@
> > > > >
> > > > >       root = OF_finddevice("/reserved-memory");
> > > > >       if (root == -1) {
> > > > > +             // Fail over to checking for and handling memreserve,
> > > > > +             // such as for a RPi4B.
> > > > > +             if (0 == fdt_get_reserved_regions(reserved,mreserved))
> > > > > +                     return (0);
> > > > > +
> > > > >               return (ENXIO);
> > > > >       }
> > > > >
> > > >
> > > > I can confirm that with your patch(es) my RPi3 does not freeze any more
> > > > when loading mac_ntpd.ko. The patches are applied against r357853M.
> 
> An reboot is working again too.
> 
> > > Have you tested the RPi3 with just this second hunk of patch to
> > > fallover to memreserve, or is the first hunk definitely required as
> > > well?
> > 
> > Good question. I tested both hunks together.
> > Will try what happens when just applying the second and report back.
> 
> Here it is:
> Without the first hunk the system freezes again when loading mac_ntpd.ko.
> [...]

And after a couple of minutes the kernel panics with the known
"possible deadlock" message.

panic: deadlres_td_on_lock: possible deadlock detected for
 0xffff000052753560, blocked for 902372 ticks

cpuid = 0
time = 925
KDB: stack backtrace:
db_trace_self() at db_trace_self_wrapper+0x28
         pc = 0xffff00000074f0cc  lr = 0xffff000000106b6c
         sp = 0xffff00005214b580  fp = 0xffff00005214b790

db_trace_self_wrapper() at vpanic+0x194
         pc = 0xffff000000106b6c  lr = 0xffff00000040de90
         sp = 0xffff00005214b7a0  fp = 0xffff00005214b850

vpanic() at panic+0x44
         pc = 0xffff00000040de90  lr = 0xffff00000040dc38
         sp = 0xffff00005214b860  fp = 0xffff00005214b8e0

panic() at deadlkres+0x2dc
         pc = 0xffff00000040dc38  lr = 0xffff0000003a60a0
         sp = 0xffff00005214b8f0  fp = 0xffff00005214b940

deadlkres() at fork_exit+0x7c
         pc = 0xffff0000003a60a0  lr = 0xffff0000003cb658
         sp = 0xffff00005214b950  fp = 0xffff00005214b980

fork_exit() at fork_trampoline+0x10
         pc = 0xffff0000003cb658  lr = 0xffff00000076c514
         sp = 0xffff00005214b990  fp = 0x0000000000000000

KDB: enter: panic
[ thread pid 0 tid 100083 ]
Stopped at      0
db> 


Ralf




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?E1j2GLA-000N0i-EO>