From owner-p4-projects@FreeBSD.ORG Mon Aug 21 23:57:15 2006 Return-Path: X-Original-To: p4-projects@freebsd.org Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id 34A7516A4E2; Mon, 21 Aug 2006 23:57:15 +0000 (UTC) X-Original-To: perforce@freebsd.org Delivered-To: perforce@freebsd.org Received: from mx1.FreeBSD.org (mx1.freebsd.org [216.136.204.125]) by hub.freebsd.org (Postfix) with ESMTP id 1200D16A4DD for ; Mon, 21 Aug 2006 23:57:15 +0000 (UTC) (envelope-from imp@freebsd.org) Received: from repoman.freebsd.org (repoman.freebsd.org [216.136.204.115]) by mx1.FreeBSD.org (Postfix) with ESMTP id B6F9643D45 for ; Mon, 21 Aug 2006 23:57:14 +0000 (GMT) (envelope-from imp@freebsd.org) Received: from repoman.freebsd.org (localhost [127.0.0.1]) by repoman.freebsd.org (8.13.6/8.13.6) with ESMTP id k7LNvETg061784 for ; Mon, 21 Aug 2006 23:57:14 GMT (envelope-from imp@freebsd.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.13.6/8.13.4/Submit) id k7LNvEwK061781 for perforce@freebsd.org; Mon, 21 Aug 2006 23:57:14 GMT (envelope-from imp@freebsd.org) Date: Mon, 21 Aug 2006 23:57:14 GMT Message-Id: <200608212357.k7LNvEwK061781@repoman.freebsd.org> X-Authentication-Warning: repoman.freebsd.org: perforce set sender to imp@freebsd.org using -f From: Warner Losh To: Perforce Change Reviews Cc: Subject: PERFORCE change 104740 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 21 Aug 2006 23:57:15 -0000 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); }