diff options
Diffstat (limited to 'roms/skiboot/external/opal-prd/module.c')
-rw-r--r-- | roms/skiboot/external/opal-prd/module.c | 49 |
1 files changed, 49 insertions, 0 deletions
diff --git a/roms/skiboot/external/opal-prd/module.c b/roms/skiboot/external/opal-prd/module.c new file mode 100644 index 000000000..9c9c0af84 --- /dev/null +++ b/roms/skiboot/external/opal-prd/module.c @@ -0,0 +1,49 @@ +// SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later +/* + * Load kernel modules needed for opal-prd + * + * Copyright 2015 IBM Corp. + */ + +#include <stdlib.h> +#include <unistd.h> +#include <err.h> +#include <sys/types.h> +#include <sys/wait.h> + +#include "module.h" +#include "opal-prd.h" + +int insert_module(const char *module) +{ + int status; + pid_t pid; + + pid = fork(); + if (!pid) { + execlp("modprobe", "modprobe", module, NULL); + err(EXIT_FAILURE, "Failed to run modprobe"); + } + + pid = waitpid(pid, &status, 0); + if (pid < 0) { + pr_log(LOG_ERR, "KMOD: waitpid failed for " + "modprobe process: %m"); + return -1; + } + + if (!WIFEXITED(status)) { + pr_log(LOG_WARNING, "KMOD: modprobe %s: process didn't " + "exit cleanly", module); + return -1; + } + + if (WEXITSTATUS(status) != 0) { + pr_log(LOG_WARNING, "KMOD: modprobe %s failed, status %d", + module, WEXITSTATUS(status)); + return -1; + } + + return 0; +} + |