Re2: Manual installation on 3ware 9500 sata controller wont boot
Matthew Dillon
dillon at apollo.backplane.com
Sat Jul 24 13:11:46 PDT 2004
Oops, I forgot to zero out %eax in the last patch. Here's a new one.
Told ya it's experiemental! :-)
DR is testing.
-Matt
Index: bootasm.h
===================================================================
RCS file: /cvs/src/sys/boot/i386/bootasm.h,v
retrieving revision 1.3
diff -u -r1.3 bootasm.h
--- bootasm.h 19 Jul 2004 23:30:29 -0000 1.3
+++ bootasm.h 24 Jul 2004 18:56:57 -0000
@@ -70,6 +70,12 @@
#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: bootasmdef.c
===================================================================
RCS file: /cvs/src/sys/boot/i386/bootasmdef.c,v
retrieving revision 1.1
diff -u -r1.1 bootasmdef.c
--- bootasmdef.c 19 Jul 2004 23:30:29 -0000 1.1
+++ bootasmdef.c 24 Jul 2004 18:52:38 -0000
@@ -44,7 +44,7 @@
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 @@
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: boot2/Makefile
===================================================================
RCS file: /cvs/src/sys/boot/i386/boot2/Makefile,v
retrieving revision 1.9
diff -u -r1.9 Makefile
--- boot2/Makefile 19 Jul 2004 23:30:32 -0000 1.9
+++ boot2/Makefile 24 Jul 2004 18:52:08 -0000
@@ -40,7 +40,7 @@
# 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: boot2/boot1.S
===================================================================
RCS file: /cvs/src/sys/boot/i386/boot2/boot1.S,v
retrieving revision 1.7
diff -u -r1.7 boot1.S
--- boot2/boot1.S 19 Jul 2004 23:30:32 -0000 1.7
+++ boot2/boot1.S 24 Jul 2004 19:22:04 -0000
@@ -216,19 +216,33 @@
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: boot2/boot2.c
===================================================================
RCS file: /cvs/src/sys/boot/i386/boot2/boot2.c,v
retrieving revision 1.12
diff -u -r1.12 boot2.c
--- boot2/boot2.c 19 Jul 2004 23:30:32 -0000 1.12
+++ boot2/boot2.c 24 Jul 2004 20:09:40 -0000
@@ -110,6 +110,8 @@
#define NOPT 12
+#define INVALID_S "Bad %s\n"
+
extern uint32_t _end;
static const char optstr[NOPT] = { "VhaCgmnPprsv" };
@@ -191,7 +193,7 @@
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 @@
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 @@
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 @@
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 @@
}
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: btx/lib/btxcsu.S
===================================================================
RCS file: /cvs/src/sys/boot/i386/btx/lib/btxcsu.S,v
retrieving revision 1.5
diff -u -r1.5 btxcsu.S
--- btx/lib/btxcsu.S 19 Jul 2004 23:30:35 -0000 1.5
+++ btx/lib/btxcsu.S 24 Jul 2004 20:07:49 -0000
@@ -26,12 +26,20 @@
* 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
More information about the Bugs
mailing list