// SPDX-License-Identifier: GPL-2.0 /* * Platform Firmware Runtime Update tool to do Management * Mode code injection/driver update and telemetry retrieval. * * This tool uses the interfaces provided by pfr_update and * pfr_telemetry drivers. These interfaces are exposed via * /dev/pfr_update and /dev/pfr_telemetry. Write operation * on the /dev/pfr_update is to load the EFI capsule into * kernel space. Mmap/read operations on /dev/pfr_telemetry * could be used to read the telemetry data to user space.
*/ #define _GNU_SOURCE #include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <unistd.h> #include <getopt.h> #include <sys/ioctl.h> #include <sys/mman.h> #include <uuid/uuid.h> #include PFRUT_HEADER
char *capsule_name; int action, query_cap, log_type, log_level, log_read, log_getinfo,
revid, log_revid; int set_log_level, set_log_type,
set_revid, set_log_revid;
int main(int argc, char *argv[])
{ int fd_update, fd_update_log, fd_capsule; struct pfrt_log_data_info data_info; struct pfrt_log_info info; struct pfru_update_cap_info cap; void *addr_map_capsule; struct stat st; char *log_buf; int ret;
if (getuid() != 0) {
printf("Please run the tool as root - Exiting.\n"); return 1;
}
parse_options(argc, argv);
fd_update = open("/dev/acpi_pfr_update0", O_RDWR); if (fd_update < 0) {
printf("PFRU device not supported - Quit...\n"); return 1;
}
fd_update_log = open("/dev/acpi_pfr_telemetry0", O_RDWR); if (fd_update_log < 0) {
printf("PFRT device not supported - Quit...\n"); return 1;
}
if (query_cap) {
ret = ioctl(fd_update, PFRU_IOC_QUERY_CAP, &cap); if (ret)
perror("Query Update Capability info failed."); else
print_cap(&cap);
close(fd_update);
close(fd_update_log);
return ret;
}
if (log_getinfo) {
ret = ioctl(fd_update_log, PFRT_LOG_IOC_GET_DATA_INFO, &data_info); if (ret) {
perror("Get telemetry data info failed.");
close(fd_update);
close(fd_update_log);
return 1;
}
ret = ioctl(fd_update_log, PFRT_LOG_IOC_GET_INFO, &info); if (ret) {
perror("Get telemetry info failed.");
close(fd_update);
close(fd_update_log);
if (set_log_level) { if (!valid_log_level(log_level)) {
printf("Invalid log level %d\n",
log_level);
} else {
info.log_level = log_level;
}
}
if (set_log_type) { if (!valid_log_type(log_type)) {
printf("Invalid log type %d\n",
log_type);
} else {
info.log_type = log_type;
}
}
if (set_log_revid) { if (!valid_log_revid(log_revid)) {
printf("Invalid log revid %d, unchanged.\n",
log_revid);
} else {
info.log_revid = log_revid;
}
}
ret = ioctl(fd_update_log, PFRT_LOG_IOC_SET_INFO, &info); if (ret) {
perror("Log information set failed.(log_level, log_type, log_revid)");
close(fd_update);
close(fd_update_log);
return 1;
}
if (set_revid) {
ret = ioctl(fd_update, PFRU_IOC_SET_REV, &revid); if (ret) {
perror("pfru update revid set failed");
close(fd_update);
close(fd_update_log);
return 1;
}
printf("pfru update revid set to %d\n", revid);
}
if (capsule_name) {
fd_capsule = open(capsule_name, O_RDONLY); if (fd_capsule < 0) {
perror("Can not open capsule file...");
close(fd_update);
close(fd_update_log);
return 1;
}
if (fstat(fd_capsule, &st) < 0) {
perror("Can not fstat capsule file...");
close(fd_capsule);
close(fd_update);
close(fd_update_log);
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.