165 lines
4.2 KiB
C
165 lines
4.2 KiB
C
#include <stdint.h>
|
|
#include <stddef.h>
|
|
|
|
#include "options.h"
|
|
#include "util.h"
|
|
#include "menu.h"
|
|
#include "text.h"
|
|
#include "multiboot.h"
|
|
#include "editor.h"
|
|
|
|
/* Basic text strings */
|
|
#define BASE_VERSION "ToaruOS Bootloader v4.0"
|
|
char * VERSION_TEXT = BASE_VERSION
|
|
#ifdef EFI_PLATFORM
|
|
" (EFI)";
|
|
#else
|
|
" (BIOS)";
|
|
#endif
|
|
char * HELP_TEXT = "<Enter> to boot, <e> to edit, or select a menu option with \030/\031/\032/\033.";
|
|
char * HELP_TEXT_OPT = "<Enter> to toggle, or select another option with \030/\031/\032/\033.";
|
|
char * COPYRIGHT_TEXT = "ToaruOS is free software under the NCSA license.";
|
|
char * LINK_TEXT = "https://toaruos.org - https://github.com/klange/toaruos";
|
|
|
|
/* Boot command line strings */
|
|
#define DEFAULT_ROOT_CMDLINE "root=/dev/ram0 "
|
|
#define DEFAULT_GRAPHICAL_CMDLINE "start=live-session "
|
|
#define DEFAULT_SINGLE_CMDLINE "start=terminal\037-F "
|
|
#define DEFAULT_TEXT_CMDLINE "start=--vga vid=text "
|
|
#define DEFAULT_VID_CMDLINE "vid=auto,1440,900 "
|
|
#define MIGRATE_CMDLINE "migrate "
|
|
#define DEFAULT_HEADLESS_CMDLINE "start=--headless "
|
|
|
|
char * kernel_path = "KERNEL.";
|
|
char * ramdisk_path = "RAMDISK.IGZ";
|
|
char cmdline[1024] = {0};
|
|
|
|
/* Names of the available boot modes. */
|
|
struct bootmode boot_mode_names[] = {
|
|
{1, "normal", "Normal Boot"},
|
|
#ifdef EFI_PLATFORM
|
|
{2, "video", "Configure Video Output"},
|
|
#else
|
|
{2, "vga", "VGA Text Mode"},
|
|
#endif
|
|
{3, "single", "Single-User Graphical Terminal"},
|
|
{4, "headless", "Headless"},
|
|
};
|
|
|
|
int base_sel = 0;
|
|
|
|
int kmain() {
|
|
BOOT_SET();
|
|
|
|
BOOT_OPTION(_debug, 0, "Debug output",
|
|
"Enable debug output in the bootloader and enable the",
|
|
"serial debug log in the operating system itself.");
|
|
|
|
BOOT_OPTION(_smp, 1, "Enable SMP",
|
|
"SMP support may not be completely stable and can be",
|
|
"disabled with this option if desired.");
|
|
|
|
BOOT_OPTION(_vbox, 1, "VirtualBox Guest Additions",
|
|
"Enable integration with VirtualBox, including",
|
|
"automatic mode setting and absolute mouse pointer.");
|
|
|
|
BOOT_OPTION(_vboxrects, 0, "VirtualBox Seamless support",
|
|
"(Requires Guest Additions) Enables support for the",
|
|
"Seamless Desktop mode in VirtualBox.");
|
|
|
|
BOOT_OPTION(_vboxpointer, 1, "VirtualBox Pointer",
|
|
"(Requires Guest Additions) Enables support for the",
|
|
"VirtualBox hardware pointer mapping.");
|
|
|
|
BOOT_OPTION(_vmware, 1, "VMWare driver",
|
|
"Enable the VMware / QEMU absolute mouse pointer,",
|
|
"and optional guest scaling.");
|
|
|
|
BOOT_OPTION(_vmwareres, 1, "VMware guest size",
|
|
"(Requires VMware driver) Enables support for",
|
|
"automatically setting display size in VMware");
|
|
|
|
BOOT_OPTION(_qemubug, 0, "QEMU PS/2 workaround",
|
|
"Work around a bug in QEMU's PS/2 controller",
|
|
"prior to 6.0.50.");
|
|
|
|
BOOT_OPTION(_migrate, 1, "Writable root",
|
|
"Migrates the ramdisk from tarball to an in-memory",
|
|
"temporary filesystem at boot. Needed for packages.");
|
|
|
|
while (1) {
|
|
/* Loop over rendering the menu */
|
|
show_menu();
|
|
|
|
#ifdef EFI_PLATFORM
|
|
if (boot_mode == 2) {
|
|
extern int video_menu(void);
|
|
video_menu();
|
|
boot_edit = 0;
|
|
memset(cmdline, 0, 1024);
|
|
continue;
|
|
}
|
|
#endif
|
|
|
|
/* Build our command line. */
|
|
strcat(cmdline, DEFAULT_ROOT_CMDLINE);
|
|
|
|
if (_migrate) {
|
|
strcat(cmdline, MIGRATE_CMDLINE);
|
|
}
|
|
|
|
char * _video_command_line = DEFAULT_VID_CMDLINE;
|
|
|
|
if (boot_mode == 1) {
|
|
strcat(cmdline, DEFAULT_GRAPHICAL_CMDLINE);
|
|
strcat(cmdline, _video_command_line);
|
|
} else if (boot_mode == 2) {
|
|
strcat(cmdline, DEFAULT_TEXT_CMDLINE);
|
|
} else if (boot_mode == 3) {
|
|
strcat(cmdline, DEFAULT_SINGLE_CMDLINE);
|
|
strcat(cmdline, _video_command_line);
|
|
} else if (boot_mode == 4) {
|
|
strcat(cmdline, DEFAULT_HEADLESS_CMDLINE);
|
|
}
|
|
|
|
if (_debug) {
|
|
txt_debug = 1;
|
|
}
|
|
|
|
if (!_vbox) {
|
|
strcat(cmdline, "novbox ");
|
|
}
|
|
|
|
if (_vbox && !_vboxrects) {
|
|
strcat(cmdline, "novboxseamless ");
|
|
}
|
|
|
|
if (_vbox && !_vboxpointer) {
|
|
strcat(cmdline, "novboxpointer ");
|
|
}
|
|
|
|
if (_vmware && !_vmwareres) {
|
|
strcat(cmdline, "novmwareresset ");
|
|
}
|
|
|
|
if (!_smp) {
|
|
strcat(cmdline, "nosmp ");
|
|
}
|
|
|
|
if (_qemubug) {
|
|
strcat(cmdline, "sharedps2 ");
|
|
}
|
|
|
|
if (!boot_edit) break;
|
|
if (boot_editor()) break;
|
|
|
|
boot_edit = 0;
|
|
memset(cmdline, 0, 1024);
|
|
}
|
|
|
|
boot();
|
|
|
|
while (1) {}
|
|
return 0;
|
|
}
|