X-Git-Url: http://git.ozlabs.org/?p=petitboot;a=blobdiff_plain;f=discover%2Fplatform.c;h=04798ac8a4912e12e1f81a601f4eaaae8b1012c5;hp=65e9ed4acb4af5662b9a1a3006715226b9c9954d;hb=a2bf5c1d47998a13351ccb6c35e3cf8f6e79909b;hpb=6897abaa97a02e0ab8ac07209a5e4966bfe101c5 diff --git a/discover/platform.c b/discover/platform.c index 65e9ed4..04798ac 100644 --- a/discover/platform.c +++ b/discover/platform.c @@ -1,7 +1,11 @@ +#define _GNU_SOURCE + +#include #include #include +#include #include #include @@ -11,6 +15,8 @@ void *platform_ctx; static struct platform *platform; static struct config *config; +static const char *kernel_cmdline_debug = "petitboot.debug"; + static const char *device_type_name(enum device_type type) { switch (type) { @@ -73,6 +79,9 @@ static void dump_config(struct config *config) for (i = 0; i < config->network.n_dns_servers; i++) pb_log(" dns server %s\n", config->network.dns_servers[i]); + if (config->boot_device) + pb_log(" boot device %s\n", config->boot_device); + if (config->n_boot_priorities) pb_log(" boot priority order:\n"); @@ -82,9 +91,32 @@ static void dump_config(struct config *config) prio->priority); } + pb_log(" IPMI boot device 0x%02x%s\n", config->ipmi_bootdev, + config->ipmi_bootdev_persistent ? " (persistent)" : ""); + + pb_log(" language: %s\n", config->lang ?: ""); } +static bool config_debug_on_cmdline(void) +{ + char buf[600]; + int rc, fd; + + fd = open("/proc/cmdline", O_RDONLY); + if (fd < 0) + return false; + + rc = read(fd, buf, sizeof(buf)); + close(fd); + + if (rc <= 0) + return false; + + return memmem(buf, rc, kernel_cmdline_debug, + strlen(kernel_cmdline_debug)) != NULL; +} + void config_set_defaults(struct config *config) { config->autoboot_enabled = true; @@ -102,9 +134,14 @@ void config_set_defaults(struct config *config) config->boot_priorities = talloc_array(config, struct boot_priority, config->n_boot_priorities); config->boot_priorities[0].type = DEVICE_TYPE_NETWORK; - config->boot_priorities[0].priority = 2; - config->boot_priorities[1].type = DEVICE_TYPE_DISK; + config->boot_priorities[0].priority = 0; + config->boot_priorities[1].type = DEVICE_TYPE_ANY; config->boot_priorities[1].priority = 1; + + config->ipmi_bootdev = 0; + config->ipmi_bootdev_persistent = false; + + config->debug = config_debug_on_cmdline(); } int platform_init(void *ctx) @@ -143,6 +180,14 @@ const struct platform *platform_get(void) return platform; } +void platform_pre_boot(void) +{ + const struct config *config = config_get(); + + if (platform && config && platform->pre_boot) + platform->pre_boot(platform, config); +} + int platform_get_sysinfo(struct system_info *info) { if (platform && platform->get_sysinfo)