On Wed, Aug 26, 2009 at 2:34 AM, Robert Millan<r...@aybabtu.com> wrote: > On Tue, Aug 25, 2009 at 10:37:33PM +0200, Vladimir 'phcoder' Serbinenko wrote: >> + 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."); > > Looks like the first error string could be used for both cases, saving > a few bytes. > > -- > Robert Millan > > The DRM opt-in fallacy: "Your data belongs to us. We will decide when (and > how) you may access your data; but nobody's threatening your freedom: we > still allow you to remove your data and not access it at all." > > > _______________________________________________ > Grub-devel mailing list > Grub-devel@gnu.org > http://lists.gnu.org/mailman/listinfo/grub-devel >
-- Regards Vladimir 'phcoder' Serbinenko Personal git repository: http://repo.or.cz/w/grub2/phcoder.git
diff --git a/ChangeLog b/ChangeLog index 54b3e48..9aba062 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,15 @@ 2009-08-25 Vladimir Serbinenko <phco...@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 <phco...@gmail.com> + NetBSD memory map support. * include/grub/i386/bsd.h (NETBSD_BTINFO_MEMMAP): New definition. diff --git a/loader/i386/bsd.c b/loader/i386/bsd.c index 1accfb6..1afac9e 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}, @@ -564,7 +568,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) @@ -613,11 +616,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); @@ -1011,11 +1010,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><lowercase 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; }
_______________________________________________ Grub-devel mailing list Grub-devel@gnu.org http://lists.gnu.org/mailman/listinfo/grub-devel