Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 1 Apr 2001 15:12:07 -0700 (PDT)
From:      "Bruce R. Montague" <brucem@mail.cruzio.com>
To:        freebsd-hardware@freebsd.org, freebsd-small@freebsd.org
Subject:   movsl generic_bcopy hang using NSC GX Geode CPU
Message-ID:  <200104012212.f31MC7u00385@mail.cruzio.com>

next in thread | raw e-mail | index | archive | help


System hangs on "rep movsl" in "generic_bcopy()" in
"i386/i386/support.s" using NSC Geode (586) CPU.

Not sure exactly what list is most appropriate,
"hardware" and "small" seemed best.


 Using: 

OS:  custom picoBSD (not one of the standard PICOBSD
conf files) built on latest 4.3 RC cvsupped as of this 
weekend (end of March 2001). Problem has been completely
solid over last month using 4.3 Beta, don't know about
earlier versions.


Hardware: NatSemi Geode GX 8.1 CPU (300 Mhz) on a
National Semiconductor Centaurus "reference/development"
motherboard (aka a Geode SP4GX00). PicoBSD must be
built with a "cpu I586_CPU" option to run on this
board.

Problem: Pressing backspace (or delete, or cntrl-H)
on the console with even number of text characters
on the display line hangs the CPU. System/network
otherwise runs fine. Backspace when using telnet
into the system always works fine. Problem has
never been reproduced under any other circumstances
except console backspace with even number of cmd-line
(or display-line) chars.

The machine hangs on the "rep movsl" instruction in
"generic_bcopy"  (called via "bcopy_toio()" in
syscons code "sc_vtb_copy()/scvtb.c" to scroll screen
image). The code-block _will_ work if the equivalent
"rep movsb" code is used instead of a movsl, _OR_
the unmodified "rep movsl" can be made to work if
an immediately prior byte-wise scan has been made
of the movsl source/dest buffers (just a for-loop
*p++ before the "bcopy_toio()".

The code path is routinely used w/o problems; when
the "backspace-on-odd" problem occurs the input
arguments appear `normal' although I have not
attempted to check related buffer alloc/memory
mapping...  both the "from" and "to" addresses are
often word (not longword) aligned, apparently without
ill effect (the CR0 Alignment Check bit is set on
in "locore.s" at system init and stays on).

On an ASUS Pentium III motherboard this problem does
not occur with the "same" picoBSD system (identical
except built with cpu "I686_CPU").

I have not been able to detect any machine/interrupt
activity after this instruction, but I am only using
a post-code board (don't have a logic analyzer or
ICE).


This all suggests a mid--rep-instruction fault-failure
scenario...?  But... any additional advice, hints,
directions, configs I've probably missed, etc., most
welcome. I'm just going to live with the work-around
for just know instead of chase it all the way down,
maybe later...



 Work-around Fix:

In routine "ENTRY(generic_bcopy)" in "i386/i386/support.s"
remove the movsl longword copy optimization and just
let the "rep movsb" do it all:

-------------------------------
--- old_support.s       Sun Apr  1 14:19:07 2001
+++ support.s   Sun Apr  1 14:54:45 2001
@@ -450,12 +450,14 @@
        cmpl    %ecx,%eax                       /* overlapping && src < dst? */
        jb      1f
 
+#if 0
        shrl    $2,%ecx                         /* copy by 32-bit words */
        cld                                     /* nope, copy forwards */
        rep
        movsl
        movl    20(%esp),%ecx
        andl    $3,%ecx                         /* any bytes left? */
+#endif
        rep
        movsb
        popl    %edi

 

-------------------------------

 Advice, insight, and help most appreciated!

 - bruce








To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-small" in the body of the message




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200104012212.f31MC7u00385>