From: Marco Gerards <metgerards@student.han.nl>
To: The development of GRUB 2 <grub-devel@gnu.org>
Subject: Re: Normal mode linux and multiboot loaders
Date: Wed, 15 Sep 2004 00:34:32 +0000 [thread overview]
Message-ID: <87llfcpdyf.fsf@marco.marco-g.com> (raw)
In-Reply-To: <874qm29gyk.fsf@marco.marco-g.com> (Marco Gerards's message of "Mon, 13 Sep 2004 18:11:47 +0000")
Marco Gerards <metgerards@student.han.nl> writes:
> As I have promised, I have written two modules to make it possible to
> use the linux and multiboot loaders in GNU/Linux. It is a really
> simple patch so I assume it is ok and check it in Wednesday.
Now I have tested this a bit more. I found a small problem with
fshelp and the command line parser when using GNU/Hurd. Because
everything can be used as multiboot argument I disabled the argument
parser for this command. I've also disabled the code that replace
environment variables because GNU/Hurd uses variables with the same
syntax in its bootscripts and it conflicts. :/
I will wait a bit longer with applying this patch so you can comment
on these latest changes if you want to.
As a bonus, the shellscript I use to create a GRUB 2 bootfloppy. I
hope it is as useful to you as it was to me. Feel free to modify it
so it can be included with GRUB 2 to produce floppy/hd images. As you
can see I suck at shellscripting and I am not able to produce
something useful in a reasonable time.
I can upload a GRUB 2 floppy somewhere including a grub.cfg and GRUB 2
patched with this patch so people can test GRUB 2. Please tell me if
you want that and I will do so.
Thanks,
Marco
The script:
#!/bin/sh
IMAGE=grub2-floppy-i386.ext2fs
MNT=/mnt/floppy
rm $IMAGE
dd if=/dev/zero of=$IMAGE bs=512 count=2880|| exit
/sbin/mkfs.ext2 -F $IMAGE
./grub-mkimage -v -d . -o core.img ext2
sudo mount $IMAGE $MNT -o loop
mkdir $MNT/grub
cp *.img *.mod $MNT/grub
echo '(fd0)' $PWD/$IMAGE > tmp_device.map
./grub-setup -d $MNT/grub -m tmp_device.map -r '(fd0)' '(fd0)'
rm tmp_device.map
cat >$MNT/grub/grub.cfg <<EOF
#GNU/Linux
insmod linux
insmod boot
insmod multiboot
title GNU/Linux
linux (hd0,4)/boot/vmlinuz-2.2.20 root=/dev/hda5
dsf
title GNU/Hurd
# GNU/Hurd
multiboot (hd0,2)/boot/gnumach root=device:hd0s3
module (hd0,2)/hurd/ext2fs.static --multiboot-command-line=\${kernel-command-line} --host-priv-port=\${host-port} --device-master-port=\${device-port} --exec-server-task=\${exec-task} -T typed \${root} \$(task-create) \$(task-resume)
module (hd0,2)/lib/ld.so.1 /hurd/exec \$(exec-task=task-create)
gdsf
EOF
cat $MNT/grub/grub.cfg
sudo umount $MNT
The new patch:
2004-09-13 Marco Gerards <metgerards@student.han.nl>
Add `linux.mod' and `multiboot.mod' so linux and multiboot kernels
can be loaded from normal mode.
* conf/i386-pc.mk (pkgdata_MODULES): Add `linux.mod' and
`multiboot.mod'.
(linux_mod_SOURCES, linux_mod_CFLAGS, multiboot_mod_SOURCES)
(multiboot_mod_CFLAGS): New variables.
* loader/i386/pc/linux_normal.c: New file.
* loader/i386/pc/multiboot_normal.c: Likewise.
* loader/i386/pc/linux.c (grub_rescue_cmd_initrd): Don't use the
attribute `unused'.
* fs/ext2.c (grub_ext2_iterate_dir): Fix typos in inode type. Use
`fdiro' to read the mode information from instead of `diro'.
* fs/fshelp.c (grub_fshelp_find_file): Set type to foundtype after
looking up a symlink.
* include/grub/normal.h (GRUB_COMMAND_FLAG_NO_ARG_PARSE): New
macro.
* normal/command.c (grub_command_execute): Don't parse the
arguments when `GRUB_COMMAND_FLAG_NO_ARG_PARSE' is set in the
flags of the command.
* grub/grub2/kern/misc.c (grub_split_cmdline): Disable envvar
parsing code because it conflicts with multiboot.
* normal/menu.c (grub_menu_run): Fix typo.
Index: conf/i386-pc.rmk
===================================================================
RCS file: /cvsroot/grub/grub2/conf/i386-pc.rmk,v
retrieving revision 1.20
diff -u -p -u -p -r1.20 i386-pc.rmk
--- conf/i386-pc.rmk 12 Sep 2004 12:20:52 -0000 1.20
+++ conf/i386-pc.rmk 15 Sep 2004 00:24:53 -0000
@@ -78,9 +78,9 @@ grub_emu_LDFLAGS = -lncurses
genmoddep_SOURCES = util/genmoddep.c
# Modules.
-pkgdata_MODULES = _chain.mod _linux.mod fat.mod ufs.mod ext2.mod minix.mod \
+pkgdata_MODULES = _chain.mod _linux.mod linux.mod fat.mod ufs.mod ext2.mod minix.mod \
hfs.mod jfs.mod normal.mod hello.mod vga.mod font.mod _multiboot.mod ls.mod \
- boot.mod cmp.mod cat.mod terminal.mod fshelp.mod chain.mod
+ boot.mod cmp.mod cat.mod terminal.mod fshelp.mod chain.mod multiboot.mod
# For _chain.mod.
_chain_mod_SOURCES = loader/i386/pc/chainloader.c
@@ -121,6 +121,10 @@ jfs_mod_CFLAGS = $(COMMON_CFLAGS)
# For _linux.mod.
_linux_mod_SOURCES = loader/i386/pc/linux.c
_linux_mod_CFLAGS = $(COMMON_CFLAGS)
+
+# For linux.mod.
+linux_mod_SOURCES = loader/i386/pc/linux_normal.c
+linux_mod_CFLAGS = $(COMMON_CFLAGS)
# For normal.mod.
normal_mod_SOURCES = normal/cmdline.c normal/command.c normal/main.c \
@@ -163,3 +167,7 @@ font_mod_CFLAGS = $(COMMON_CFLAGS)
# For _multiboot.mod.
_multiboot_mod_SOURCES = loader/i386/pc/multiboot.c
_multiboot_mod_CFLAGS = $(COMMON_CFLAGS)
+
+# For multiboot.mod.
+multiboot_mod_SOURCES = loader/i386/pc/multiboot_normal.c
+multiboot_mod_CFLAGS = $(COMMON_CFLAGS)
Index: fs/ext2.c
===================================================================
RCS file: /cvsroot/grub/grub2/fs/ext2.c,v
retrieving revision 1.9
diff -u -p -u -p -r1.9 ext2.c
--- fs/ext2.c 11 Sep 2004 11:42:43 -0000 1.9
+++ fs/ext2.c 15 Sep 2004 00:24:53 -0000
@@ -451,14 +451,14 @@ grub_ext2_iterate_dir (grub_fshelp_node_
fdiro->inode_read = 1;
- if ((grub_le_to_cpu16 (diro->inode.mode)
+ if ((grub_le_to_cpu16 (fdiro->inode.mode)
& FILETYPE_INO_MASK) == FILETYPE_INO_DIRECTORY)
type = GRUB_FSHELP_DIR;
- else if ((grub_le_to_cpu16 (diro->inode.mode)
- & FILETYPE_INO_MASK) == FILETYPE_INO_DIRECTORY)
+ else if ((grub_le_to_cpu16 (fdiro->inode.mode)
+ & FILETYPE_INO_MASK) == FILETYPE_INO_SYMLINK)
type = GRUB_FSHELP_SYMLINK;
- else if ((grub_le_to_cpu16 (diro->inode.mode)
- & FILETYPE_INO_MASK) == FILETYPE_INO_DIRECTORY)
+ else if ((grub_le_to_cpu16 (fdiro->inode.mode)
+ & FILETYPE_INO_MASK) == FILETYPE_INO_REG)
type = GRUB_FSHELP_REG;
}
Index: fs/fshelp.c
===================================================================
RCS file: /cvsroot/grub/grub2/fs/fshelp.c,v
retrieving revision 1.1
diff -u -p -u -p -r1.1 fshelp.c
--- fs/fshelp.c 11 Sep 2004 11:42:43 -0000 1.1
+++ fs/fshelp.c 15 Sep 2004 00:24:53 -0000
@@ -171,6 +171,7 @@ grub_fshelp_find_file (const char *path,
/* Lookup the node the symlink points to. */
find_file (symlink, oldnode, &currnode);
+ type = foundtype;
grub_free (symlink);
if (grub_errno)
Index: include/grub/normal.h
===================================================================
RCS file: /cvsroot/grub/grub2/include/grub/normal.h,v
retrieving revision 1.8
diff -u -p -u -p -r1.8 normal.h
--- include/grub/normal.h 10 Sep 2004 20:31:55 -0000 1.8
+++ include/grub/normal.h 15 Sep 2004 00:24:53 -0000
@@ -39,6 +39,8 @@
#define GRUB_COMMAND_FLAG_TITLE 0x4
/* Don't print the command on booting. */
#define GRUB_COMMAND_FLAG_NO_ECHO 0x8
+/* Don't print the command on booting. */
+#define GRUB_COMMAND_FLAG_NO_ARG_PARSE 0x10
/* The command description. */
struct grub_command
Index: kern/misc.c
===================================================================
RCS file: /cvsroot/grub/grub2/kern/misc.c,v
retrieving revision 1.15
diff -u -p -u -p -r1.15 misc.c
--- kern/misc.c 14 Sep 2004 08:56:51 -0000 1.15
+++ kern/misc.c 15 Sep 2004 00:24:53 -0000
@@ -771,6 +771,7 @@ grub_split_cmdline (const char *cmdline,
unput = 1;
}
+#if 0
/* Read a variable name from the commandline and insert its content
into the buffer. */
void getenvvar (void)
@@ -806,6 +807,7 @@ grub_split_cmdline (const char *cmdline,
for (p = val; *p; p++)
*(bp++) = *p;
}
+#endif
/* Read one argument. Return 1 if no variables can be read anymore,
otherwise return 0. If there is an error, return 1, the caller
@@ -838,11 +840,13 @@ grub_split_cmdline (const char *cmdline,
else if (c == '"')
break;
/* Read a variable. */
+#if 0
if (c == '$')
{
getenvvar ();
continue;
}
+#endif
*(bp++) = c;
}
break;
@@ -875,6 +879,7 @@ grub_split_cmdline (const char *cmdline,
c = getchar ();
continue;
}
+#if 0
/* Read a variable. */
if (c == '$')
{
@@ -882,6 +887,7 @@ grub_split_cmdline (const char *cmdline,
c = getchar ();
continue;
}
+#endif
*(bp++) = c;
c = getchar ();
}
Index: loader/i386/pc/linux.c
===================================================================
RCS file: /cvsroot/grub/grub2/loader/i386/pc/linux.c,v
retrieving revision 1.6
diff -u -p -u -p -r1.6 linux.c
--- loader/i386/pc/linux.c 4 Apr 2004 13:46:02 -0000 1.6
+++ loader/i386/pc/linux.c 15 Sep 2004 00:24:54 -0000
@@ -290,8 +290,7 @@ grub_rescue_cmd_linux (int argc, char *a
}
void
-grub_rescue_cmd_initrd (int argc __attribute__ ((unused)),
- char *argv[] __attribute__ ((unused)))
+grub_rescue_cmd_initrd (int argc, char *argv[])
{
grub_file_t file = 0;
grub_ssize_t size;
Index: loader/i386/pc/linux_normal.c
===================================================================
RCS file: loader/i386/pc/linux_normal.c
diff -N loader/i386/pc/linux_normal.c
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ loader/i386/pc/linux_normal.c 15 Sep 2004 00:24:54 -0000
@@ -0,0 +1,61 @@
+/* linux_normal.c - boot another boot loader */
+/*
+ * GRUB -- GRand Unified Bootloader
+ * Copyright (C) 2004 Free Software Foundation, Inc.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#include <grub/machine/loader.h>
+#include <grub/err.h>
+#include <grub/normal.h>
+#include <grub/dl.h>
+
+static grub_err_t
+grub_normal_linux_command (struct grub_arg_list *state __attribute__ ((unused)),
+ int argc, char **args)
+{
+ grub_rescue_cmd_linux (argc, args);
+ return grub_errno;
+}
+
+
+static grub_err_t
+grub_normal_initrd_command (struct grub_arg_list *state __attribute__ ((unused)),
+ int argc, char **args)
+{
+ grub_rescue_cmd_initrd (argc, args);
+ return grub_errno;
+}
+
+GRUB_MOD_INIT
+{
+ (void) mod; /* To stop warning. */
+ grub_register_command ("linux", grub_normal_linux_command,
+ GRUB_COMMAND_FLAG_BOTH,
+ "linux FILE [ARGS...]",
+ "Load linux", 0);
+
+ grub_register_command ("initrd", grub_normal_initrd_command,
+ GRUB_COMMAND_FLAG_BOTH,
+ "initrd FILE",
+ "Load initrd", 0);
+}
+
+GRUB_MOD_FINI
+{
+ grub_unregister_command ("linux");
+ grub_unregister_command ("initrd");
+}
Index: loader/i386/pc/multiboot_normal.c
===================================================================
RCS file: loader/i386/pc/multiboot_normal.c
diff -N loader/i386/pc/multiboot_normal.c
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ loader/i386/pc/multiboot_normal.c 15 Sep 2004 00:24:54 -0000
@@ -0,0 +1,61 @@
+/* multiboot_normal.c - boot another boot loader */
+/*
+ * GRUB -- GRand Unified Bootloader
+ * Copyright (C) 2004 Free Software Foundation, Inc.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#include <grub/machine/loader.h>
+#include <grub/err.h>
+#include <grub/normal.h>
+#include <grub/dl.h>
+
+static grub_err_t
+grub_normal_cmd_multiboot (struct grub_arg_list *state __attribute__ ((unused)),
+ int argc, char **args)
+{
+ grub_rescue_cmd_multiboot (argc, args);
+ return grub_errno;
+}
+
+
+static grub_err_t
+grub_normal_cmd_module (struct grub_arg_list *state __attribute__ ((unused)),
+ int argc, char **args)
+{
+ grub_rescue_cmd_module (argc, args);
+ return grub_errno;
+}
+
+GRUB_MOD_INIT
+{
+ (void) mod; /* To stop warning. */
+ grub_register_command ("multiboot", grub_normal_cmd_multiboot,
+ GRUB_COMMAND_FLAG_BOTH | GRUB_COMMAND_FLAG_NO_ARG_PARSE,
+ "multiboot FILE [ARGS...]",
+ "Load a multiboot kernel", 0);
+
+ grub_register_command ("module", grub_normal_cmd_module,
+ GRUB_COMMAND_FLAG_BOTH | GRUB_COMMAND_FLAG_NO_ARG_PARSE,
+ "multiboot FILE [ARGS...]",
+ "Load a multiboot module", 0);
+}
+
+GRUB_MOD_FINI
+{
+ grub_unregister_command ("multiboot");
+ grub_unregister_command ("module");
+}
Index: normal/command.c
===================================================================
RCS file: /cvsroot/grub/grub2/normal/command.c,v
retrieving revision 1.6
diff -u -p -u -p -r1.6 command.c
--- normal/command.c 4 Apr 2004 13:46:02 -0000 1.6
+++ normal/command.c 15 Sep 2004 00:24:54 -0000
@@ -160,8 +160,14 @@ grub_command_execute (char *cmdline)
state = grub_malloc (sizeof (struct grub_arg_list) * maxargs);
grub_memset (state, 0, sizeof (struct grub_arg_list) * maxargs);
- if (grub_arg_parse (cmd, num, &args[1], state, &arglist, &numargs))
- ret = (cmd->func) (state, numargs, arglist);
+ if (! (cmd->flags & GRUB_COMMAND_FLAG_NO_ARG_PARSE))
+ {
+ if (grub_arg_parse (cmd, num, &args[1], state, &arglist, &numargs))
+ ret = (cmd->func) (state, numargs, arglist);
+ }
+ else
+ ret = (cmd->func) (state, num, &args[1]);
+
grub_free (state);
if (pager && (! grub_strcmp (pager, "1")))
Index: normal/menu.c
===================================================================
RCS file: /cvsroot/grub/grub2/normal/menu.c,v
retrieving revision 1.6
diff -u -p -u -p -r1.6 menu.c
--- normal/menu.c 10 Sep 2004 20:31:55 -0000 1.6
+++ normal/menu.c 15 Sep 2004 00:24:54 -0000
@@ -357,7 +357,7 @@ grub_menu_run (grub_menu_t menu, int nes
run_menu_entry (e);
/* Deal with a fallback entry. */
- /* FIXME: Mutiple fallback entries like GRUB Legacy. */
+ /* FIXME: Multiple fallback entries like GRUB Legacy. */
if (menu->fallback_entry >= 0)
{
grub_print_error ();
next prev parent reply other threads:[~2004-09-15 0:44 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2004-09-13 18:11 Normal mode linux and multiboot loaders Marco Gerards
2004-09-13 21:43 ` Yoshinori K. Okuji
2004-09-15 0:34 ` Marco Gerards [this message]
2004-09-15 9:47 ` Yoshinori K. Okuji
2004-09-15 14:40 ` Marco Gerards
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=87llfcpdyf.fsf@marco.marco-g.com \
--to=metgerards@student.han.nl \
--cc=grub-devel@gnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
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.