From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from list by lists.gnu.org with archive (Exim 4.71) id 1R69gh-0004wT-Ot for mharc-grub-devel@gnu.org; Tue, 20 Sep 2011 19:25:15 -0400 Received: from eggs.gnu.org ([140.186.70.92]:33375) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1R69gc-0004w1-F0 for grub-devel@gnu.org; Tue, 20 Sep 2011 19:25:11 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1R69ga-0008GY-F3 for grub-devel@gnu.org; Tue, 20 Sep 2011 19:25:10 -0400 Received: from mail-wy0-f169.google.com ([74.125.82.169]:50861) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1R69ga-0008F6-4m for grub-devel@gnu.org; Tue, 20 Sep 2011 19:25:08 -0400 Received: by wyf22 with SMTP id 22so570794wyf.0 for ; Tue, 20 Sep 2011 16:25:06 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=message-id:date:from:user-agent:mime-version:to:subject :content-type; bh=MsAsfPz0S1bVmZeQ1AymvqVibpqgmM8BwnwfVnVB9GE=; b=t5ZrB7CM7hudu61kV04l85UNCmZLFAC8g6fCUlYLjp8souhI0JHY/4xAFrkPJ1ag/8 2Bjwd1OWFPEYCKCbsjQkyFhg4dRWqiq03SnlIq8GAe5SSkU6/HwRTiox4hDCDUwk2kwP fPFxtnL29lYERkS1YNgcFGVz9UebX9umR5iW4= Received: by 10.227.174.139 with SMTP id t11mr490944wbz.110.1316561106068; Tue, 20 Sep 2011 16:25:06 -0700 (PDT) Received: from [192.168.1.37] (c2433-1-88-160-112-182.fbx.proxad.net. [88.160.112.182]) by mx.google.com with ESMTPS id fa3sm4523904wbb.3.2011.09.20.16.25.05 (version=TLSv1/SSLv3 cipher=OTHER); Tue, 20 Sep 2011 16:25:05 -0700 (PDT) Message-ID: <4E7920D0.3090401@gmail.com> Date: Wed, 21 Sep 2011 01:25:04 +0200 From: =?ISO-8859-1?Q?Gr=E9goire_Sutre?= User-Agent: Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.2.21) Gecko/20110831 Iceowl/1.0b2 Icedove/3.1.13 MIME-Version: 1.0 To: The development of GNU GRUB Subject: [patch] Make knetbsd pass the root device Content-Type: multipart/mixed; boundary="------------000508000801040403070304" X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.6 (newer, 2) X-Received-From: 74.125.82.169 X-BeenThere: grub-devel@gnu.org X-Mailman-Version: 2.1.14 Precedence: list Reply-To: The development of GNU GRUB List-Id: The development of GNU GRUB List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 20 Sep 2011 23:25:11 -0000 This is a multi-part message in MIME format. --------------000508000801040403070304 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 8bit Hi, The attached patch adds bootdisk and bootwedge to the bootinfo passed to NetBSD kernels by knetbsd. These fields indicate to the kernel which is the root device. The patch sets them to GRUB's root device. This way, specifying --root for knetbsd is no longer necessary for common cases. Examples: - Root device is partition f: of the NetBSD label in hd0: insmod part_bsd set root=(hd0,netbsd6) - Root device is partition a: of the NetBSD label in hd1 (*): insmod part_bsd set root=(hd1,netbsd1) - Root device is first GPT partition of hd1: insmod part_gpt set root=(hd1,gpt1) Here, the NetBSD kernel will detect the root device as a disk wedge. - Root device is 2nd DOS partition of hd0: set root=(hd0,msdos2) As in the previous case, the kernel will detect the root device as a disk wedge (if it is built with the appropriate option). (*) Assuming that a: is the root partition of the NetBSD slice contained in, say, (hd1,msdos3), one should specify (hd1,netbsd1) and not (hd1,msdos3). The latter would be ignored by the kernel (or, possibly, detected as a wedge). Comments welcome. Grégoire --------------000508000801040403070304 Content-Type: text/x-patch; name="netbsd-btinfo.diff" Content-Transfer-Encoding: 8bit Content-Disposition: attachment; filename="netbsd-btinfo.diff" === modified file 'ChangeLog' --- ChangeLog 2011-09-17 21:40:10 +0000 +++ ChangeLog 2011-09-20 21:37:48 +0000 @@ -1,3 +1,15 @@ +2011-09-20 GrĂ©goire Sutre + + * include/grub/bsdlabel.h (grub_partition_bsd_disk_label): Add fields + type and packname. + * include/grub/i386/netbsd_bootinfo.h (NETBSD_BTINFO_BOOTDISK): + Resurrected. + (NETBSD_BTINFO_BOOTWEDGE): New definition. + (grub_netbsd_btinfo_bootwedge): New struct. + * grub-core/loader/i386/bsd.c (grub_netbsd_add_boot_disk_and_wedge): + New function. + (grub_cmd_netbsd): Call grub_netbsd_add_boot_disk_and_wedge. + 2011-09-17 GrĂ©goire Sutre * Makefile.util.def (grub-mkrelpath): Add LIBUTIL for getrawpartition(3) === modified file 'grub-core/loader/i386/bsd.c' --- grub-core/loader/i386/bsd.c 2011-06-27 11:57:03 +0000 +++ grub-core/loader/i386/bsd.c 2011-09-20 21:29:28 +0000 @@ -33,6 +33,8 @@ #include #include #include +#include +#include GRUB_MOD_LICENSE ("GPLv3+"); @@ -946,6 +948,84 @@ grub_netbsd_add_modules (void) return err; } +/* + * Adds NetBSD bootinfo bootdisk and bootwedge. The partition identified + * in these bootinfo fields is the root device. + */ +static void +grub_netbsd_add_boot_disk_and_wedge (void) +{ + grub_device_t dev; + grub_disk_t disk; + grub_partition_t part; + grub_uint32_t biosdev; + grub_uint32_t partmapsector; + struct grub_partition_bsd_disk_label *label; + grub_uint8_t buf[GRUB_DISK_SECTOR_SIZE]; + grub_uint8_t *hash; + grub_uint8_t ctx[GRUB_MD_MD5->contextsize]; + + dev = grub_device_open (0); + if (! (dev && dev->disk && dev->disk->partition)) + return; + + disk = dev->disk; + part = disk->partition; + + if (disk->dev && disk->dev->id == GRUB_DISK_DEVICE_BIOSDISK_ID) + biosdev = (grub_uint32_t) disk->id & 0xff; + else + biosdev = 0xff; + + /* Absolute sector of the partition map describing this partition. */ + partmapsector = grub_partition_get_start (part->parent) + part->offset; + + disk->partition = part->parent; + if (grub_disk_read (disk, part->offset, 0, GRUB_DISK_SECTOR_SIZE, buf) != GRUB_ERR_NONE) + goto fail; + disk->partition = part; + + /* Fill bootwedge. */ + { + struct grub_netbsd_btinfo_bootwedge biw; + + grub_memset (&biw, 0, sizeof (biw)); + biw.biosdev = biosdev; + biw.startblk = grub_partition_get_start (part); + biw.nblks = part->len; + biw.matchblk = partmapsector; + biw.matchnblks = 1; + + GRUB_MD_MD5->init (&ctx); + GRUB_MD_MD5->write (&ctx, buf, GRUB_DISK_SECTOR_SIZE); + GRUB_MD_MD5->final (&ctx); + hash = GRUB_MD_MD5->read (&ctx); + memcpy (biw.matchhash, hash, 16); + + grub_bsd_add_meta (NETBSD_BTINFO_BOOTWEDGE, &biw, sizeof (biw)); + } + + /* Fill bootdisk if this a BSD disklabel. */ + label = (struct grub_partition_bsd_disk_label *) &buf; + if (label->magic == grub_cpu_to_le32 (GRUB_PC_PARTITION_BSD_LABEL_MAGIC)) + { + struct grub_netbsd_btinfo_bootdisk bid; + + grub_memset (&bid, 0, sizeof (bid)); + bid.labelsector = partmapsector; + bid.label.type = label->type; + bid.label.checksum = label->checksum; + memcpy (bid.label.packname, label->packname, 16); + bid.biosdev = biosdev; + bid.partition = part->number; + grub_bsd_add_meta (NETBSD_BTINFO_BOOTDISK, &bid, sizeof (bid)); + } + +fail: + if (dev) + grub_device_close (dev); +} + static grub_err_t grub_netbsd_boot (void) { @@ -1607,6 +1687,8 @@ grub_cmd_netbsd (grub_extcmd_context_t c grub_bsd_add_meta (NETBSD_BTINFO_CONSOLE, &cons, sizeof (cons)); } + grub_netbsd_add_boot_disk_and_wedge (); + grub_loader_set (grub_netbsd_boot, grub_bsd_unload, 0); } === modified file 'include/grub/bsdlabel.h' --- include/grub/bsdlabel.h 2010-07-16 23:57:48 +0000 +++ include/grub/bsdlabel.h 2011-09-20 21:23:33 +0000 @@ -80,7 +80,10 @@ struct grub_partition_bsd_entry struct grub_partition_bsd_disk_label { grub_uint32_t magic; - grub_uint8_t padding[128]; + grub_uint16_t type; + grub_uint8_t unused1[18]; + grub_uint8_t packname[16]; + grub_uint8_t unused2[92]; grub_uint32_t magic2; grub_uint16_t checksum; grub_uint16_t num_partitions; === modified file 'include/grub/i386/netbsd_bootinfo.h' --- include/grub/i386/netbsd_bootinfo.h 2010-01-18 22:37:11 +0000 +++ include/grub/i386/netbsd_bootinfo.h 2011-09-20 21:26:37 +0000 @@ -51,9 +51,11 @@ #define NETBSD_BTINFO_BOOTPATH 0 #define NETBSD_BTINFO_ROOTDEVICE 1 +#define NETBSD_BTINFO_BOOTDISK 3 #define NETBSD_BTINFO_CONSOLE 6 #define NETBSD_BTINFO_SYMTAB 8 #define NETBSD_BTINFO_MEMMAP 9 +#define NETBSD_BTINFO_BOOTWEDGE 10 #define NETBSD_BTINFO_MODULES 11 #define NETBSD_BTINFO_FRAMEBUF 12 @@ -83,6 +85,15 @@ struct grub_netbsd_btinfo_bootdisk grub_uint32_t partition; }; +struct grub_netbsd_btinfo_bootwedge { + grub_uint32_t biosdev; + grub_disk_addr_t startblk; + grub_uint64_t nblks; + grub_disk_addr_t matchblk; + grub_uint64_t matchnblks; + grub_uint8_t matchhash[16]; /* MD5 hash */ +} __packed; + struct grub_netbsd_btinfo_symtab { grub_uint32_t nsyms; --------------000508000801040403070304--