Re: boot2 -- Round 2

From: Alexander Kabaev (kan_at_freebsd.org)
Date: 07/31/04

  • Next message: Matthew Dillon: "Re: boot2 -- Round 2"
    Date: Sat, 31 Jul 2004 00:27:13 +0000
    To: freebsd-current@freebsd.org
    
    

    On Fri, Jul 30, 2004 at 02:28:43PM -0700, Jeremy Chadwick wrote:
    > So, in regards to the commited fix:
    >
    > This seemed to fix the issue on one of my boxes (the one which was
    > flat-out panic'ing, not the one which was reporting 0:ad(0,`) as the
    > default slice to load /boot/loader from). I'll refer to the one which
    > panic'd as "Box A" while the one which is doing the backtick as "Box B".
    >
    > After pulling cvs down last night and rebuilding world+kernel+boot
    > blocks, running disklabel -B ad0s1, all on Box B, I found the machine
    > once again spitting out "Invalid partition", trying to load loader(8)
    > off of 0:ad(0,`) instead of 0:ad(0,a). I double-checked boot2/Makefile
    > to see if -fno-unit-at-a-time was in place -- and it was.
    >
    > I've tried using /boot/boot off of Box A and applying it to Box B using
    > disklabel -B -b /boot/box_b/boot ad0s1 to no avail.
    >
    > It seems almost as if the boot2 code is broken in such a way that it
    > resembles an "off-by-one" error (ASCII 0x60 == `, ASCII 0x61 == a).
    > Why it's picking ` is beyond me...
    >
    > Can someone shed some light as to how I can go about debugging this,
    > as well as mention how I can temporarily work around this? Box B
    > happens to run mysqld, and is suffering from some issues mentioned on
    > freebsd-threads (re: machine randomly hard-locking), so it definitely
    > needs to be able to boot back up on it's own without my intervention.
    >
    > Thanks!
    Hi,

    I guess I would like to get your /boot/boot. The one I got simply works
    on all boxes in my home :(.

    As another option, you can try an alternative patch which was proposed
    by Tim Robbins. Since the problem was apparently caused by me going back to
    static memcpy implementation, I am currenly working on using builtin
    memcpy as it was used before. I will post it later after I've done some
    more testing and if things will look good.

    --
    Alexander Kabaev
    ======== Begin quote ==============
    After a few hours of head-scratching, I've tracked down the problem with
    boot2 and -funit-at-a-time, and come up with a patch that makes it work:
    ==== //depot/user/tjr/freebsd-tjr/src/sys/boot/i386/boot2/boot2.c#7 - /home/tim/p4/src/sys/boot/i386/boot2/boot2.c ====
    @@ -139,7 +139,16 @@
     static int xgetc(int);
     static int getc(int);
     
    -static void memcpy(void *, const void *, int);
    +/*
    + * GCC 3.4 with -funit-at-a-time (implied by -Os) may use a non-standard
    + * calling convention for static functions, using registers to pass arguments
    + * instead of the stack. However, GCC may emit calls to memcpy() when a
    + * program copies a struct with the assignment operator, and the code it
    + * emits to call memcpy() uses the standard convention, not the register
    + * convention. This means we must declare our memcpy() implementation "__used"
    + * to disable the register calling convention.
    + */
    +static void memcpy(void *, const void *, int) __used;
     static void
     memcpy(void *dst, const void *src, int len)
     {
    I think this is a bug in GCC; it should emit a warning if it's about to emit
    code to call memcpy(), but finds that memcpy() has a prototype that conflicts
    with the assumptions it makes.
    Tim
    _______________________________________________
    freebsd-current@freebsd.org mailing list
    http://lists.freebsd.org/mailman/listinfo/freebsd-current
    To unsubscribe, send any mail to "freebsd-current-unsubscribe@freebsd.org"
    

  • Next message: Matthew Dillon: "Re: boot2 -- Round 2"

    Relevant Pages

    • Re: boot2 -- Round 2
      ... peek at my DFly box... ... > memcpy as it was used before. ... > + * to disable the register calling convention. ... > I think this is a bug in GCC; it should emit a warning if it's about to emit ...
      (freebsd-current)
    • Re: Results of the memswap() smackdown from the thread "Sorting" assignment
      ... will try this out for its speed footprint when I have the time. ... The memcpy function ... void *memcpy(void * restrict s1, ... const void * restrict s2, ...
      (comp.programming)
    • Re: main function address
      ... `const void *', the type `memcpy' expects for the second argument. ... Martin ... Debian, a variant of the GNU operating system. ...
      (comp.lang.c)
    • Re: void * in ANSC
      ... the behaviour if the fields overlap. ... They have restrict applied, so ... The memcpy function ... const void * restrict s2, ...
      (comp.lang.c)
    • [PATCH] ecryptfs: Use unaligned byteswapping helpers
      ... Rather than memcpy and cpu_to_be16/32. ... Please read the FAQ at http://www.tux.org/lkml/ ...
      (Linux-Kernel)