51
48
#define MOD_BUF_ALLOC_UNIT 4096
53
static int kernel_type = KERNEL_TYPE_NONE;
50
static int kernel_type;
54
51
static grub_dl_t my_mod;
55
52
static grub_addr_t entry, entry_hi, kern_start, kern_end;
56
53
static grub_uint32_t bootflags;
57
54
static char *mod_buf;
58
55
static grub_uint32_t mod_buf_len, mod_buf_max, kern_end_mdofs;
59
56
static int is_elf_kernel, is_64bit;
60
static char *netbsd_root = NULL;
61
static grub_uint32_t openbsd_root;
63
static const struct grub_arg_option freebsd_opts[] =
65
{"dual", 'D', 0, "Display output on all consoles.", 0, 0},
66
{"serial", 'h', 0, "Use serial console.", 0, 0},
67
{"askname", 'a', 0, "Ask for file name to reboot from.", 0, 0},
68
{"cdrom", 'C', 0, "Use cdrom as root.", 0, 0},
69
{"config", 'c', 0, "Invoke user configuration routing.", 0, 0},
70
{"kdb", 'd', 0, "Enter in KDB on boot.", 0, 0},
71
{"gdb", 'g', 0, "Use GDB remote debugger instead of DDB.", 0, 0},
72
{"mute", 'm', 0, "Disable all boot output.", 0, 0},
73
{"nointr", 'n', 0, "", 0, 0},
74
{"pause", 'p', 0, "Wait for keypress after every line of output.", 0, 0},
75
{"quiet", 'q', 0, "", 0, 0},
76
{"dfltroot", 'r', 0, "Use compiled-in rootdev.", 0, 0},
77
{"single", 's', 0, "Boot into single mode.", 0, 0},
78
{"verbose", 'v', 0, "Boot with verbose messages.", 0, 0},
58
static const char freebsd_opts[] = "DhaCcdgmnpqrsv";
82
59
static const grub_uint32_t freebsd_flags[] =
84
61
FREEBSD_RB_DUAL, FREEBSD_RB_SERIAL, FREEBSD_RB_ASKNAME,
85
62
FREEBSD_RB_CDROM, FREEBSD_RB_CONFIG, FREEBSD_RB_KDB,
86
63
FREEBSD_RB_GDB, FREEBSD_RB_MUTE, FREEBSD_RB_NOINTR,
87
64
FREEBSD_RB_PAUSE, FREEBSD_RB_QUIET, FREEBSD_RB_DFLTROOT,
88
FREEBSD_RB_SINGLE, FREEBSD_RB_VERBOSE, 0
65
FREEBSD_RB_SINGLE, FREEBSD_RB_VERBOSE
91
static const struct grub_arg_option openbsd_opts[] =
93
{"askname", 'a', 0, "Ask for file name to reboot from.", 0, 0},
94
{"halt", 'b', 0, "Don't reboot, just halt.", 0, 0},
95
{"config", 'c', 0, "Change configured devices.", 0, 0},
96
{"single", 's', 0, "Boot into single mode.", 0, 0},
97
{"kdb", 'd', 0, "Enter in KDB on boot.", 0, 0},
98
{"root", 'r', 0, "Set root device.", "wdXY", ARG_TYPE_STRING},
68
static const char openbsd_opts[] = "abcsd";
102
69
static const grub_uint32_t openbsd_flags[] =
104
71
OPENBSD_RB_ASKNAME, OPENBSD_RB_HALT, OPENBSD_RB_CONFIG,
105
OPENBSD_RB_SINGLE, OPENBSD_RB_KDB, 0
72
OPENBSD_RB_SINGLE, OPENBSD_RB_KDB
108
#define OPENBSD_ROOT_ARG (ARRAY_SIZE (openbsd_flags) - 1)
110
static const struct grub_arg_option netbsd_opts[] =
112
{"no-smp", '1', 0, "Disable SMP.", 0, 0},
113
{"no-acpi", '2', 0, "Disable ACPI.", 0, 0},
114
{"askname", 'a', 0, "Ask for file name to reboot from.", 0, 0},
115
{"halt", 'b', 0, "Don't reboot, just halt.", 0, 0},
116
{"config", 'c', 0, "Change configured devices.", 0, 0},
117
{"kdb", 'd', 0, "Enter in KDB on boot.", 0, 0},
118
{"miniroot", 'm', 0, "", 0, 0},
119
{"quiet", 'q', 0, "Don't display boot diagnostic messages.", 0, 0},
120
{"single", 's', 0, "Boot into single mode.", 0, 0},
121
{"verbose", 'v', 0, "Boot with verbose messages.", 0, 0},
122
{"debug", 'x', 0, "Boot with debug messages.", 0, 0},
123
{"silent", 'z', 0, "Supress normal output (warnings remain).", 0, 0},
124
{"root", 'r', 0, "Set root device.", "DEVICE", ARG_TYPE_STRING},
75
static const char netbsd_opts[] = "abcdmqsvxz";
128
76
static const grub_uint32_t netbsd_flags[] =
130
NETBSD_AB_NOSMP, NETBSD_AB_NOACPI, NETBSD_RB_ASKNAME,
131
NETBSD_RB_HALT, NETBSD_RB_USERCONFIG, NETBSD_RB_KDB,
132
NETBSD_RB_MINIROOT, NETBSD_AB_QUIET, NETBSD_RB_SINGLE,
133
NETBSD_AB_VERBOSE, NETBSD_AB_DEBUG, NETBSD_AB_SILENT, 0
78
NETBSD_RB_ASKNAME, NETBSD_RB_HALT, NETBSD_RB_USERCONFIG,
79
NETBSD_RB_KDB, NETBSD_RB_MINIROOT, NETBSD_AB_QUIET,
80
NETBSD_RB_SINGLE, NETBSD_AB_VERBOSE, NETBSD_AB_DEBUG,
136
#define NETBSD_ROOT_ARG (ARRAY_SIZE (netbsd_flags) - 1)
139
85
grub_bsd_get_device (grub_uint32_t * biosdev,
140
86
grub_uint32_t * unit,
629
562
static grub_err_t
630
563
grub_netbsd_boot (void)
565
struct grub_netbsd_btinfo_rootdevice *rootdev;
632
566
struct grub_netbsd_bootinfo *bootinfo;
634
struct grub_netbsd_btinfo_mmap_header *mmap;
635
struct grub_netbsd_btinfo_mmap_entry *pm;
638
auto int NESTED_FUNC_ATTR count_hook (grub_uint64_t, grub_uint64_t, grub_uint32_t);
639
int NESTED_FUNC_ATTR count_hook (grub_uint64_t addr __attribute__ ((unused)),
640
grub_uint64_t size __attribute__ ((unused)),
641
grub_uint32_t type __attribute__ ((unused)))
647
auto int NESTED_FUNC_ATTR fill_hook (grub_uint64_t, grub_uint64_t, grub_uint32_t);
648
int NESTED_FUNC_ATTR fill_hook (grub_uint64_t addr, grub_uint64_t size, grub_uint32_t type)
655
case GRUB_MACHINE_MEMORY_AVAILABLE:
656
pm->type = NETBSD_MMAP_AVAILABLE;
659
case GRUB_MACHINE_MEMORY_ACPI:
660
pm->type = NETBSD_MMAP_ACPI;
663
case GRUB_MACHINE_MEMORY_NVS:
664
pm->type = NETBSD_MMAP_NVS;
668
pm->type = NETBSD_MMAP_RESERVED;
676
grub_mmap_iterate (count_hook);
678
if (kern_end + sizeof (struct grub_netbsd_btinfo_rootdevice)
679
+ sizeof (struct grub_netbsd_bootinfo)
680
+ sizeof (struct grub_netbsd_btinfo_mmap_header)
681
+ count * sizeof (struct grub_netbsd_btinfo_mmap_entry)
682
> grub_os_area_addr + grub_os_area_size)
683
return grub_error (GRUB_ERR_OUT_OF_MEMORY, "No memory for boot info.");
685
curarg = mmap = (struct grub_netbsd_btinfo_mmap_header *) kern_end;
686
pm = (struct grub_netbsd_btinfo_mmap_entry *) (mmap + 1);
688
grub_mmap_iterate (fill_hook);
689
mmap->common.type = NETBSD_BTINFO_MEMMAP;
690
mmap->common.len = (char *) pm - (char *) mmap;
696
struct grub_netbsd_btinfo_rootdevice *rootdev;
698
rootdev = (struct grub_netbsd_btinfo_rootdevice *) curarg;
700
rootdev->common.len = sizeof (struct grub_netbsd_btinfo_rootdevice);
701
rootdev->common.type = NETBSD_BTINFO_ROOTDEVICE;
702
grub_strncpy (rootdev->devname, netbsd_root, sizeof (rootdev->devname));
704
bootinfo = (struct grub_netbsd_bootinfo *) (rootdev + 1);
705
bootinfo->bi_count = 2;
706
bootinfo->bi_data[0] = mmap;
707
bootinfo->bi_data[1] = rootdev;
711
bootinfo = (struct grub_netbsd_bootinfo *) curarg;
712
bootinfo->bi_count = 1;
713
bootinfo->bi_data[0] = mmap;
567
grub_uint32_t biosdev, unit, slice, part;
569
grub_bsd_get_device (&biosdev, &unit, &slice, &part);
571
rootdev = (struct grub_netbsd_btinfo_rootdevice *) GRUB_BSD_TEMP_BUFFER;
573
rootdev->common.len = sizeof (struct grub_netbsd_btinfo_rootdevice);
574
rootdev->common.type = NETBSD_BTINFO_ROOTDEVICE;
575
grub_sprintf (rootdev->devname, "%cd%d%c", (biosdev & 0x80) ? 'w' : 'f',
578
bootinfo = (struct grub_netbsd_bootinfo *) (rootdev + 1);
579
bootinfo->bi_count = 1;
580
bootinfo->bi_data[0] = rootdev;
716
582
grub_unix_real_boot (entry, bootflags, 0, bootinfo,
717
0, (grub_uint32_t) (grub_mmap_get_upper () >> 10),
718
(grub_uint32_t) (grub_mmap_get_lower () >> 10));
583
0, grub_mmap_get_upper () >> 10,
584
grub_mmap_get_lower () >> 10);
720
586
/* Not reached. */
721
587
return GRUB_ERR_NONE;
1014
881
static grub_err_t
1015
grub_cmd_openbsd (grub_extcmd_t cmd, int argc, char *argv[])
882
grub_cmd_openbsd (grub_command_t cmd __attribute__ ((unused)),
883
int argc, char *argv[])
1017
grub_uint32_t bootdev;
1019
885
kernel_type = KERNEL_TYPE_OPENBSD;
1020
bootflags = grub_bsd_parse_flags (cmd->state, openbsd_flags);
1022
if (cmd->state[OPENBSD_ROOT_ARG].set)
1024
const char *arg = cmd->state[OPENBSD_ROOT_ARG].arg;
1026
if (*(arg++) != 'w' || *(arg++) != 'd')
1027
return grub_error (GRUB_ERR_BAD_ARGUMENT,
1028
"Only device specifications of form "
1029
"wd<number><lowercase letter> are supported.");
1031
unit = grub_strtoul (arg, (char **) &arg, 10);
1032
if (! (arg && *arg >= 'a' && *arg <= 'z'))
1033
return grub_error (GRUB_ERR_BAD_ARGUMENT,
1034
"Only device specifications of form "
1035
"wd<number><lowercase letter> are supported.");
1039
bootdev = (OPENBSD_B_DEVMAGIC + (unit << OPENBSD_B_UNITSHIFT) +
1040
(part << OPENBSD_B_PARTSHIFT));
886
bootflags = ((argc <= 1) ? 0 :
887
grub_bsd_parse_flags (argv[1], openbsd_opts, openbsd_flags));
1045
889
if (grub_bsd_load (argc, argv) == GRUB_ERR_NONE)
1047
grub_loader_set (grub_openbsd_boot, grub_bsd_unload, 1);
1048
openbsd_root = bootdev;
890
grub_loader_set (grub_openbsd_boot, grub_bsd_unload, 1);
1051
892
return grub_errno;
1054
895
static grub_err_t
1055
grub_cmd_netbsd (grub_extcmd_t cmd, int argc, char *argv[])
896
grub_cmd_netbsd (grub_command_t cmd __attribute__ ((unused)),
897
int argc, char *argv[])
1057
899
kernel_type = KERNEL_TYPE_NETBSD;
1058
bootflags = grub_bsd_parse_flags (cmd->state, netbsd_flags);
900
bootflags = ((argc <= 1) ? 0 :
901
grub_bsd_parse_flags (argv[1], netbsd_opts, netbsd_flags));
1060
903
if (grub_bsd_load (argc, argv) == GRUB_ERR_NONE)
1062
grub_loader_set (grub_netbsd_boot, grub_bsd_unload, 1);
1063
if (cmd->state[NETBSD_ROOT_ARG].set)
1064
netbsd_root = grub_strdup (cmd->state[NETBSD_ROOT_ARG].arg);
904
grub_loader_set (grub_netbsd_boot, grub_bsd_unload, 1);
1067
906
return grub_errno;
1276
static grub_extcmd_t cmd_freebsd, cmd_openbsd, cmd_netbsd;
1103
static grub_command_t cmd_freebsd, cmd_openbsd, cmd_netbsd;
1277
1104
static grub_command_t cmd_freebsd_loadenv, cmd_freebsd_module;
1278
1105
static grub_command_t cmd_freebsd_module_elf;
1280
1107
GRUB_MOD_INIT (bsd)
1282
cmd_freebsd = grub_register_extcmd ("kfreebsd", grub_cmd_freebsd,
1283
GRUB_COMMAND_FLAG_BOTH,
1284
"kfreebsd FILE", "Load kernel of FreeBSD.",
1286
cmd_openbsd = grub_register_extcmd ("kopenbsd", grub_cmd_openbsd,
1287
GRUB_COMMAND_FLAG_BOTH,
1288
"kopenbsd FILE", "Load kernel of OpenBSD.",
1290
cmd_netbsd = grub_register_extcmd ("knetbsd", grub_cmd_netbsd,
1291
GRUB_COMMAND_FLAG_BOTH,
1292
"knetbsd FILE", "Load kernel of NetBSD.",
1110
grub_register_command ("freebsd", grub_cmd_freebsd,
1111
0, "load freebsd kernel");
1113
grub_register_command ("openbsd", grub_cmd_openbsd,
1114
0, "load openbsd kernel");
1116
grub_register_command ("netbsd", grub_cmd_netbsd,
1117
0, "load netbsd kernel");
1294
1118
cmd_freebsd_loadenv =
1295
grub_register_command ("kfreebsd_loadenv", grub_cmd_freebsd_loadenv,
1296
0, "load FreeBSD env");
1119
grub_register_command ("freebsd_loadenv", grub_cmd_freebsd_loadenv,
1120
0, "load freebsd env");
1297
1121
cmd_freebsd_module =
1298
grub_register_command ("kfreebsd_module", grub_cmd_freebsd_module,
1299
0, "load FreeBSD kernel module");
1122
grub_register_command ("freebsd_module", grub_cmd_freebsd_module,
1123
0, "load freebsd module");
1300
1124
cmd_freebsd_module_elf =
1301
grub_register_command ("kfreebsd_module_elf", grub_cmd_freebsd_module_elf,
1302
0, "load FreeBSD kernel module (ELF)");
1125
grub_register_command ("freebsd_module_elf", grub_cmd_freebsd_module_elf,
1126
0, "load freebsd ELF module");
1307
1131
GRUB_MOD_FINI (bsd)
1309
grub_unregister_extcmd (cmd_freebsd);
1310
grub_unregister_extcmd (cmd_openbsd);
1311
grub_unregister_extcmd (cmd_netbsd);
1133
grub_unregister_command (cmd_freebsd);
1134
grub_unregister_command (cmd_openbsd);
1135
grub_unregister_command (cmd_netbsd);
1313
1137
grub_unregister_command (cmd_freebsd_loadenv);
1314
1138
grub_unregister_command (cmd_freebsd_module);