Boot1 tries to clear boot2's BSS. It makes several assumptions that are
authorMatthew Dillon <dillon@dragonflybsd.org>
Tue, 27 Jul 2004 19:37:19 +0000 (19:37 +0000)
committerMatthew Dillon <dillon@dragonflybsd.org>
Tue, 27 Jul 2004 19:37:19 +0000 (19:37 +0000)
incorrect (or incorrect now), and doesn't really know how much BSS to clear
anyway.  Remove the BSS clearing code from boot1 and add BSS clearing code
to the boot2 (in particular, /usr/src/sys/boot/i386/btx/lib/btxcsu.S).

This should solve numerous issues including boot2 getting confused about
the default boot device file path.

Collapse some boot2 code to make it fit again.

Move the BOOT2 virtual origin (relative to the BTX client address space)
into bootasm.h, replace an undocumented hardwired BOOT2 origin calculation
(that was SIZ_PAG*2) with BOOT2_VORIGIN.   Replace the hardwired ORG2
constant in boot2's Makefile with code to pull BOOT2_VORIGIN out of the
header file.

12 files changed:
sys/boot/i386/boot2/Makefile
sys/boot/i386/boot2/boot1.S
sys/boot/i386/boot2/boot2.c
sys/boot/i386/bootasm.h
sys/boot/i386/bootasmdef.c
sys/boot/i386/btx/lib/btxcsu.S
sys/boot/pc32/boot2/Makefile
sys/boot/pc32/boot2/boot1.S
sys/boot/pc32/boot2/boot2.c
sys/boot/pc32/bootasm.h
sys/boot/pc32/bootasmdef.c
sys/boot/pc32/btx/lib/btxcsu.S

index cb27cc7..12d6d4c 100644 (file)
@@ -1,5 +1,5 @@
 # $FreeBSD: src/sys/boot/i386/boot2/Makefile,v 1.47 2003/06/26 03:51:57 peter Exp $
-# $DragonFly: src/sys/boot/i386/boot2/Attic/Makefile,v 1.9 2004/07/19 23:30:32 dillon Exp $
+# $DragonFly: src/sys/boot/i386/boot2/Attic/Makefile,v 1.10 2004/07/27 19:37:17 dillon Exp $
 
 PROG=          boot2
 NOMAN=
@@ -40,7 +40,7 @@ ORG1D = `${.OBJDIR}/bootasmdef.nx -d MEM_BIOS_LADDR`
 # the start of the BTX *USER* address space, not the start of physical 
 # memory.
 #
-ORG2=  0x2000
+ORG2=  `${.OBJDIR}/bootasmdef.nx BOOT2_VORIGIN`
 
 # Decide Level of UFS support.  UFS1_AND_UFS2 doesn't fit.
 
index 735c74c..deac778 100644 (file)
@@ -45,7 +45,7 @@
  * purpose.
  *
  * $FreeBSD: src/sys/boot/i386/boot2/boot1.s,v 1.23 2003/08/22 01:59:28 imp Exp $
- * $DragonFly: src/sys/boot/i386/boot2/Attic/boot1.S,v 1.7 2004/07/19 23:30:32 dillon Exp $
+ * $DragonFly: src/sys/boot/i386/boot2/Attic/boot1.S,v 1.8 2004/07/27 19:37:17 dillon Exp $
  */
 
 #include "../bootasm.h"
@@ -216,19 +216,33 @@ main.4:   xor %dx,%dx                     // Partition:drive
 main.5:        pushw %dx                       // Save args
                movb $NSECT,%dh                 // Sector count
                callw nread                     // Read disk
-               mov $MEM_BTX_ORG,%bx            // BTX
-               mov 0xa(%bx),%si                // Get BTX length and set
-               add %bx,%si                     //  %si to start of boot2.bin
-               mov $MEM_BTX_USR+SIZ_PAG*2,%di  // Client page 2
-               mov $MEM_BTX_ORG+(NSECT-1)*SIZ_SEC,%cx // Size of client data
-               sub %si,%cx                     //  count
-               rep                             // Relocate
-               movsb                           //  client
+               mov $MEM_BTX_ORG,%bx            // Base of BTX header
+               mov 0xa(%bx),%si                // Get BTX text length (btx.S)
+               add %bx,%si                     // %si = start of boot2.bin
+                                               // %di = relocation target
+               mov $MEM_BTX_USR+BOOT2_VORIGIN,%di 
+               mov $MEM_BTX_ORG+(NSECT-1)*SIZ_SEC,%cx
+               sub %si,%cx                     // %cx = Size of boot2 client
+               rep                             // Relocate boot2
+               movsb
                popw MEM_BTX_USR_ARG            // save (disk,slice) for boot2
-               sub %di,%cx                     // count = 0x[1]0000 - DSTPTR
-               xorb %al,%al                    // Zero assumed bss from
-               rep                             //  the end of boot2.bin
-               stosb                           //  up to 0x10000
+
+#if 0
+               // XXX DISABLED.  This makes incorrect assumptions about
+               // where BSS begins, potentially leaving garbage in the BSS
+               // space.  The BSS zeroing code has been moved to
+               // btx/lib/btxcsu.S (BTX client startup code) where we have
+               // more definitive knowledge about where BSS resides.
+               //
+               // %cx now contains 0.  Calculate 0x[1]0000 - %di to get a
+               // count of assumed BSS bytes from the end of boot2.bin up
+               // to 0x10000, then zero it out.
+               //
+               sub %di,%cx
+               xorb %al,%al
+               rep
+               stosb
+#endif
                callw seta20                    // Enable A20
 
                // YYY
index c093b69..e753dbf 100644 (file)
@@ -45,7 +45,7 @@
  * purpose.
  *
  * $FreeBSD: src/sys/boot/i386/boot2/boot2.c,v 1.64 2003/08/25 23:28:31 obrien Exp $
- * $DragonFly: src/sys/boot/i386/boot2/Attic/boot2.c,v 1.12 2004/07/19 23:30:32 dillon Exp $
+ * $DragonFly: src/sys/boot/i386/boot2/Attic/boot2.c,v 1.13 2004/07/27 19:37:17 dillon Exp $
  */
 #include <sys/param.h>
 #include <sys/disklabel.h>
 
 #define NOPT           12
 
+#define INVALID_S      "Bad %s\n"
+
 extern uint32_t _end;
 
 static const char optstr[NOPT] = { "VhaCgmnPprsv" };
@@ -191,7 +193,7 @@ static int
 xfsread(ino_t inode, void *buf, size_t nbyte)
 {
     if ((size_t)fsread(inode, buf, nbyte) != nbyte) {
-       printf("Invalid %s\n", "format");
+       printf(INVALID_S, "format");
        return -1;
     }
     return 0;
@@ -355,7 +357,7 @@ load(void)
     else if (IS_ELF(hdr.eh))
        fmt = 1;
     else {
-       printf("Invalid %s\n", "format");
+       printf(INVALID_S, "format");
        return;
     }
     if (fmt == 0) {
@@ -541,7 +543,7 @@ dskread(void *buf, unsigned lba, unsigned nblk)
            if (sl != COMPATIBILITY_SLICE)
                dp += sl - BASE_SLICE;
            if (dp->dp_typ != DOSPTYP_386BSD) {
-               printf("Invalid %s\n", "slice");
+               printf(INVALID_S, "slice");
                return -1;
            }
            dsk.start = dp->dp_start;
@@ -551,7 +553,7 @@ dskread(void *buf, unsigned lba, unsigned nblk)
        d = (void *)(sec + LABELOFFSET);
        if (d->d_magic != DISKMAGIC || d->d_magic2 != DISKMAGIC) {
            if (dsk.part != RAW_PART) {
-               printf("Invalid %s\n", "label");
+               printf(INVALID_S, "label");
                return -1;
            }
        } else {
@@ -562,7 +564,7 @@ dskread(void *buf, unsigned lba, unsigned nblk)
            }
            if (dsk.part >= d->d_npartitions ||
                !d->d_partitions[dsk.part].p_size) {
-               printf("Invalid %s\n", "partition");
+               printf(INVALID_S, "partition");
                return -1;
            }
            dsk.start += d->d_partitions[dsk.part].p_offset;
index 4eb956d..d8d2b21 100644 (file)
@@ -31,7 +31,7 @@
  * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  *
- * $DragonFly: src/sys/boot/i386/Attic/bootasm.h,v 1.3 2004/07/19 23:30:29 dillon Exp $
+ * $DragonFly: src/sys/boot/i386/Attic/bootasm.h,v 1.4 2004/07/27 19:37:15 dillon Exp $
  */
 
 /* 
 /* -------- WARNING, BOOT0 STACK BELOW MEM_BIOS_LADDR -------- */
 #define MEM_BIOS_LADDR 0x7c00          /* Load address (static/BIOS) */
 
+/*
+ * This is the origin of boot2.bin relative to the BTX user address space
+ * (e.g. physical address would be MEM_BTX_USR+BOOT2_VORIGIN).
+ */
+#define BOOT2_VORIGIN  0x2000
+
 /*
  * NOTE: BOOT0_ORIGIN is extracted from this file and used in boot0/Makefile
  *      BOOT1_ORIGIN is extracted from this file and used in boot2/Makefile
index 20a240f..5ea6a82 100644 (file)
@@ -31,7 +31,7 @@
  * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  *
- * $DragonFly: src/sys/boot/i386/Attic/bootasmdef.c,v 1.1 2004/07/19 23:30:29 dillon Exp $
+ * $DragonFly: src/sys/boot/i386/Attic/bootasmdef.c,v 1.2 2004/07/27 19:37:15 dillon Exp $
  */
 
 #include <stdio.h>
@@ -44,7 +44,7 @@ static
 void
 usage(const char *arg0, int code)
 {
-    fprintf(stderr, "%s {BOOT0_ORIGIN,BOOT1_ORIGIN,MEM_BIOS_LADDR}\n", arg0);
+    fprintf(stderr, "%s {BOOT0_ORIGIN,BOOT1_ORIGIN,MEM_BIOS_LADDR,BOOT2_VORIGIN}\n", arg0);
     exit(code);
 }
 
@@ -72,6 +72,8 @@ main(int ac, char **av)
        printf(fmt, BOOT1_ORIGIN);
     } else if (strcmp(var, "MEM_BIOS_LADDR") == 0) {
        printf(fmt, MEM_BIOS_LADDR);
+    } else if (strcmp(var, "BOOT2_VORIGIN") == 0) {
+       printf(fmt, BOOT2_VORIGIN);
     } else {
        usage(av[0], 1);
     }
index 49c2e94..8b169d2 100644 (file)
@@ -13,7 +13,7 @@
  * purpose.
  *
  * $FreeBSD: src/sys/boot/i386/btx/lib/btxcsu.s,v 1.3 1999/08/28 00:40:07 peter Exp $
- * $DragonFly: src/sys/boot/i386/btx/lib/Attic/btxcsu.S,v 1.5 2004/07/19 23:30:35 dillon Exp $
+ * $DragonFly: src/sys/boot/i386/btx/lib/Attic/btxcsu.S,v 1.6 2004/07/27 19:37:19 dillon Exp $
  */
 
 /*
                 * Globals.
                 */
                .global _start
+               .extern _edata, _end
 
                /*
                 * Client entry point.
                 */
-_start:        movl %eax,__base                # Set base address
-                                               # for Virt->Phys conversions
+_start: 
+               pushl %eax                      # Save base address
+               movl $_edata,%edi               # Clear BSS
+               movl $_end,%ecx
+               subl %edi,%ecx
+               subl %eax,%eax
+               rep
+               stosb
+               popl __base                     # Set base address
                movl %esp,%eax                  # Get base of arguments
                addl $USR_ARGSPACE-USR_ARGOFFSET,%eax
                movl %eax,__args
index 35bff54..8253d20 100644 (file)
@@ -1,5 +1,5 @@
 # $FreeBSD: src/sys/boot/i386/boot2/Makefile,v 1.47 2003/06/26 03:51:57 peter Exp $
-# $DragonFly: src/sys/boot/pc32/boot2/Makefile,v 1.9 2004/07/19 23:30:32 dillon Exp $
+# $DragonFly: src/sys/boot/pc32/boot2/Makefile,v 1.10 2004/07/27 19:37:17 dillon Exp $
 
 PROG=          boot2
 NOMAN=
@@ -40,7 +40,7 @@ ORG1D = `${.OBJDIR}/bootasmdef.nx -d MEM_BIOS_LADDR`
 # the start of the BTX *USER* address space, not the start of physical 
 # memory.
 #
-ORG2=  0x2000
+ORG2=  `${.OBJDIR}/bootasmdef.nx BOOT2_VORIGIN`
 
 # Decide Level of UFS support.  UFS1_AND_UFS2 doesn't fit.
 
index 1808756..72d6af1 100644 (file)
@@ -45,7 +45,7 @@
  * purpose.
  *
  * $FreeBSD: src/sys/boot/i386/boot2/boot1.s,v 1.23 2003/08/22 01:59:28 imp Exp $
- * $DragonFly: src/sys/boot/pc32/boot2/boot1.S,v 1.7 2004/07/19 23:30:32 dillon Exp $
+ * $DragonFly: src/sys/boot/pc32/boot2/boot1.S,v 1.8 2004/07/27 19:37:17 dillon Exp $
  */
 
 #include "../bootasm.h"
@@ -216,19 +216,33 @@ main.4:   xor %dx,%dx                     // Partition:drive
 main.5:        pushw %dx                       // Save args
                movb $NSECT,%dh                 // Sector count
                callw nread                     // Read disk
-               mov $MEM_BTX_ORG,%bx            // BTX
-               mov 0xa(%bx),%si                // Get BTX length and set
-               add %bx,%si                     //  %si to start of boot2.bin
-               mov $MEM_BTX_USR+SIZ_PAG*2,%di  // Client page 2
-               mov $MEM_BTX_ORG+(NSECT-1)*SIZ_SEC,%cx // Size of client data
-               sub %si,%cx                     //  count
-               rep                             // Relocate
-               movsb                           //  client
+               mov $MEM_BTX_ORG,%bx            // Base of BTX header
+               mov 0xa(%bx),%si                // Get BTX text length (btx.S)
+               add %bx,%si                     // %si = start of boot2.bin
+                                               // %di = relocation target
+               mov $MEM_BTX_USR+BOOT2_VORIGIN,%di 
+               mov $MEM_BTX_ORG+(NSECT-1)*SIZ_SEC,%cx
+               sub %si,%cx                     // %cx = Size of boot2 client
+               rep                             // Relocate boot2
+               movsb
                popw MEM_BTX_USR_ARG            // save (disk,slice) for boot2
-               sub %di,%cx                     // count = 0x[1]0000 - DSTPTR
-               xorb %al,%al                    // Zero assumed bss from
-               rep                             //  the end of boot2.bin
-               stosb                           //  up to 0x10000
+
+#if 0
+               // XXX DISABLED.  This makes incorrect assumptions about
+               // where BSS begins, potentially leaving garbage in the BSS
+               // space.  The BSS zeroing code has been moved to
+               // btx/lib/btxcsu.S (BTX client startup code) where we have
+               // more definitive knowledge about where BSS resides.
+               //
+               // %cx now contains 0.  Calculate 0x[1]0000 - %di to get a
+               // count of assumed BSS bytes from the end of boot2.bin up
+               // to 0x10000, then zero it out.
+               //
+               sub %di,%cx
+               xorb %al,%al
+               rep
+               stosb
+#endif
                callw seta20                    // Enable A20
 
                // YYY
index 189a53a..de46281 100644 (file)
@@ -45,7 +45,7 @@
  * purpose.
  *
  * $FreeBSD: src/sys/boot/i386/boot2/boot2.c,v 1.64 2003/08/25 23:28:31 obrien Exp $
- * $DragonFly: src/sys/boot/pc32/boot2/boot2.c,v 1.12 2004/07/19 23:30:32 dillon Exp $
+ * $DragonFly: src/sys/boot/pc32/boot2/boot2.c,v 1.13 2004/07/27 19:37:17 dillon Exp $
  */
 #include <sys/param.h>
 #include <sys/disklabel.h>
 
 #define NOPT           12
 
+#define INVALID_S      "Bad %s\n"
+
 extern uint32_t _end;
 
 static const char optstr[NOPT] = { "VhaCgmnPprsv" };
@@ -191,7 +193,7 @@ static int
 xfsread(ino_t inode, void *buf, size_t nbyte)
 {
     if ((size_t)fsread(inode, buf, nbyte) != nbyte) {
-       printf("Invalid %s\n", "format");
+       printf(INVALID_S, "format");
        return -1;
     }
     return 0;
@@ -355,7 +357,7 @@ load(void)
     else if (IS_ELF(hdr.eh))
        fmt = 1;
     else {
-       printf("Invalid %s\n", "format");
+       printf(INVALID_S, "format");
        return;
     }
     if (fmt == 0) {
@@ -541,7 +543,7 @@ dskread(void *buf, unsigned lba, unsigned nblk)
            if (sl != COMPATIBILITY_SLICE)
                dp += sl - BASE_SLICE;
            if (dp->dp_typ != DOSPTYP_386BSD) {
-               printf("Invalid %s\n", "slice");
+               printf(INVALID_S, "slice");
                return -1;
            }
            dsk.start = dp->dp_start;
@@ -551,7 +553,7 @@ dskread(void *buf, unsigned lba, unsigned nblk)
        d = (void *)(sec + LABELOFFSET);
        if (d->d_magic != DISKMAGIC || d->d_magic2 != DISKMAGIC) {
            if (dsk.part != RAW_PART) {
-               printf("Invalid %s\n", "label");
+               printf(INVALID_S, "label");
                return -1;
            }
        } else {
@@ -562,7 +564,7 @@ dskread(void *buf, unsigned lba, unsigned nblk)
            }
            if (dsk.part >= d->d_npartitions ||
                !d->d_partitions[dsk.part].p_size) {
-               printf("Invalid %s\n", "partition");
+               printf(INVALID_S, "partition");
                return -1;
            }
            dsk.start += d->d_partitions[dsk.part].p_offset;
index bfb2f9a..5c5364f 100644 (file)
@@ -31,7 +31,7 @@
  * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  *
- * $DragonFly: src/sys/boot/pc32/bootasm.h,v 1.3 2004/07/19 23:30:29 dillon Exp $
+ * $DragonFly: src/sys/boot/pc32/bootasm.h,v 1.4 2004/07/27 19:37:15 dillon Exp $
  */
 
 /* 
 /* -------- WARNING, BOOT0 STACK BELOW MEM_BIOS_LADDR -------- */
 #define MEM_BIOS_LADDR 0x7c00          /* Load address (static/BIOS) */
 
+/*
+ * This is the origin of boot2.bin relative to the BTX user address space
+ * (e.g. physical address would be MEM_BTX_USR+BOOT2_VORIGIN).
+ */
+#define BOOT2_VORIGIN  0x2000
+
 /*
  * NOTE: BOOT0_ORIGIN is extracted from this file and used in boot0/Makefile
  *      BOOT1_ORIGIN is extracted from this file and used in boot2/Makefile
index 0554aa3..bdde993 100644 (file)
@@ -31,7 +31,7 @@
  * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  *
- * $DragonFly: src/sys/boot/pc32/bootasmdef.c,v 1.1 2004/07/19 23:30:29 dillon Exp $
+ * $DragonFly: src/sys/boot/pc32/bootasmdef.c,v 1.2 2004/07/27 19:37:15 dillon Exp $
  */
 
 #include <stdio.h>
@@ -44,7 +44,7 @@ static
 void
 usage(const char *arg0, int code)
 {
-    fprintf(stderr, "%s {BOOT0_ORIGIN,BOOT1_ORIGIN,MEM_BIOS_LADDR}\n", arg0);
+    fprintf(stderr, "%s {BOOT0_ORIGIN,BOOT1_ORIGIN,MEM_BIOS_LADDR,BOOT2_VORIGIN}\n", arg0);
     exit(code);
 }
 
@@ -72,6 +72,8 @@ main(int ac, char **av)
        printf(fmt, BOOT1_ORIGIN);
     } else if (strcmp(var, "MEM_BIOS_LADDR") == 0) {
        printf(fmt, MEM_BIOS_LADDR);
+    } else if (strcmp(var, "BOOT2_VORIGIN") == 0) {
+       printf(fmt, BOOT2_VORIGIN);
     } else {
        usage(av[0], 1);
     }
index e6a7018..ca11b63 100644 (file)
@@ -13,7 +13,7 @@
  * purpose.
  *
  * $FreeBSD: src/sys/boot/i386/btx/lib/btxcsu.s,v 1.3 1999/08/28 00:40:07 peter Exp $
- * $DragonFly: src/sys/boot/pc32/btx/lib/btxcsu.S,v 1.5 2004/07/19 23:30:35 dillon Exp $
+ * $DragonFly: src/sys/boot/pc32/btx/lib/btxcsu.S,v 1.6 2004/07/27 19:37:19 dillon Exp $
  */
 
 /*
                 * Globals.
                 */
                .global _start
+               .extern _edata, _end
 
                /*
                 * Client entry point.
                 */
-_start:        movl %eax,__base                # Set base address
-                                               # for Virt->Phys conversions
+_start: 
+               pushl %eax                      # Save base address
+               movl $_edata,%edi               # Clear BSS
+               movl $_end,%ecx
+               subl %edi,%ecx
+               subl %eax,%eax
+               rep
+               stosb
+               popl __base                     # Set base address
                movl %esp,%eax                  # Get base of arguments
                addl $USR_ARGSPACE-USR_ARGOFFSET,%eax
                movl %eax,__args