arm/183740: mutex on some arm hardware requires dcache enabled
Ganbold Tsagaankhuu
ganbold at gmail.com
Thu Nov 7 07:20:02 UTC 2013
The following reply was made to PR arm/183740; it has been noted by GNATS.
From: Ganbold Tsagaankhuu <ganbold at gmail.com>
To: John Wehle <john at feith.com>
Cc: freebsd-gnats-submit at freebsd.org
Subject: Re: arm/183740: mutex on some arm hardware requires dcache enabled
Date: Thu, 7 Nov 2013 15:17:23 +0800
--001a11c1feb69c14b604ea910ed6
Content-Type: text/plain; charset=ISO-8859-1
John,
On Thu, Nov 7, 2013 at 3:07 PM, John Wehle <john at feith.com> wrote:
>
> >Number: 183740
> >Category: arm
> >Synopsis: mutex on some arm hardware requires dcache enabled
> >Confidential: no
> >Severity: non-critical
> >Priority: low
> >Responsible: freebsd-arm
> >State: open
> >Quarter:
> >Keywords:
> >Date-Required:
> >Class: sw-bug
> >Submitter-Id: current-users
> >Arrival-Date: Thu Nov 07 07:10:00 UTC 2013
> >Closed-Date:
> >Last-Modified:
> >Originator: John Wehle
> >Release: FreeBSD svn 257205
> >Organization:
> Personal
> >Environment:
> Not Yet
> >Description:
> In my spare time I'm working on bringing FreeBSD up on amlogic based
> arm processors. While working through various bootstrap issues I got
> to the point where initarm calls pmap_bootstrap only to have it splat.
>
> What happens is pmap_bootstrap calls pmap_extract which does
> PMAP_LOCK(pmap).
> This trys to acquire a mutex which invokes atomics that use ldrex / strex.
>
> The ARM documentation at:
>
>
> http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ddi0464d/CHDIBJGE.html
>
> notes that the L1 memory system has an internal exclusive monitor which
> handles ldrex / strex accesses.
>
> The README at:
>
> https://github.com/dwelch67/raspberrypi/tree/master/extest
>
> has a nice write up which explains some of the wrinkles regarding hardware
> and ldrex / strex.
>
> The attached patch enables the dcache and suffices to get me through
> initarm into mi_startup (I'm not to a console login yet ... however
> I'm significantly further along).
>
> -- John
>
> >How-To-Repeat:
>
> >Fix:
> Enable the dcache prior to using a mutex.
>
> Patch attached with submission follows:
>
> --- sys/arm/arm/machdep.c.ORIGINAL 2013-10-27 01:15:39.000000000 -0400
> +++ sys/arm/arm/machdep.c 2013-11-07 01:43:01.000000000 -0500
> @@ -1481,6 +1483,12 @@ initarm(struct arm_boot_params *abp)
> */
> cpu_idcache_wbinv_all();
>
> + /*
> + * Atomics invoked by mutex use ldrex / strex which on some
> + * hardware requires the L1 cache.
> + */
> + cpu_control(CPU_CONTROL_DC_ENABLE, CPU_CONTROL_DC_ENABLE);
> +
> /* Set stack for exception handlers */
> data_abort_handler_address = (u_int)data_abort_handler;
> prefetch_abort_handler_address = (u_int)prefetch_abort_handler;
>
>
What kind of Amlogic board you are working on? That could be interesting.
As for the patch can you try to put it in initarm_late_init() of your board
machdep code and try?
I meant like in /usr/src/sys/arm/rockchip/rk30xx_machdep.c
Please let us know.
thanks,
Ganbold
>
> >Release-Note:
> >Audit-Trail:
> >Unformatted:
> _______________________________________________
> freebsd-arm at freebsd.org mailing list
> http://lists.freebsd.org/mailman/listinfo/freebsd-arm
> To unsubscribe, send any mail to "freebsd-arm-unsubscribe at freebsd.org"
>
--001a11c1feb69c14b604ea910ed6
Content-Type: text/html; charset=ISO-8859-1
Content-Transfer-Encoding: quoted-printable
<div dir=3D"ltr">John,<div class=3D"gmail_extra"><br><br><div class=3D"gmai=
l_quote">On Thu, Nov 7, 2013 at 3:07 PM, John Wehle <span dir=3D"ltr"><<=
a href=3D"mailto:john at feith.com" target=3D"_blank">john at feith.com</a>></=
span> wrote:<br>
<blockquote class=3D"gmail_quote" style=3D"margin:0 0 0 .8ex;border-left:1p=
x #ccc solid;padding-left:1ex"><br>
>Number: =A0 =A0 =A0 =A0 183740<br>
>Category: =A0 =A0 =A0 arm<br>
>Synopsis: =A0 =A0 =A0 mutex on some arm hardware requires dcache enable=
d<br>
>Confidential: =A0 no<br>
>Severity: =A0 =A0 =A0 non-critical<br>
>Priority: =A0 =A0 =A0 low<br>
>Responsible: =A0 =A0freebsd-arm<br>
>State: =A0 =A0 =A0 =A0 =A0open<br>
>Quarter:<br>
>Keywords:<br>
>Date-Required:<br>
>Class: =A0 =A0 =A0 =A0 =A0sw-bug<br>
>Submitter-Id: =A0 current-users<br>
>Arrival-Date: =A0 Thu Nov 07 07:10:00 UTC 2013<br>
>Closed-Date:<br>
>Last-Modified:<br>
>Originator: =A0 =A0 John Wehle<br>
>Release: =A0 =A0 =A0 =A0FreeBSD svn 257205<br>
>Organization:<br>
Personal<br>
>Environment:<br>
Not Yet<br>
>Description:<br>
In my spare time I'm working on bringing FreeBSD up on amlogic based<br=
>
arm processors. =A0While working through various bootstrap issues I got<br>
to the point where initarm calls pmap_bootstrap only to have it splat.<br>
<br>
What happens is pmap_bootstrap calls pmap_extract which does PMAP_LOCK(pmap=
).<br>
This trys to acquire a mutex which invokes atomics that use ldrex / strex.<=
br>
<br>
The ARM documentation at:<br>
<br>
=A0 <a href=3D"http://infocenter.arm.com/help/index.jsp?topic=3D/com.arm.do=
c.ddi0464d/CHDIBJGE.html" target=3D"_blank">http://infocenter.arm.com/help/=
index.jsp?topic=3D/com.arm.doc.ddi0464d/CHDIBJGE.html</a><br>
<br>
notes that the L1 memory system has an internal exclusive monitor which<br>
handles ldrex / strex accesses.<br>
<br>
The README at:<br>
<br>
=A0 <a href=3D"https://github.com/dwelch67/raspberrypi/tree/master/extest" =
target=3D"_blank">https://github.com/dwelch67/raspberrypi/tree/master/extes=
t</a><br>
<br>
has a nice write up which explains some of the wrinkles regarding hardware<=
br>
and ldrex / strex.<br>
<br>
The attached patch enables the dcache and suffices to get me through<br>
initarm into mi_startup (I'm not to a console login yet ... however<br>
I'm significantly further along).<br>
<br>
-- John<br>
<br>
>How-To-Repeat:<br>
<br>
>Fix:<br>
Enable the dcache prior to using a mutex.<br>
<br>
Patch attached with submission follows:<br>
<br>
--- sys/arm/arm/machdep.c.ORIGINAL =A0 =A0 =A02013-10-27 01:15:39.000000000=
-0400<br>
+++ sys/arm/arm/machdep.c =A0 =A0 =A0 2013-11-07 01:43:01.000000000 -0500<b=
r>
@@ -1481,6 +1483,12 @@ initarm(struct arm_boot_params *abp)<br>
=A0 =A0 =A0 =A0 =A0*/<br>
=A0 =A0 =A0 =A0 cpu_idcache_wbinv_all();<br>
<br>
+ =A0 =A0 =A0 /*<br>
+ =A0 =A0 =A0 =A0* Atomics invoked by mutex use ldrex / strex which on some=
<br>
+ =A0 =A0 =A0 =A0* hardware requires the L1 cache.<br>
+ =A0 =A0 =A0 =A0*/<br>
+ =A0 =A0 =A0 cpu_control(CPU_CONTROL_DC_ENABLE, CPU_CONTROL_DC_ENABLE);<br=
>
+<br>
=A0 =A0 =A0 =A0 /* Set stack for exception handlers */<br>
=A0 =A0 =A0 =A0 data_abort_handler_address =3D (u_int)data_abort_handler;<b=
r>
=A0 =A0 =A0 =A0 prefetch_abort_handler_address =3D (u_int)prefetch_abort_ha=
ndler;<br>
<br></blockquote><div><br></div><div>What kind of Amlogic board you are wor=
king on? That could be interesting.</div><div><br></div><div>As for the pat=
ch can you try to put it in initarm_late_init() of your board machdep code =
and try?</div>
<div>I meant like in /usr/src/sys/arm/rockchip/rk30xx_machdep.c</div><div>P=
lease let us know.</div><div><br></div><div>thanks,</div><div><br></div><di=
v>Ganbold</div><div><br></div><div>=A0</div><blockquote class=3D"gmail_quot=
e" style=3D"margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<br>
>Release-Note:<br>
>Audit-Trail:<br>
>Unformatted:<br>
_______________________________________________<br>
<a href=3D"mailto:freebsd-arm at freebsd.org">freebsd-arm at freebsd.org</a> mail=
ing list<br>
<a href=3D"http://lists.freebsd.org/mailman/listinfo/freebsd-arm" target=3D=
"_blank">http://lists.freebsd.org/mailman/listinfo/freebsd-arm</a><br>
To unsubscribe, send any mail to "<a href=3D"mailto:freebsd-arm-unsubs=
cribe at freebsd.org">freebsd-arm-unsubscribe at freebsd.org</a>"<br>
</blockquote></div><br></div></div>
--001a11c1feb69c14b604ea910ed6--
More information about the freebsd-arm
mailing list