176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/* ----------------------------------------------------------------------- * 276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * 376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * Copyright 2009 Erwan Velu - All Rights Reserved 476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * 576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * Permission is hereby granted, free of charge, to any person 676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * obtaining a copy of this software and associated documentation 776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * files (the "Software"), to deal in the Software without 876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * restriction, including without limitation the rights to use, 976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * copy, modify, merge, publish, distribute, sublicense, and/or 1076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * sell copies of the Software, and to permit persons to whom 1176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * the Software is furnished to do so, subject to the following 1276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * conditions: 1376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * 1476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * The above copyright notice and this permission notice shall 1576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * be included in all copies or substantial portions of the Software. 1676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * 1776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 1876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES 1976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 2076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT 2176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, 2276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 2376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 2476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * OTHER DEALINGS IN THE SOFTWARE. 2576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * 2676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * ----------------------------------------------------------------------- 2776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman*/ 2876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 2976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#include <stdlib.h> 3076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#include <string.h> 3176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#include <stdio.h> 3276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#include <getkey.h> 3376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#include "syslinux/config.h" 3476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#include "../lib/sys/vesa/vesa.h" 3576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#include "hdt-common.h" 3676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#include <disk/util.h> 3776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#include <disk/mbrs.h> 3876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#include <memory.h> 3976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 4076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/* ISOlinux requires a 8.3 format */ 4176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanvoid convert_isolinux_filename(char *filename, struct s_hardware *hardware) 4276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman{ 4376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman /* Exit if we are not running ISOLINUX */ 4476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (hardware->sv->filesystem != SYSLINUX_FS_ISOLINUX) 4576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman return; 4676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman /* Searching the dot */ 4776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman char *dot = strchr(filename, '.'); 4876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman /* Exiting if no dot exists in that string */ 4976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (dot == NULL) 5076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman return; 5176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman /* Exiting if the extension is 3 char or less */ 5276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (strlen(dot) <= 4) 5376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman return; 5476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 5576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman /* We have an extension bigger than .blah 5676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * so we have to shorten it to 3*/ 5776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman dot[4] = '\0'; 5876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} 5976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 6076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanvoid detect_parameters(const int argc, const char *argv[], 6176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman struct s_hardware *hardware) 6276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman{ 6376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman /* Quiet mode - make the output more quiet */ 6476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman quiet = true; 6576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 6676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman /* Silent mode - make not output at all */ 6776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman silent = false; 6876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 6976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman /* Vesa mode isn't set until we explictly call it */ 7076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman vesamode = false; 7176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 7276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman /* Automode isn't the default*/ 7376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman automode = false; 7476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 7576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman /* Menu mode is the default*/ 7676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman menumode = true; 7776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 7876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman for (int i = 1; i < argc; i++) { 7976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (!strncmp(argv[i], "quiet", 5)) { 8076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman quiet = true; 8176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } else if (!strncmp(argv[i], "silent", 6)) { 8276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman silent = true; 8376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } else if (!strncmp(argv[i], "verbose", 7)) { 8476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman quiet = false; 8576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } else if (!strncmp(argv[i], "modules_pcimap=", 15)) { 8676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman strlcpy(hardware->modules_pcimap_path, argv[i] + 15, 8776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman sizeof(hardware->modules_pcimap_path)); 8876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman convert_isolinux_filename(hardware->modules_pcimap_path, hardware); 8976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } else if (!strncmp(argv[i], "pciids=", 7)) { 9076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman strlcpy(hardware->pciids_path, argv[i] + 7, 9176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman sizeof(hardware->pciids_path)); 9276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman convert_isolinux_filename(hardware->pciids_path, hardware); 9376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } else if (!strncmp(argv[i], "modules_alias=", 14)) { 9476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman strlcpy(hardware->modules_alias_path, argv[i] + 14, 9576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman sizeof(hardware->modules_alias_path)); 9676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman convert_isolinux_filename(hardware->modules_alias_path, hardware); 9776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } else if (!strncmp(argv[i], "memtest=", 8)) { 9876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman strlcpy(hardware->memtest_label, argv[i] + 8, 9976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman sizeof(hardware->memtest_label)); 10076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman convert_isolinux_filename(hardware->memtest_label, hardware); 10176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } else if (!strncmp(argv[i], "vesa", 4)) { 10276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman vesamode = true; 10376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman max_console_lines = MAX_VESA_CLI_LINES; 10476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman /* If the user defines a background image */ 10576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (!strncmp(argv[i], "vesa=", 5)) { 10676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman strlcpy(hardware->vesa_background, argv[i] + 5, 10776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman sizeof(hardware->vesa_background)); 10876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } 10976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } else if (!strncmp(argv[i], "novesa", 6)) { 11076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman vesamode = false; 11176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman max_console_lines = MAX_CLI_LINES; 11276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } else if (!strncmp(argv[i], "nomenu", 6)) { 11376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman menumode = false; 11476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } else if (!strncmp(argv[i], "dump_filename=", 14)) { 11576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman strlcpy(hardware->dump_filename, argv[i] + 14, 11676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman sizeof(hardware->dump_filename)); 11776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } else if (!strncmp(argv[i], "dump_path=", 10)) { 11876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman strlcpy(hardware->dump_path, argv[i] + 10, 11976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman sizeof(hardware->dump_path)); 12076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } else if (!strncmp(argv[i], "tftp_ip=", 8)) { 12176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman strlcpy(hardware->tftp_ip, argv[i] + 8, 12276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman sizeof(hardware->tftp_ip)); 12376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } else if (!strncmp(argv[i], "postexec=", 9)) { 12476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman /* The postexec= parameter is separated in several argv[] 12576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * as it can contains spaces. 12676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * We use the AUTO_DELIMITER char to define the limits 12776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * of this parameter. 12876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * i.e postexec='linux memtest.bin' 12976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman */ 13076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 13176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman char *argument = (char*)argv[i]+10; 13276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman /* Extracting the first parameter */ 13376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman strcpy(hardware->postexec, argument); 13476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 13576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman /* While we can't find the other AUTO_DELIMITER, let's process the argv[] */ 13676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman while ((strchr(argument, AUTO_DELIMITER) == NULL) && (i+1<argc)) { 13776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman i++; 13876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman argument = (char *)argv[i]; 13976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman strcat(hardware->postexec, " "); 14076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman strcat(hardware->postexec, argument); 14176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } 14276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 14376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman hardware->postexec[strlen(hardware->postexec) - 1] = 0; 14476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } else if (!strncmp(argv[i], "auto=", 5)) { 14576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman /* The auto= parameter is separated in several argv[] 14676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * as it can contains spaces. 14776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * We use the AUTO_DELIMITER char to define the limits 14876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * of this parameter. 14976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * i.e auto='show dmi; show pci' 15076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman */ 15176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 15276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman automode=true; 15376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman char *argument = (char*)argv[i]+6; 15476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman /* Extracting the first parameter */ 15576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman strcpy(hardware->auto_label, argument); 15676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 15776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman /* While we can't find the other AUTO_DELIMITER, let's process the argv[] */ 15876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman while ((strchr(argument, AUTO_DELIMITER) == NULL) && (i+1<argc)) { 15976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman i++; 16076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman argument = (char *)argv[i]; 16176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman strcat(hardware->auto_label, " "); 16276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman strcat(hardware->auto_label, argument); 16376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } 16476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 16576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman hardware->auto_label[strlen(hardware->auto_label) - 1] = 0; 16676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } 16776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } 16876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} 16976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 17076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanvoid detect_syslinux(struct s_hardware *hardware) 17176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman{ 17276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman hardware->sv = syslinux_version(); 17376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman switch (hardware->sv->filesystem) { 17476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman case SYSLINUX_FS_SYSLINUX: 17576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman strlcpy(hardware->syslinux_fs, "SYSlinux", 9); 17676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman break; 17776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman case SYSLINUX_FS_PXELINUX: 17876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman strlcpy(hardware->syslinux_fs, "PXElinux", 9); 17976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman break; 18076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman case SYSLINUX_FS_ISOLINUX: 18176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman strlcpy(hardware->syslinux_fs, "ISOlinux", 9); 18276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman break; 18376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman case SYSLINUX_FS_EXTLINUX: 18476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman strlcpy(hardware->syslinux_fs, "EXTlinux", 9); 18576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman break; 18676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman case SYSLINUX_FS_UNKNOWN: 18776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman default: 18876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman strlcpy(hardware->syslinux_fs, "Unknown Bootloader", 18976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman sizeof hardware->syslinux_fs); 19076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman break; 19176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } 19276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} 19376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 19476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanvoid init_hardware(struct s_hardware *hardware) 19576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman{ 19676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman hardware->pci_ids_return_code = 0; 19776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman hardware->modules_pcimap_return_code = 0; 19876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman hardware->modules_alias_return_code = 0; 19976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman hardware->cpu_detection = false; 20076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman hardware->pci_detection = false; 20176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman hardware->disk_detection = false; 20276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman hardware->disks_count = 0; 20376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman hardware->dmi_detection = false; 20476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman hardware->pxe_detection = false; 20576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman hardware->vesa_detection = false; 20676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman hardware->vpd_detection = false; 20776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman hardware->memory_detection = false; 20876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman hardware->acpi_detection = false; 20976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman hardware->nb_pci_devices = 0; 21076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman hardware->is_dmi_valid = false; 21176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman hardware->is_pxe_valid = false; 21276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman hardware->is_vpd_valid = false; 21376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman hardware->is_acpi_valid = false; 21476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman hardware->pci_domain = NULL; 21576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman hardware->detected_memory_size = 0; 21676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman hardware->physical_cpu_count =1; /* we have at least one cpu */ 21776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 21876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman /* Cleaning structures */ 21976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman memset(hardware->disk_info, 0, sizeof(hardware->disk_info)); 22076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman memset(hardware->mbr_ids, 0, sizeof(hardware->mbr_ids)); 22176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman memset(&hardware->dmi, 0, sizeof(s_dmi)); 22276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman memset(&hardware->cpu, 0, sizeof(s_cpu)); 22376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman memset(&hardware->pxe, 0, sizeof(struct s_pxe)); 22476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman memset(&hardware->vesa, 0, sizeof(struct s_vesa)); 22576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman memset(&hardware->vpd, 0, sizeof(s_vpd)); 22676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman memset(&hardware->acpi, 0, sizeof(s_acpi)); 22776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman memset(hardware->syslinux_fs, 0, sizeof hardware->syslinux_fs); 22876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman memset(hardware->pciids_path, 0, sizeof hardware->pciids_path); 22976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman memset(hardware->modules_pcimap_path, 0, 23076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman sizeof hardware->modules_pcimap_path); 23176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman memset(hardware->modules_alias_path, 0, 23276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman sizeof hardware->modules_alias_path); 23376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman memset(hardware->memtest_label, 0, sizeof hardware->memtest_label); 23476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman memset(hardware->auto_label, 0, sizeof hardware->auto_label); 23576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman memset(hardware->dump_path, 0, sizeof hardware->dump_path); 23676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman memset(hardware->dump_filename, 0, sizeof hardware->dump_filename); 23776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman memset(hardware->vesa_background, 0, sizeof hardware->vesa_background); 23876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman memset(hardware->tftp_ip, 0, sizeof hardware->tftp_ip); 23976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman memset(hardware->postexec, 0, sizeof hardware->postexec); 24076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman strcat(hardware->dump_path, "hdt"); 24176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman strcat(hardware->dump_filename, "%{m}+%{p}+%{v}"); 24276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman strcat(hardware->pciids_path, "pci.ids"); 24376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman strcat(hardware->modules_pcimap_path, "modules.pcimap"); 24476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman strcat(hardware->modules_alias_path, "modules.alias"); 24576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman strcat(hardware->memtest_label, "memtest"); 24676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman strlcpy(hardware->vesa_background, CLI_DEFAULT_BACKGROUND, 24776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman sizeof(hardware->vesa_background)); 24876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} 24976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 25076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/* 25176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * Detecting if a DMI table exist 25276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * if yes, let's parse it 25376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman */ 25476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanint detect_dmi(struct s_hardware *hardware) 25576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman{ 25676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (hardware->dmi_detection == true) 25776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman return -1; 25876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman hardware->dmi_detection = true; 25976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (dmi_iterate(&hardware->dmi) == -ENODMITABLE) { 26076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman hardware->is_dmi_valid = false; 26176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman return -ENODMITABLE; 26276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } 26376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 26476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman parse_dmitable(&hardware->dmi); 26576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman hardware->is_dmi_valid = true; 26676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman return 0; 26776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} 26876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 26976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/* 27076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * Detecting ACPI 27176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * if yes, let's parse it 27276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman */ 27376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanint detect_acpi(struct s_hardware *hardware) 27476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman{ 27576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman int retval; 27676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (hardware->acpi_detection == true) 27776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman return -1; 27876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman hardware->acpi_detection = true; 27976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if ((retval=parse_acpi(&hardware->acpi)) != ACPI_FOUND) { 28076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman hardware->is_acpi_valid = false; 28176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman return retval; 28276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } 28376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 28476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman hardware->is_acpi_valid = true; 28576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman return retval; 28676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} 28776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 28876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** 28976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * vpd_detection - populate the VPD structure 29076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * 29176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * VPD is a structure available on IBM machines. 29276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * It is documented at: 29376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * http://www.pc.ibm.com/qtechinfo/MIGR-45120.html 29476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * (XXX the page seems to be gone) 29576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman **/ 29676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanint detect_vpd(struct s_hardware *hardware) 29776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman{ 29876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (hardware->vpd_detection) 29976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman return -1; 30076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman else 30176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman hardware->vpd_detection = true; 30276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 30376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (vpd_decode(&hardware->vpd) == -ENOVPDTABLE) { 30476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman hardware->is_vpd_valid = false; 30576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman return -ENOVPDTABLE; 30676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } else { 30776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman hardware->is_vpd_valid = true; 30876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman return 0; 30976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } 31076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} 31176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 31276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/* Detection vesa stuff*/ 31376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanint detect_vesa(struct s_hardware *hardware) 31476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman{ 31576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman static com32sys_t rm; 31676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman struct vesa_general_info *gi; 31776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman struct vesa_mode_info *mi; 31876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint16_t mode, *mode_ptr; 31976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman char *oem_ptr; 32076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman int rv = -1; 32176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 32276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (hardware->vesa_detection == true) 32376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman return -1; 32476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 32576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman hardware->vesa_detection = true; 32676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman hardware->is_vesa_valid = false; 32776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 32876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman gi = lmalloc(sizeof(*gi)); 32976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (!gi) 33076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman return -1; 33176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 33276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman mi = lmalloc(sizeof(*mi)); 33376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (!mi) 33476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman goto out; 33576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 33676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman gi->signature = VBE2_MAGIC; /* Get VBE2 extended data */ 33776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman memset(&rm, 0, sizeof rm); 33876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman rm.eax.w[0] = 0x4F00; /* Get SVGA general information */ 33976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman rm.edi.w[0] = OFFS(gi); 34076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman rm.es = SEG(gi); 34176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman __intcall(0x10, &rm, &rm); 34276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 34376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (rm.eax.w[0] != 0x004F) { 34476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman goto out; 34576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman }; 34676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 34776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman mode_ptr = GET_PTR(gi->video_mode_ptr); 34876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman oem_ptr = GET_PTR(gi->oem_vendor_name_ptr); 34976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman strlcpy(hardware->vesa.vendor, oem_ptr, sizeof(hardware->vesa.vendor)); 35076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman oem_ptr = GET_PTR(gi->oem_product_name_ptr); 35176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman strlcpy(hardware->vesa.product, oem_ptr, sizeof(hardware->vesa.product)); 35276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman oem_ptr = GET_PTR(gi->oem_product_rev_ptr); 35376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman strlcpy(hardware->vesa.product_revision, oem_ptr, 35476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman sizeof(hardware->vesa.product_revision)); 35576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 35676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman hardware->vesa.major_version = (gi->version >> 8) & 0xff; 35776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman hardware->vesa.minor_version = gi->version & 0xff; 35876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman hardware->vesa.total_memory = gi->total_memory; 35976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman hardware->vesa.software_rev = gi->oem_software_rev; 36076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 36176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman hardware->vesa.vmi_count = 0; 36276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 36376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman while ((mode = *mode_ptr++) != 0xFFFF) { 36476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 36576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman memset(&rm, 0, sizeof rm); 36676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman rm.eax.w[0] = 0x4F01; /* Get SVGA mode information */ 36776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman rm.ecx.w[0] = mode; 36876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman rm.edi.w[0] = OFFS(mi); 36976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman rm.es = SEG(mi); 37076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman __intcall(0x10, &rm, &rm); 37176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 37276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman /* Must be a supported mode */ 37376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (rm.eax.w[0] != 0x004f) 37476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman continue; 37576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 37676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman /* Saving detected values */ 37776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman memcpy(&hardware->vesa.vmi[hardware->vesa.vmi_count].mi, mi, 37876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman sizeof(struct vesa_mode_info)); 37976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman hardware->vesa.vmi[hardware->vesa.vmi_count].mode = mode; 38076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 38176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman hardware->vesa.vmi_count++; 38276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } 38376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman hardware->is_vesa_valid = true; 38476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 38576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman rv = 0; 38676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanout: 38776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman lfree(mi); 38876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman lfree(gi); 38976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman return rv; 39076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} 39176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 39276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/* Try to detect disks from port 0x80 to 0xff */ 39376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanvoid detect_disks(struct s_hardware *hardware) 39476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman{ 39576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman int i = -1; 39676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman int err; 39776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 39876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (hardware->disk_detection) 39976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman return; 40076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 40176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman hardware->disk_detection = true; 40276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman for (int drive = 0x80; drive < 0xff; drive++) { 40376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman i++; 40476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman hardware->disk_info[i].disk = drive; 40576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman err = get_drive_parameters(&hardware->disk_info[i]); 40676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 40776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman /* 40876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * Do not print output when drive does not exist or 40976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * doesn't support int13 (cdrom, ...) 41076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman */ 41176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (err == -1 || !hardware->disk_info[i].cbios) 41276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman continue; 41376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 41476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman /* Detect MBR */ 41576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman hardware->mbr_ids[i] = get_mbr_id(&hardware->disk_info[i]); 41676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 41776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman hardware->disks_count++; 41876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } 41976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} 42076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 42176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanint detect_pxe(struct s_hardware *hardware) 42276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman{ 42376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman void *dhcpdata; 42476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 42576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman size_t dhcplen; 42676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman t_PXENV_UNDI_GET_NIC_TYPE gnt; 42776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 42876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (hardware->pxe_detection == true) 42976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman return -1; 43076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman hardware->pxe_detection = true; 43176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman hardware->is_pxe_valid = false; 43276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman memset(&gnt, 0, sizeof(t_PXENV_UNDI_GET_NIC_TYPE)); 43376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman memset(&hardware->pxe, 0, sizeof(struct s_pxe)); 43476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 43576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman /* This code can only work if pxelinux is loaded */ 43676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (hardware->sv->filesystem != SYSLINUX_FS_PXELINUX) { 43776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman return -1; 43876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } 43976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman// printf("PXE: PXElinux detected\n"); 44076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (!pxe_get_cached_info(PXENV_PACKET_TYPE_DHCP_ACK, &dhcpdata, &dhcplen)) { 44176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman pxe_bootp_t *dhcp = &hardware->pxe.dhcpdata; 44276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman memcpy(&hardware->pxe.dhcpdata, dhcpdata, 44376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman sizeof(hardware->pxe.dhcpdata)); 44476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman snprintf(hardware->pxe.mac_addr, sizeof(hardware->pxe.mac_addr), 44576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman "%02x:%02x:%02x:%02x:%02x:%02x", dhcp->CAddr[0], 44676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman dhcp->CAddr[1], dhcp->CAddr[2], dhcp->CAddr[3], 44776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman dhcp->CAddr[4], dhcp->CAddr[5]); 44876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 44976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman /* Saving our IP address in a easy format */ 45076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman hardware->pxe.ip_addr[0] = hardware->pxe.dhcpdata.yip & 0xff; 45176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman hardware->pxe.ip_addr[1] = hardware->pxe.dhcpdata.yip >> 8 & 0xff; 45276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman hardware->pxe.ip_addr[2] = hardware->pxe.dhcpdata.yip >> 16 & 0xff; 45376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman hardware->pxe.ip_addr[3] = hardware->pxe.dhcpdata.yip >> 24 & 0xff; 45476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 45576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (!pxe_get_nic_type(&gnt)) { 45676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman switch (gnt.NicType) { 45776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman case PCI_NIC: 45876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman hardware->is_pxe_valid = true; 45976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman hardware->pxe.vendor_id = gnt.info.pci.Vendor_ID; 46076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman hardware->pxe.product_id = gnt.info.pci.Dev_ID; 46176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman hardware->pxe.subvendor_id = gnt.info.pci.SubVendor_ID; 46276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman hardware->pxe.subproduct_id = 46376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman gnt.info.pci.SubDevice_ID, 46476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman hardware->pxe.rev = gnt.info.pci.Rev; 46576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman hardware->pxe.pci_bus = (gnt.info.pci.BusDevFunc >> 8) & 0xff; 46676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman hardware->pxe.pci_dev = (gnt.info.pci.BusDevFunc >> 3) & 0x7; 46776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman hardware->pxe.pci_func = gnt.info.pci.BusDevFunc & 0x03; 46876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman hardware->pxe.base_class = gnt.info.pci.Base_Class; 46976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman hardware->pxe.sub_class = gnt.info.pci.Sub_Class; 47076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman hardware->pxe.prog_intf = gnt.info.pci.Prog_Intf; 47176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman hardware->pxe.nictype = gnt.NicType; 47276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman break; 47376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman case CardBus_NIC: 47476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman hardware->is_pxe_valid = true; 47576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman hardware->pxe.vendor_id = gnt.info.cardbus.Vendor_ID; 47676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman hardware->pxe.product_id = gnt.info.cardbus.Dev_ID; 47776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman hardware->pxe.subvendor_id = gnt.info.cardbus.SubVendor_ID; 47876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman hardware->pxe.subproduct_id = 47976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman gnt.info.cardbus.SubDevice_ID, 48076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman hardware->pxe.rev = gnt.info.cardbus.Rev; 48176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman hardware->pxe.pci_bus = 48276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman (gnt.info.cardbus.BusDevFunc >> 8) & 0xff; 48376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman hardware->pxe.pci_dev = 48476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman (gnt.info.cardbus.BusDevFunc >> 3) & 0x7; 48576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman hardware->pxe.pci_func = gnt.info.cardbus.BusDevFunc & 0x03; 48676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman hardware->pxe.base_class = gnt.info.cardbus.Base_Class; 48776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman hardware->pxe.sub_class = gnt.info.cardbus.Sub_Class; 48876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman hardware->pxe.prog_intf = gnt.info.cardbus.Prog_Intf; 48976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman hardware->pxe.nictype = gnt.NicType; 49076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman break; 49176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman case PnP_NIC: 49276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman default: 49376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman return -1; 49476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman break; 49576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } 49676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 49776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman /* The firt pass try to find the exact pci device */ 49876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman hardware->pxe.pci_device = NULL; 49976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman hardware->pxe.pci_device_pos = 0; 50076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman struct pci_device *pci_device; 50176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman int pci_number = 0; 50276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman for_each_pci_func(pci_device, hardware->pci_domain) { 50376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman pci_number++; 50476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if ((__pci_bus == hardware->pxe.pci_bus) && 50576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman (__pci_slot == hardware->pxe.pci_dev) && 50676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman (__pci_func == hardware->pxe.pci_func) && 50776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman (pci_device->vendor == hardware->pxe.vendor_id) 50876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman && (pci_device->product == hardware->pxe.product_id)) { 50976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman hardware->pxe.pci_device = pci_device; 51076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman hardware->pxe.pci_device_pos = pci_number; 51176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman return 0; 51276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } 51376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } 51476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 51576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman /* If we reach that part, it means the pci device pointed by 51676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * the pxe rom wasn't found in our list. 51776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * Let's try to find the device only by its pci ids. 51876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * The pci device we'll match is maybe not exactly the good one 51976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * as we can have the same pci id several times. 52076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * At least, the pci id, the vendor/product will be right. 52176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * That's clearly a workaround for some weird cases. 52276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * This should happend very unlikely */ 52376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman hardware->pxe.pci_device = NULL; 52476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman hardware->pxe.pci_device_pos = 0; 52576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman pci_number = 0; 52676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman for_each_pci_func(pci_device, hardware->pci_domain) { 52776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman pci_number++; 52876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if ((pci_device->vendor == hardware->pxe.vendor_id) 52976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman && (pci_device->product == hardware->pxe.product_id)) { 53076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman hardware->pxe.pci_device = pci_device; 53176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman hardware->pxe.pci_device_pos = pci_number; 53276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman return 0; 53376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } 53476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } 53576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 53676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } 53776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } 53876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman return 0; 53976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} 54076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 54176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanvoid detect_memory(struct s_hardware *hardware) { 54276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (hardware->memory_detection == false) { 54376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman hardware->memory_detection = true; 54476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman hardware->detected_memory_size = detect_memsize(); 54576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } 54676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} 54776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 54876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanvoid detect_pci(struct s_hardware *hardware) 54976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman{ 55076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (hardware->pci_detection == true) 55176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman return; 55276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman hardware->pci_detection = true; 55376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 55476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman hardware->nb_pci_devices = 0; 55576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 55676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman /* Scanning to detect pci buses and devices */ 55776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman hardware->pci_domain = pci_scan(); 55876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 55976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (!hardware->pci_domain) 56076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman return; 56176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 56276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman /* Gathering addtional information */ 56376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman gather_additional_pci_config(hardware->pci_domain); 56476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 56576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman struct pci_device *pci_device; 56676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman for_each_pci_func(pci_device, hardware->pci_domain) { 56776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman hardware->nb_pci_devices++; 56876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } 56976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 57076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (!quiet) { 57176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman more_printf("PCI: %d devices detected\n", hardware->nb_pci_devices); 57276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman more_printf("PCI: Resolving names\n"); 57376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } 57476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman /* Assigning product & vendor name for each device */ 57576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman hardware->pci_ids_return_code = 57676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman get_name_from_pci_ids(hardware->pci_domain, hardware->pciids_path); 57776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 57876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (!quiet) 57976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman more_printf("PCI: Resolving class names\n"); 58076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman /* Assigning class name for each device */ 58176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman hardware->pci_ids_return_code = 58276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman get_class_name_from_pci_ids(hardware->pci_domain, 58376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman hardware->pciids_path); 58476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 58576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (!quiet) 58676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman more_printf("PCI: Resolving module names\n"); 58776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman /* Detecting which kernel module should match each device using modules.pcimap */ 58876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman hardware->modules_pcimap_return_code = 58976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman get_module_name_from_pcimap(hardware->pci_domain, 59076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman hardware->modules_pcimap_path); 59176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 59276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman /* Detecting which kernel module should match each device using modules.alias */ 59376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman hardware->modules_alias_return_code = 59476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman get_module_name_from_alias(hardware->pci_domain, 59576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman hardware->modules_alias_path); 59676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 59776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} 59876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 59976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanvoid cpu_detect(struct s_hardware *hardware) 60076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman{ 60176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (hardware->cpu_detection == true) 60276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman return; 60376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman detect_cpu(&hardware->cpu); 60476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman /* Old processors doesn't manage the identify commands 60576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * Let's use the dmi value in that case */ 60676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (strlen(remove_spaces(hardware->cpu.model)) == 0) 60776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman strlcpy(hardware->cpu.model, hardware->dmi.processor.version, 60876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman sizeof(hardware->cpu.model)); 60976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 61076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman /* Some CPUs like to put many spaces in the model name 61176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * That makes some weird display in console/menu 61276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * Let's remove that mulitple spaces */ 61376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman strlcpy(hardware->cpu.model,del_multi_spaces(hardware->cpu.model),sizeof(hardware->cpu.model)); 61476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 61576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if ((hardware->is_acpi_valid) && (hardware->acpi.madt.valid)) { 61676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman hardware->physical_cpu_count=hardware->acpi.madt.processor_local_apic_count / hardware->cpu.num_cores; 61776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } 61876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman hardware->cpu_detection = true; 61976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} 62076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 62176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/* 62276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * Find the last instance of a particular command line argument 62376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * (which should include the final =; do not use for boolean arguments) 62476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman */ 62576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanconst char *find_argument(const char **argv, const char *argument) 62676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman{ 62776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman int la = strlen(argument); 62876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman const char **arg; 62976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman const char *ptr = NULL; 63076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 63176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman for (arg = argv; *arg; arg++) { 63276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (!memcmp(*arg, argument, la)) 63376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman ptr = *arg + la; 63476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } 63576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 63676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman return ptr; 63776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} 63876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 63976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanvoid clear_screen(void) 64076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman{ 64176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman move_cursor_to_next_line(); 64276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman disable_utf8(); 64376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman set_g1_special_char(); 64476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman set_us_g0_charset(); 64576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman display_cursor(false); 64676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman clear_entire_screen(); 64776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman gotoxy(0,0); 64876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman reset_more_printf(); 64976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} 65076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 65176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/* remove begining spaces */ 65276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanchar *skip_spaces(char *p) 65376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman{ 65476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman while (*p && *p <= ' ') { 65576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman p++; 65676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } 65776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 65876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman return p; 65976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} 66076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 66176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/* remove trailing & begining spaces */ 66276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanchar *remove_spaces(char *p) 66376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman{ 66476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman char *save = p; 66576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman p += strlen(p) - 1; 66676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman while (*p && *p <= ' ') { 66776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *p = '\0'; 66876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman p--; 66976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } 67076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman p = save; 67176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman while (*p && *p <= ' ') { 67276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman p++; 67376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } 67476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 67576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman return p; 67676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} 67776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 67876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/* remove trailing LF */ 67976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanchar *remove_trailing_lf(char *p) 68076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman{ 68176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman char *save = p; 68276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman p += strlen(p) - 1; 68376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman while (*p && *p == 10) { 68476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *p = '\0'; 68576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman p--; 68676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } 68776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman p = save; 68876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 68976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman return p; 69076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} 69176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 69276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/* delete multiple spaces, one is enough */ 69376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanchar *del_multi_spaces(char *p) 69476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman{ 69576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman /* Saving the original pointer */ 69676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman char *save = p; 69776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 69876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman /* Let's parse the complete string 69976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * As we search for a double spacing 70076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * we have to be sure then string is 70176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * long enough to be processed */ 70276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman while (*p && *(p + 1)) { 70376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 70476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman /* If we have two consecutive spaces */ 70576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if ((*p == ' ') && (*(p + 1) == ' ')) { 70676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 70776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman /* Let's copy to the current position 70876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * the content from the second space*/ 70976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman strlcpy(p, p + 1, strlen(p + 1)); 71076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 71176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman /* Don't increment the pointer as we 71276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * changed the content of the current position*/ 71376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman continue; 71476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } 71576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 71676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman /* Nothing as been found, let's see on the next char */ 71776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman p++; 71876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } 71976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman /* Returning the original pointer */ 72076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman return save; 72176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} 72276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 72376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/* Reset the more_printf counter */ 72476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanvoid reset_more_printf(void) 72576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman{ 72676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman display_line_nb = 0; 72776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} 72876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 72976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanint draw_background(const char *what) 73076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman{ 73176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (!what) 73276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman return vesacon_default_background(); 73376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman else 73476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman return vesacon_load_background(what); 73576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} 73676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 73776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanvoid init_console(struct s_hardware *hardware) 73876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman{ 73976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (vesamode) { 74076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman openconsole(&dev_rawcon_r, &dev_vesaserial_w); 74176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman draw_background(hardware->vesa_background); 74276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } else 74376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman console_ansi_raw(); 74476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} 74576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 74676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanvoid detect_hardware(struct s_hardware *hardware) 74776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman{ 74876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (!quiet) 74976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman more_printf("ACPI: Detecting\n"); 75076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman detect_acpi(hardware); 75176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 75276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (!quiet) 75376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman more_printf("MEMORY: Detecting\n"); 75476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman detect_memory(hardware); 75576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 75676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (!quiet) 75776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman more_printf("DMI: Detecting Table\n"); 75876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (detect_dmi(hardware) == -ENODMITABLE) { 75976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman more_printf("DMI: ERROR ! Table not found ! \n"); 76076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman more_printf("DMI: Many hardware components will not be detected ! \n"); 76176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } else { 76276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (!quiet) 76376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman more_printf("DMI: Table found ! (version %u.%u)\n", 76476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman hardware->dmi.dmitable.major_version, 76576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman hardware->dmi.dmitable.minor_version); 76676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } 76776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 76876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (!quiet) 76976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman more_printf("CPU: Detecting\n"); 77076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman cpu_detect(hardware); 77176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 77276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (!quiet) 77376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman more_printf("DISKS: Detecting\n"); 77476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman detect_disks(hardware); 77576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 77676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (!quiet) 77776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman more_printf("VPD: Detecting\n"); 77876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman detect_vpd(hardware); 77976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 78076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman detect_pci(hardware); 78176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (!quiet) 78276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman more_printf("PCI: %d Devices Found\n", hardware->nb_pci_devices); 78376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 78476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (!quiet) 78576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman more_printf("PXE: Detecting\n"); 78676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman detect_pxe(hardware); 78776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 78876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if (!quiet) 78976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman more_printf("VESA: Detecting\n"); 79076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman detect_vesa(hardware); 79176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} 79276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 793