Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 21 Aug 2006 23:57:14 GMT
From:      Warner Losh <imp@FreeBSD.org>
To:        Perforce Change Reviews <perforce@freebsd.org>
Subject:   PERFORCE change 104740 for review
Message-ID:  <200608212357.k7LNvEwK061781@repoman.freebsd.org>

next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=104740

Change 104740 by imp@imp_lighthouse on 2006/08/21 23:57:05

	Restore missing bits from x86 boot2.
	We can now read a kernel, it seems, at least up through offset
	0x20fe00, or 2,162,176 (which should be more than enough to load
	a 1MB kernel...)

Affected files ...

.. //depot/projects/arm/src/sys/boot/arm/at91/boot2/boot2.c#8 edit

Differences ...

==== //depot/projects/arm/src/sys/boot/arm/at91/boot2/boot2.c#8 (text+ko) ====

@@ -102,10 +102,11 @@
 
 unsigned char mac[6] = { 0x42, 0x53, 0x44, 0, 0, 1 };
 
-int dsk_start;
+unsigned dsk_start;
 static char cmd[512];
 static char kname[1024];
 static uint32_t opts;
+static int dsk_meta;
 //static int comspeed = SIOSPD;
 
 static void load(void);
@@ -138,7 +139,7 @@
 xfsread(ino_t inode, void *buf, size_t nbyte)
 {
     if ((size_t)fsread(inode, buf, nbyte) != nbyte) {
-	printf("Invalid %s\r\n", "format");
+	printf("Invalid %s\r\n", "sector");
 	return -1;
     }
     return 0;
@@ -250,7 +251,7 @@
     if (xfsread(ino, &eh, sizeof(eh)))
 	return;
     if (!IS_ELF(eh)) {
-	printf("Invalid format\r\n");
+	printf("Invalid %s\r\n", "format");
 	return;
     }
     fs_off = eh.e_phoff;
@@ -325,7 +326,7 @@
     struct dos_partition *dp;
     struct disklabel *d;
     char *sec;
-    unsigned sl;
+    int i;
 
     if (!dsk_meta) {
 	sec = dmadat->secbuf;
@@ -333,12 +334,29 @@
 	if (drvread(sec, DOSBBSECTOR, 1))
 	    return -1;
 	dp = (void *)(sec + DOSPARTOFF);
-	sl = 1;
+	for (i = 0; i < NDOSPART; i++) {
+	    if (dp[i].dp_typ == DOSPTYP_386BSD)
+		    break;
+	}
+	if (i == NDOSPART) {
+		printf("No BSD partition found\r\n");
+		return -1;
+	}
+	memcpy(&dsk_start, &dp[i].dp_start, 4);
 	if (drvread(sec, dsk_start + LABELSECTOR, 1))
 		return -1;
 	d = (void *)(sec + LABELOFFSET);
+	if (d->d_magic != DISKMAGIC || d->d_magic2 != DISKMAGIC) {
+		printf("Invalid %s\r\n", "label");
+		return -1;
+	}
+	if (!d->d_partitions[0].p_size) {
+		printf("Invalid %s\r\n", "partition");
+		return -1;
+	}
 	dsk_start += d->d_partitions[0].p_offset;
 	dsk_start -= d->d_partitions[RAW_PART].p_offset;
+	dsk_meta++;
     }
     return drvread(buf, dsk_start + lba, nblk);
 }



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