+2008-07-11 Pavel Roskin <proski@gnu.org>
+
+ * term/i386/pc/serial.c (GRUB_SERIAL_PORT_NUM): New constant.
+ [!GRUB_MACHINE_PCBIOS] (serial_hw_io_addr): Add COM2 and COM3.
+ (serial_hw_get_port): Check validity of the port number.
+ (grub_cmd_serial): Check return value of serial_hw_get_port().
+
2008-07-07 Pavel Roskin <proski@gnu.org>
* boot/i386/pc/diskboot.S (notification_string): Replace
#ifdef GRUB_MACHINE_PCBIOS
/* The BIOS data area. */
static const unsigned short *serial_hw_io_addr = (const unsigned short *) 0x0400;
+#define GRUB_SERIAL_PORT_NUM 4
#else
-static const unsigned short serial_hw_io_addr[] = { 0x3f8, 0x2f8 };
+static const unsigned short serial_hw_io_addr[] = { 0x3f8, 0x2f8, 0x3e8, 0x2e8 };
+#define GRUB_SERIAL_PORT_NUM (sizeof(serial_hw_io_addr)/(serial_hw_io_addr[0]))
#endif
/* Return the port number for the UNITth serial device. */
static inline unsigned short
-serial_hw_get_port (const unsigned short unit)
+serial_hw_get_port (const unsigned int unit)
{
- return serial_hw_io_addr[unit];
+ if (unit < GRUB_SERIAL_PORT_NUM)
+ return serial_hw_io_addr[unit];
+ else
+ return 0;
}
/* Fetch a key. */
{
struct serial_port backup_settings = serial_settings;
grub_err_t hwiniterr;
- int arg;
if (state[0].set)
{
- arg = grub_strtoul (state[0].arg, 0, 0);
- if (arg >= 0 && arg < 4)
- serial_settings.port = serial_hw_get_port ((int) arg);
- else
+ unsigned int unit;
+
+ unit = grub_strtoul (state[0].arg, 0, 0);
+ serial_settings.port = serial_hw_get_port (unit);
+ if (!serial_settings.port)
return grub_error (GRUB_ERR_BAD_ARGUMENT, "bad unit number.");
}