syslinux/com32/hdt/hdt-cli-kernel.c
<<
>>
Prefs
   1/* ----------------------------------------------------------------------- *
   2 *
   3 *   Copyright 2009 Erwan Velu - All Rights Reserved
   4 *
   5 *   Permission is hereby granted, free of charge, to any person
   6 *   obtaining a copy of this software and associated documentation
   7 *   files (the "Software"), to deal in the Software without
   8 *   restriction, including without limitation the rights to use,
   9 *   copy, modify, merge, publish, distribute, sublicense, and/or
  10 *   sell copies of the Software, and to permit persons to whom
  11 *   the Software is furnished to do so, subject to the following
  12 *   conditions:
  13 *
  14 *   The above copyright notice and this permission notice shall
  15 *   be included in all copies or substantial portions of the Software.
  16 *
  17 *   THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
  18 *   EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
  19 *   OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
  20 *   NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
  21 *   HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
  22 *   WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
  23 *   FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
  24 *   OTHER DEALINGS IN THE SOFTWARE.
  25 *
  26 * -----------------------------------------------------------------------
  27 */
  28
  29#include <stdio.h>
  30#include <string.h>
  31#include <stdlib.h>
  32#include <errno.h>
  33
  34#include "hdt-cli.h"
  35#include "hdt-common.h"
  36
  37void main_show_kernel(int argc __unused, char **argv __unused,
  38                      struct s_hardware *hardware)
  39{
  40    char buffer[1024] = {0};
  41    struct pci_device *pci_device;
  42    bool found = false;
  43    char kernel_modules[LINUX_KERNEL_MODULE_SIZE *
  44                        MAX_KERNEL_MODULES_PER_PCI_DEVICE];
  45
  46    reset_more_printf();
  47    more_printf("Kernel modules\n");
  48
  49// more_printf(" PCI device no: %d \n", p->pci_device_pos);
  50
  51    if ((hardware->modules_pcimap_return_code == -ENOMODULESPCIMAP)
  52        && (hardware->modules_alias_return_code == -ENOMODULESALIAS)) {
  53        more_printf(" modules.pcimap and modules.alias files are missing\n");
  54        return;
  55    }
  56
  57    /* For every detected pci device, compute its submenu */
  58    for_each_pci_func(pci_device, hardware->pci_domain) {
  59        memset(kernel_modules, 0, sizeof kernel_modules);
  60
  61        for (int kmod = 0;
  62             kmod < pci_device->dev_info->linux_kernel_module_count; kmod++) {
  63            if (kmod > 0) {
  64                strncat(kernel_modules, " | ", 3);
  65            }
  66            strncat(kernel_modules,
  67                    pci_device->dev_info->linux_kernel_module[kmod],
  68                    LINUX_KERNEL_MODULE_SIZE - 1);
  69        }
  70
  71        if ((pci_device->dev_info->linux_kernel_module_count > 0)
  72            && (!strstr(buffer, kernel_modules))) {
  73            found = true;
  74            if (pci_device->dev_info->linux_kernel_module_count > 1)
  75                strncat(buffer, "(", 1);
  76            strncat(buffer, kernel_modules, sizeof(kernel_modules));
  77            if (pci_device->dev_info->linux_kernel_module_count > 1)
  78                strncat(buffer, ")", 1);
  79            strncat(buffer, " # ", 3);
  80        }
  81
  82    }
  83    if (found == true) {
  84        strncat(buffer, "\n", 1);
  85        more_printf("%s", buffer);
  86    }
  87}
  88
  89static void show_kernel_modules(int argc __unused, char **argv __unused,
  90                                struct s_hardware *hardware)
  91{
  92    struct pci_device *pci_device;
  93    char kernel_modules[LINUX_KERNEL_MODULE_SIZE *
  94                        MAX_KERNEL_MODULES_PER_PCI_DEVICE];
  95    char modules[MAX_PCI_CLASSES][256] = {{0}};
  96    char category_name[MAX_PCI_CLASSES][256] = {{0}};
  97
  98    if (hardware->pci_ids_return_code == -ENOPCIIDS) {
  99        more_printf(" Missing pci.ids, we can't compute the list\n");
 100        return;
 101    }
 102
 103    if (hardware->modules_pcimap_return_code == -ENOMODULESPCIMAP) {
 104        more_printf(" Missing modules.pcimap, we can't compute the list\n");
 105        return;
 106    }
 107
 108    reset_more_printf();
 109    for_each_pci_func(pci_device, hardware->pci_domain) {
 110        memset(kernel_modules, 0, sizeof kernel_modules);
 111
 112        for (int kmod = 0;
 113             kmod < pci_device->dev_info->linux_kernel_module_count; kmod++) {
 114            strncat(kernel_modules,
 115                    pci_device->dev_info->linux_kernel_module[kmod],
 116                    LINUX_KERNEL_MODULE_SIZE - 1);
 117            strncat(kernel_modules, " ", 1);
 118        }
 119
 120        if ((pci_device->dev_info->linux_kernel_module_count > 0)
 121            && (!strstr(modules[pci_device->class[2]], kernel_modules))) {
 122            strncat(modules[pci_device->class[2]], kernel_modules,
 123                    sizeof(kernel_modules));
 124            snprintf(category_name[pci_device->class[2]],
 125                     sizeof(category_name[pci_device->class[2]]),
 126                     "%s", pci_device->dev_info->category_name);
 127        }
 128    }
 129    /* Print the found items */
 130    for (int i = 0; i < MAX_PCI_CLASSES; i++) {
 131        if (strlen(category_name[i]) > 1) {
 132            more_printf("%s : %s\n", category_name[i], modules[i]);
 133        }
 134    }
 135}
 136
 137struct cli_module_descr kernel_show_modules = {
 138    .modules = NULL,
 139    .default_callback = show_kernel_modules,
 140};
 141
 142struct cli_mode_descr kernel_mode = {
 143    .mode = KERNEL_MODE,
 144    .name = CLI_KERNEL,
 145    .default_modules = NULL,
 146    .show_modules = &kernel_show_modules,
 147    .set_modules = NULL,
 148};
 149
lxr.linux.no kindly hosted by Redpill Linpro AS, provider of Linux consulting and operations services since 1995.