All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH] Let user specify OpenBSD root device.
@ 2009-08-25 20:37 Vladimir 'phcoder' Serbinenko
  2009-08-26  0:34 ` Robert Millan
  0 siblings, 1 reply; 6+ messages in thread
From: Vladimir 'phcoder' Serbinenko @ 2009-08-25 20:37 UTC (permalink / raw)
  To: The development of GRUB 2

[-- Attachment #1: Type: text/plain, Size: 375 bytes --]

OpenBSD recieves a root specification in a form of pair <device,
partition>. I thought that device number referred to biosnumber AND'ed
with 0x7f as it was implemented but experiments with grub-qemu showed
that OpenBSD doesn't rely on BIOS at all. So hence this patch

-- 
Regards
Vladimir 'phcoder' Serbinenko

Personal git repository: http://repo.or.cz/w/grub2/phcoder.git

[-- Attachment #2: openbsdroot.diff --]
[-- Type: text/plain, Size: 3833 bytes --]

diff --git a/ChangeLog b/ChangeLog
index 1de68ad..717904e 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,15 @@
 2009-08-25  Vladimir Serbinenko  <phcoder@gmail.com>
 
+	Let user specify OpenBSD root device.
+
+	* loader/i386/bsd.c (openbsd_root): New variable.
+	(openbsd_opts): New option 'root'.
+	(OPENBSD_ROOT_ARG): New macro.
+	(grub_openbsd_boot): Use 'openbsd_root'.
+	(grub_cmd_openbsd): Fill 'openbsd_root'.
+
+2009-08-25  Vladimir Serbinenko  <phcoder@gmail.com>
+
 	Cleanup NetBSD root support.
 
 	* loader/i386/bsd.c (grub_netbsd_boot): Remove call to
diff --git a/loader/i386/bsd.c b/loader/i386/bsd.c
index 0b9a2b4..503a0ef 100644
--- a/loader/i386/bsd.c
+++ b/loader/i386/bsd.c
@@ -57,6 +57,7 @@ static char *mod_buf;
 static grub_uint32_t mod_buf_len, mod_buf_max, kern_end_mdofs;
 static int is_elf_kernel, is_64bit;
 static char *netbsd_root = NULL;
+static grub_uint32_t openbsd_root;
 
 static const struct grub_arg_option freebsd_opts[] =
   {
@@ -93,6 +94,7 @@ static const struct grub_arg_option openbsd_opts[] =
     {"config", 'c', 0, "Change configured devices.", 0, 0},
     {"single", 's', 0, "Boot into single mode.", 0, 0},
     {"kdb", 'd', 0, "Enter in KDB on boot.", 0, 0},
+    {"root", 'r', 0, "Set root device.", "wdXY", ARG_TYPE_STRING},
     {0, 0, 0, 0, 0, 0}
   };
 
@@ -102,6 +104,8 @@ static const grub_uint32_t openbsd_flags[] =
   OPENBSD_RB_SINGLE, OPENBSD_RB_KDB, 0
 };
 
+#define OPENBSD_ROOT_ARG (ARRAY_SIZE (openbsd_flags) - 1)
+
 static const struct grub_arg_option netbsd_opts[] =
   {
     {"no-smp", '1', 0, "Disable SMP.", 0, 0},
@@ -560,7 +564,6 @@ grub_openbsd_boot (void)
   char *buf = (char *) GRUB_BSD_TEMP_BUFFER;
   struct grub_openbsd_bios_mmap *pm;
   struct grub_openbsd_bootargs *pa;
-  grub_uint32_t bootdev, biosdev, unit, slice, part;
 
   auto int NESTED_FUNC_ATTR hook (grub_uint64_t, grub_uint64_t, grub_uint32_t);
   int NESTED_FUNC_ATTR hook (grub_uint64_t addr, grub_uint64_t size, grub_uint32_t type)
@@ -609,11 +612,7 @@ grub_openbsd_boot (void)
   pa->ba_type = OPENBSD_BOOTARG_END;
   pa++;
 
-  grub_bsd_get_device (&biosdev, &unit, &slice, &part);
-  bootdev = (OPENBSD_B_DEVMAGIC + (unit << OPENBSD_B_UNITSHIFT) +
-	     (part << OPENBSD_B_PARTSHIFT));
-
-  grub_unix_real_boot (entry, bootflags, bootdev, OPENBSD_BOOTARG_APIVER,
+  grub_unix_real_boot (entry, bootflags, openbsd_root, OPENBSD_BOOTARG_APIVER,
 		       0, (grub_uint32_t) (grub_mmap_get_upper () >> 10),
 		       (grub_uint32_t) (grub_mmap_get_lower () >> 10),
 		       (char *) pa - buf, buf);
@@ -950,11 +949,39 @@ grub_cmd_freebsd (grub_extcmd_t cmd, int argc, char *argv[])
 static grub_err_t
 grub_cmd_openbsd (grub_extcmd_t cmd, int argc, char *argv[])
 {
+  grub_uint32_t bootdev;
+
   kernel_type = KERNEL_TYPE_OPENBSD;
   bootflags = grub_bsd_parse_flags (cmd->state, openbsd_flags);
 
+  if (cmd->state[OPENBSD_ROOT_ARG].set)
+    {
+      const char *arg = cmd->state[OPENBSD_ROOT_ARG].arg;
+      int unit, part;
+      if (*(arg++) != 'w' || *(arg++) != 'd')
+	return grub_error (GRUB_ERR_BAD_ARGUMENT,
+			   "Only device specifications of form "
+			   "wd<number><lowercase letter> are supported.");
+
+      unit = grub_strtoul (arg, (char **) &arg, 10);
+      if (! (arg && *arg >= 'a' && *arg <= 'z'))
+	return grub_error (GRUB_ERR_BAD_ARGUMENT,
+			   "Only device specifications of form "
+			   "wd<number><letter> are supported.");
+
+      part = *arg - 'a';
+
+      bootdev = (OPENBSD_B_DEVMAGIC + (unit << OPENBSD_B_UNITSHIFT) +
+		 (part << OPENBSD_B_PARTSHIFT));
+    }
+  else
+    bootdev = 0;
+
   if (grub_bsd_load (argc, argv) == GRUB_ERR_NONE)
-    grub_loader_set (grub_openbsd_boot, grub_bsd_unload, 1);
+    {
+      grub_loader_set (grub_openbsd_boot, grub_bsd_unload, 1);
+      openbsd_root = bootdev;
+    }
 
   return grub_errno;
 }

^ permalink raw reply related	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2009-10-16 20:21 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2009-08-25 20:37 [PATCH] Let user specify OpenBSD root device Vladimir 'phcoder' Serbinenko
2009-08-26  0:34 ` Robert Millan
2009-08-26  0:39   ` Vladimir 'phcoder' Serbinenko
2009-10-16 11:00     ` Vladimir 'phcoder' Serbinenko
2009-10-16 18:31       ` Robert Millan
2009-10-16 20:21         ` Vladimir 'phcoder' Serbinenko

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.