From 899a275d55f7821f76ba8cc54342a854cf782223 Mon Sep 17 00:00:00 2001 From: okuji Date: Wed, 9 Feb 2000 21:14:33 +0000 Subject: [PATCH] add some new commands to the stage2 for the network support. --- ChangeLog | 21 ++++++++++++ NEWS | 2 ++ TODO | 75 ---------------------------------------- configure.in | 1 + docs/user-ref.texi | 13 +++++++ netboot/3c90x.c | 3 ++ netboot/main.c | 8 +++-- stage2/Makefile.am | 5 +++ stage2/Makefile.in | 4 ++- stage2/builtins.c | 85 ++++++++++++++++++++++++++++++++++++++++++++++ 10 files changed, 138 insertions(+), 79 deletions(-) diff --git a/ChangeLog b/ChangeLog index e10813126..b42625678 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,24 @@ +2000-02-10 OKUJI Yoshinori + + * stage2/Makefile.am [NETBOOT_SUPPORT] (STAGE2_COMPILE): Added + -I$(top_srcdir)/netboot and -DSUPPORT_NETBOOT=1. + * stage2/builtins.c (bootp_func): New function. + (dhcp_func): Likewise. + (rarp_func): Likewise. + (builtin_bootp): New variable. + (builtin_dhcp): Likewise. + (builtin_rarp): Likewise. + (builtin_table): Added pointers to BUILTIN_BOOTP, BUILTIN_DHCP + and BUILTIN_RARP. + * docs/user-ref.texi (General Commands): Added descriptions + about "bootp", "dhcp" and "rarp". + + * netboot/main.c (bootp) [!NO_DHCP_SUPPORT]: Added casts to + suppress gcc warnings. + (decode_rfc1533) [!NO_DHCP_SUPPORT]: Likewise. + * netboot/3c90x.c: Include the local "pci.h" instead of + even if __FreeBSD__ is undefined. + 2000-02-09 OKUJI Yoshinori From Jochen Hoenicke: diff --git a/NEWS b/NEWS index b4a2b3dcc..7c51f3439 100644 --- a/NEWS +++ b/NEWS @@ -38,6 +38,8 @@ New in 0.5.94: you are sure that your BIOS does support LBA mode but GRUB doesn't work in LBA mode, recompile GRUB with this option specified. You can check if GRUB accesses a drive in LBA mode by the command "geometry". +* New commands "bootp", "dhcp" and "rarp" can be used to initialize a + network device and get IP addresses from a network. New in 0.5.93 - 1999-10-30: * ELF format of FreeBSD kernel is supported. diff --git a/TODO b/TODO index 9ccdd221b..fa56d7bac 100644 --- a/TODO +++ b/TODO @@ -35,81 +35,6 @@ Priorities: partition, so that it won't be accidentally erased or modified by the kernel. -* Complete the netboot support. !!! - - This is the proposed interface between the netboot module and the core - system: - - - The module contains a header like this: - - struct netboot_module_header - { - /* The same as the Multiboot header, but has a different magic. */ - struct multiboot_header mb_header; - /* The version number to avoid incompatibilities. */ - unsigned short compat_version; - /* The identifier. */ - unsigned short identifier; - /* some pointers to callback functions. */ - unsigned long init_func; - unsigned long fini_func; - unsigned long open_func; - unsinged long read_func; - unsinged long seek_func; - unsinged long close_func; - /* The address of the message buffer. The module should not print - anything on the screen directly. */ - unsinged long msg_addr; - /* The maximum size of the message buffer (perhaps should be less - than 80*24, because of the screen size). */ - unsinged long msg_size; - } - - - When the core system loads the module, check for the header - structure and store the image in the specified memory address (in - the ELF header or in MB_HEADER). If successful, call INIT_FUNC. - - - INIT_FUNC should initialize the module and return the required - memory space. The prototype is: - - grub_error_t init_func (const struct multiboot_info *mbi, - unsigned long *mem_start, - unsigned long *mem_end); - - If the module does not need any extra memory space, then set - *MEM_START to _START and *MEM_END to _END. MBI->CMDLINE has the - command-line argument specified (probably netmask=... or something). - - FIXME: Should the module return most of the information dynamically - from INIT_FUNC, instead of the module header? - - - When the core system unloads the module, call FINI_FUNC to restore - the resources cleanly. - - - The prototype of FINI_FUNC is: - - grub_error_t fini_func (const struct multiboot_info *mbi); - - - The rest of the callback functions are equivalent to the filesystem - callbacks. Their prototypes are: - - grub_error_t open_func (const struct multiboot_info *mbi, - const char *filename); - grub_error_t read_func (const struct multiboot_info *mbi, - char *buffer, int len); - grub_error_t seek_func (const struct multiboot_info *mbi, - int offset); - grub_error_t close_func (const struct multiboot_info *mbi); - - FIXME: How to add decompression support? - - - The core system will print the string MSG_ADDR after each call is - finished. - - - Each callback function will be run in the exactly same condition as - when a Multiboot kernel starts up, and it MUST restore the condition - before it returns (i.e. PIC or IDT). - * Add automatic configuration support. * Add bunzip2 support. diff --git a/configure.in b/configure.in index 660664152..00947d9d5 100644 --- a/configure.in +++ b/configure.in @@ -398,6 +398,7 @@ if test "x$enable_via_rhine" = xyes; then NETBOOT_DRIVERS="$NETBOOT_DRIVERS via_rhine.o" fi +dnl Check if the netboot support is turned on. AM_CONDITIONAL(NETBOOT_SUPPORT, test "x$NET_CFLAGS" != x) if test "x$NET_CFLAGS" != x; then FSYS_CFLAGS="$FSYS_CFLAGS -DFSYS_TFTP=1" diff --git a/docs/user-ref.texi b/docs/user-ref.texi index 40a544ecb..bc2f288f5 100644 --- a/docs/user-ref.texi +++ b/docs/user-ref.texi @@ -498,6 +498,10 @@ the line, starting with the first non-space character. Commands usable both in the menu and in the command line. +@deffn Command bootp +Initialize a network device via the @dfn{BOOTP} protocol. +@end deffn + @deffn Command color normal [highlight] Change the menu colors. The color @var{normal} is used for most lines in the menu, and the color @var{highlight} is used to highlight the @@ -592,12 +596,21 @@ This command can be used only in the grub shell (@pxref{Invoking the grub shell}). @end deffn +@deffn Command dhcp +Initialize a network device via the @dfn{DHCP} protocol. At the moment, +this command is just an alias for @command{bootp}. +@end deffn + @deffn Command hide partition Hide @var{partition} by setting the @dfn{hidden} bit in its partition type code. This is useful only for DOS or Windows when multiple primary partitions exist in one disk. @end deffn +@deffn Command rarp +Initialize a network device via the @dfn{RARP} protocol. +@end deffn + @deffn Command setkey to_key from_key Change the keyboard map. The key @var{from_key} is mapped to the key @var{to_key}. Note that this command @emph{does not} exchange the diff --git a/netboot/3c90x.c b/netboot/3c90x.c index b2fde66f2..ee9805abd 100644 --- a/netboot/3c90x.c +++ b/netboot/3c90x.c @@ -36,9 +36,12 @@ #include "etherboot.h" #include "nic.h" +#include "pci.h" +#if 0 #ifndef __FreeBSD__ #include #endif +#endif #define TIME_OUT 60000 #define XCVR_MAGIC (0x5A00) diff --git a/netboot/main.c b/netboot/main.c index 03ea6196b..ea35b4447 100644 --- a/netboot/main.c +++ b/netboot/main.c @@ -531,8 +531,10 @@ bootp (void) grub_memmove (bp.bp_vend + sizeof rfc1533_cookie + sizeof dhcprequest, rfc1533_end, sizeof rfc1533_end); - grub_memmove (bp.bp_vend + 9, &dhcp_server, sizeof (in_addr)); - grub_memmove (bp.bp_vend + 15, &dhcp_addr, sizeof (in_addr)); + grub_memmove (bp.bp_vend + 9, (char *) &dhcp_server, + sizeof (in_addr)); + grub_memmove (bp.bp_vend + 15, (char *) &dhcp_addr, + sizeof (in_addr)); for (retry1 = 0; retry1 < MAX_BOOTP_RETRIES;) { udp_transmit (IP_BROADCAST, 0, BOOTP_SERVER, @@ -861,7 +863,7 @@ decode_rfc1533 (unsigned char *p, int block, int len, int eof) } else if (c == RFC2132_SRV_ID) { - grub_memmove (&dhcp_server, p + 2, sizeof (in_addr)); + grub_memmove ((char *) &dhcp_server, p + 2, sizeof (in_addr)); } #endif /* ! NO_DHCP_SUPPORT */ diff --git a/stage2/Makefile.am b/stage2/Makefile.am index d6ab99354..95c504d83 100644 --- a/stage2/Makefile.am +++ b/stage2/Makefile.am @@ -32,7 +32,12 @@ MOSTLYCLEANFILES = $(noinst_PROGRAMS) PRE_STAGE2_LINK = -nostdlib -Wl,-N -Wl,-Ttext -Wl,8200 START_LINK = -nostdlib -Wl,-N -Wl,-Ttext -Wl,8000 +if NETBOOT_SUPPORT +STAGE2_COMPILE = $(STAGE2_CFLAGS) -fno-builtin -nostdinc \ + -I$(top_srcdir)/netboot -DSUPPORT_NETBOOT=1 +else STAGE2_COMPILE = $(STAGE2_CFLAGS) -fno-builtin -nostdinc +endif STAGE1_5_LINK = -nostdlib -Wl,-N -Wl,-Ttext -Wl,2000 STAGE1_5_COMPILE = $(STAGE2_COMPILE) -DNO_DECOMPRESSION=1 -DSTAGE1_5=1 diff --git a/stage2/Makefile.in b/stage2/Makefile.in index 48f935772..bb10e68ff 100644 --- a/stage2/Makefile.in +++ b/stage2/Makefile.in @@ -121,7 +121,9 @@ MOSTLYCLEANFILES = $(noinst_PROGRAMS) PRE_STAGE2_LINK = -nostdlib -Wl,-N -Wl,-Ttext -Wl,8200 START_LINK = -nostdlib -Wl,-N -Wl,-Ttext -Wl,8000 -STAGE2_COMPILE = $(STAGE2_CFLAGS) -fno-builtin -nostdinc +@NETBOOT_SUPPORT_TRUE@STAGE2_COMPILE = @NETBOOT_SUPPORT_TRUE@$(STAGE2_CFLAGS) -fno-builtin -nostdinc \ +@NETBOOT_SUPPORT_TRUE@ -I$(top_srcdir)/netboot -DSUPPORT_NETBOOT=1 +@NETBOOT_SUPPORT_FALSE@STAGE2_COMPILE = @NETBOOT_SUPPORT_FALSE@$(STAGE2_CFLAGS) -fno-builtin -nostdinc STAGE1_5_LINK = -nostdlib -Wl,-N -Wl,-Ttext -Wl,2000 STAGE1_5_COMPILE = $(STAGE2_COMPILE) -DNO_DECOMPRESSION=1 -DSTAGE1_5=1 diff --git a/stage2/builtins.c b/stage2/builtins.c index a98609e00..aaee78e4b 100644 --- a/stage2/builtins.c +++ b/stage2/builtins.c @@ -22,6 +22,10 @@ #include #include +#ifdef SUPPORT_NETBOOT +# include +#endif + #ifndef GRUB_UTIL # include "apic.h" # include "smp-imps.h" @@ -239,6 +243,37 @@ static struct builtin builtin_boot = }; +/* bootp */ +static int +bootp_func (char *arg, int flags) +{ +#ifdef SUPPORT_NETBOOT + if (! bootp ()) + { + if (errnum == ERR_NONE) + errnum = ERR_DEV_VALUES; + + return 1; + } + + return 0; +#else + errnum = ERR_UNRECOGNIZED; + return 1; +#endif +} + +static struct builtin builtin_bootp = +{ + "bootp", + bootp_func, + BUILTIN_CMDLINE | BUILTIN_MENU, + "bootp", + "Initialize a network device via BOOTP." +}; + + +/* cat */ static int cat_func (char *arg, int flags) { @@ -582,6 +617,24 @@ static struct builtin builtin_device = " can be used only in the grub shell." }; + +/* dhcp */ +static int +dhcp_func (char *arg, int flags) +{ + /* For now, this is an alias for bootp. */ + return bootp_func (arg, flags); +} + +static struct builtin builtin_dhcp = +{ + "dhcp", + dhcp_func, + BUILTIN_CMDLINE | BUILTIN_MENU, + "dhcp", + "Initialize a network device via DHCP." +}; + /* displaymem */ static int @@ -1928,6 +1981,35 @@ static struct builtin builtin_quit = "Exit from the GRUB shell." }; + +static int +rarp_func (char *arg, int flags) +{ +#ifdef SUPPORT_NETBOOT + if (! rarp ()) + { + if (errnum == ERR_NONE) + errnum = ERR_DEV_VALUES; + + return 1; + } + + return 0; +#else + errnum = ERR_UNRECOGNIZED; + return 1; +#endif +} + +static struct builtin builtin_rarp = +{ + "rarp", + rarp_func, + BUILTIN_CMDLINE | BUILTIN_MENU, + "rarp", + "Initialize a network device via RARP." +}; + static int read_func (char *arg, int flags) @@ -2718,6 +2800,7 @@ struct builtin *builtin_table[] = { &builtin_blocklist, &builtin_boot, + &builtin_bootp, &builtin_cat, &builtin_chainloader, &builtin_color, @@ -2725,6 +2808,7 @@ struct builtin *builtin_table[] = &builtin_debug, &builtin_default, &builtin_device, + &builtin_dhcp, &builtin_displaymem, &builtin_embed, &builtin_fallback, @@ -2745,6 +2829,7 @@ struct builtin *builtin_table[] = &builtin_password, &builtin_pause, &builtin_quit, + &builtin_rarp, &builtin_read, &builtin_root, &builtin_rootnoverify,