From: "Artem 'Zazoobr' Ignatjev" <[EMAIL PROTECTED]> Date: Sun, 21 Jul 2002 18:06:24 +0400
On Sun, Jul 21, 2002 at 02:09:52AM -0400, Brad Laue wrote: >> I'm currently trying to make FreeBSD boot from extended >> partitions (of course, with help of boot mgr - in my case that's WinNT >> loader), and not without any progress: After patching /boot/loader to >> understand EXT_X partition type, I'm able to boot from /dev/ad4s9. > > I'd be very interested in seeing your progress on this, and I think > Simon 'corecode' Schultz would be as well - looking forward to it! > Attach it to your reply. Well, I don't think that all subcribers of this list wants to see this staff, and don't know whether majordomo allows attaches in this list. I will email it to you, and if anyone else is interested in this work, I'd put it here: http://memphis.mephi.ru/~timon/ Sinceherely yours, Artem 'Zazoobr' Ignatjev. In case you're wondering why you can't boot from /dev/ad4s10 and above, take a look at the attached patch for vfs_conf.c. I also included my version of a patch to fix the problems with extended partitions in /boot/loader. I didn't look too closely at your code, but my patch arranges things such that the slice numbers used by /boot/loader match the slice numbers used by the kernel. I didn't look at boot0 and boot1 since I'm using GRUB on my system. Mark PS The patches are against 4.6-STABLE from a week ago or so. --- /usr/src/sys/boot/i386/libi386/biosdisk.c.orig Thu Dec 28 14:10:47 2000 +++ /usr/src/sys/boot/i386/libi386/biosdisk.c Sat Jul 13 03:30:53 2002 @@ -132,7 +132,8 @@ struct devsw biosdisk = { static int bd_opendisk(struct open_disk **odp, struct i386_devdesc *dev); static void bd_closedisk(struct open_disk *od); static int bd_bestslice(struct open_disk *od); -static void bd_checkextended(struct open_disk *od, int slicenum); +static void bd_checkextended(struct open_disk *od, + struct dos_partition *dp, u_int ext_base); /* * Translate between BIOS device numbers and our private unit numbers. @@ -308,6 +309,7 @@ bd_printslice(struct open_disk *od, stru break; case 0x00: /* unused partition */ case DOSPTYP_EXT: + case 0x0f: return; case 0x01: if (verbose) @@ -512,7 +514,7 @@ bd_opendisk(struct open_disk **odp, stru sizeof(struct dos_partition) * NDOSPART); od->od_nslices = 4; /* extended slices start here */ for (i = 0; i < NDOSPART; i++) - bd_checkextended(od, i); + bd_checkextended(od, &od->od_slicetab[i], od->od_slicetab[i].dp_start); od->od_flags |= BD_PARTTABOK; dptr = &od->od_slicetab[0]; @@ -624,22 +626,21 @@ bd_opendisk(struct open_disk **odp, stru } static void -bd_checkextended(struct open_disk *od, int slicenum) +bd_checkextended(struct open_disk *od, struct dos_partition *dp, + u_int ext_base) { - char buf[BIOSDISK_SECSIZE]; - struct dos_partition *dp; + char buf[BIOSDISK_SECSIZE]; u_int base; - int i, start, end; - - dp = &od->od_slicetab[slicenum]; - start = od->od_nslices; + int i; if (dp->dp_size == 0) goto done; - if (dp->dp_typ != DOSPTYP_EXT) + if (dp->dp_typ != DOSPTYP_EXT && dp->dp_typ != 0x0f) goto done; - if (bd_read(od, (daddr_t)dp->dp_start, 1, buf)) + if (bd_read(od, (daddr_t)dp->dp_start, 1, buf)) { + DEBUG("error reading extended table"); goto done; + } if (((u_char)buf[0x1fe] != 0x55) || ((u_char)buf[0x1ff] != 0xaa)) { DEBUG("no magic in extended table"); goto done; @@ -651,17 +652,17 @@ bd_checkextended(struct open_disk *od, i continue; if (od->od_nslices == MAX_SLICES) goto done; - dp->dp_start += base; - bcopy(dp, &od->od_slicetab[od->od_nslices], sizeof(*dp)); - od->od_nslices++; + if (dp->dp_typ == DOSPTYP_EXT || dp->dp_typ == 0x0f) { + dp->dp_start += ext_base; + bd_checkextended(od, dp, ext_base); + } else { + dp->dp_start += base; + bcopy(dp, &od->od_slicetab[od->od_nslices], + sizeof(*dp)); + od->od_nslices++; + } } - end = od->od_nslices; - /* - * now, recursively check the slices we just added - */ - for (i = start; i < end; i++) - bd_checkextended(od, i); done: return; } --- /usr/src/sys/kern/vfs_conf.c.orig Mon Feb 4 14:08:12 2002 +++ /usr/src/sys/kern/vfs_conf.c Fri Jul 12 17:34:02 2002 @@ -356,8 +356,10 @@ gotit: while (*cp >= '0' && *cp <= '9') unit = 10 * unit + *cp++ - '0'; if (*cp == 's' && cp[1] >= '0' && cp[1] <= '9') { - slice = cp[1] - '0' + 1; - cp += 2; + cp++; + while (*cp >= '0' && *cp <= '9') + slice = 10 * slice + *cp++ - '0'; + slice++; } if (*cp >= 'a' && *cp <= 'h') { part = *cp - 'a'; To Unsubscribe: send mail to [EMAIL PROTECTED] with "unsubscribe freebsd-hackers" in the body of the message To Unsubscribe: send mail to [EMAIL PROTECTED] with "unsubscribe freebsd-hackers" in the body of the message