Page Menu
Home
FreeBSD
Search
Configure Global Search
Log In
Files
F156651956
D30104.id91103.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Flag For Later
Award Token
Size
18 KB
Referenced Files
None
Subscribers
None
D30104.id91103.diff
View Options
Index: share/man/man4/efidev.4
===================================================================
--- share/man/man4/efidev.4
+++ share/man/man4/efidev.4
@@ -26,7 +26,7 @@
.\"
.\" $FreeBSD$
.\"
-.Dd August 12, 2018
+.Dd June 18, 2021
.Dt EFIDEV 4
.Os
.Sh NAME
@@ -71,11 +71,17 @@
.In sys/efi.h :
.Bl -tag -width indent
.It Dv EFIIOC_GET_TABLE Pq Vt "struct efi_get_table_ioc"
-Get a table by uuid from the UEFI system table.
+Copy the table from the UEFI system described by uuid field of the
+.Vt struct efi_get_table_ioc
+into the buf field. The memory size for the buf field can be found by passing
+NULL pointer as a buf value. The required size will be stored in the table_len
+field. The size of the allocated memory must be specified in the buf_len field.
.Bd -literal -offset indent
struct efi_get_table_ioc {
+ void *buf;
struct uuid uuid;
- void *ptr;
+ size_t table_len;
+ size_t buf_len;
};
.Ed
.It Dv EFIIOC_GET_TIME Pq Vt "struct efi_tm"
Index: sys/dev/efidev/efidev.c
===================================================================
--- sys/dev/efidev/efidev.c
+++ sys/dev/efidev/efidev.c
@@ -53,6 +53,30 @@
int error;
switch (cmd) {
+ case EFIIOC_GET_TABLE:
+ {
+ struct efi_get_table_ioc *egtioc =
+ (struct efi_get_table_ioc *)addr;
+ void *buf = NULL;
+
+ error = efi_copy_table(&egtioc->uuid, egtioc->buf ? &buf : NULL,
+ egtioc->buf_len, &egtioc->table_len);
+
+ if (error != 0 || egtioc->buf == NULL) {
+ break;
+ }
+
+ if (egtioc->buf_len < egtioc->table_len) {
+ error = EINVAL;
+ free(buf, M_TEMP);
+ break;
+ }
+
+ error = copyout(buf, egtioc->buf, egtioc->buf_len);
+ free(buf, M_TEMP);
+
+ break;
+ }
case EFIIOC_GET_TIME:
{
struct efi_tm *tm = (struct efi_tm *)addr;
Index: sys/dev/efidev/efirt.c
===================================================================
--- sys/dev/efidev/efirt.c
+++ sys/dev/efidev/efirt.c
@@ -38,6 +38,7 @@
#include <sys/kernel.h>
#include <sys/linker.h>
#include <sys/lock.h>
+#include <sys/malloc.h>
#include <sys/module.h>
#include <sys/mutex.h>
#include <sys/clock.h>
@@ -47,6 +48,7 @@
#include <sys/sched.h>
#include <sys/sysctl.h>
#include <sys/systm.h>
+#include <sys/uio.h>
#include <sys/vmmeter.h>
#include <machine/fpu.h>
@@ -96,6 +98,11 @@
EPROTO /* EFI_PROTOCOL_ERROR */
};
+enum efi_table_type {
+ TYPE_ESRT = 0,
+ TYPE_PROP
+};
+
static int efi_enter(void);
static void efi_leave(void);
@@ -336,6 +343,128 @@
return (ENOENT);
}
+static int
+get_table_length(enum efi_table_type type, size_t *table_len, void **taddr)
+{
+ switch (type) {
+ case TYPE_ESRT:
+ {
+ struct efi_esrt_table *esrt = NULL;
+ struct uuid uuid = EFI_TABLE_ESRT;
+ size_t len = sizeof(*esrt);
+ uint32_t fw_resource_count = 0;
+ int error;
+ void *buf = malloc(len, M_TEMP, M_WAITOK);
+
+ error = efi_get_table(&uuid, (void **)&esrt);
+ if (error != 0) {
+ free(buf, M_TEMP);
+ break;
+ }
+
+ error = physcopyout((vm_paddr_t)esrt, buf, len);
+ if (error != 0) {
+ free(buf, M_TEMP);
+ break;
+ }
+
+ /* Check ESRT version */
+ if (((struct efi_esrt_table *)buf)->fw_resource_version !=
+ ESRT_FIRMWARE_RESOURCE_VERSION) {
+ return (ENXIO);
+ }
+
+ fw_resource_count = ((struct efi_esrt_table *)buf)->fw_resource_count;
+ len += sizeof(struct efi_esrt_entry_v1) * fw_resource_count;
+ *table_len = len;
+
+ if (taddr != NULL) {
+ *taddr = esrt;
+ }
+ free(buf, M_TEMP);
+ return (0);
+ }
+ case TYPE_PROP:
+ {
+ struct uuid uuid = EFI_PROPERTIES_TABLE;
+ struct efi_prop_table *prop;
+ size_t len = sizeof(*prop);
+ uint32_t prop_len;
+ int error;
+ void *buf = malloc(len, M_TEMP, M_WAITOK);
+
+ error = efi_get_table(&uuid, (void **)&prop);
+ if (error != 0) {
+ free(buf, M_TEMP);
+ break;
+ }
+
+ error = physcopyout((vm_paddr_t)prop, buf, len);
+ if (error != 0) {
+ free(buf, M_TEMP);
+ break;
+ }
+
+ prop_len = ((struct efi_prop_table *)buf)->length;
+ *table_len = prop_len;
+
+ if (taddr != NULL) {
+ *taddr = prop;
+ }
+ return (0);
+ }
+ }
+ return (ENOENT);
+}
+
+static int
+copy_table(struct uuid *uuid, void **buf, size_t buf_len, size_t *table_len)
+{
+ struct known_table {
+ struct uuid uuid;
+ enum efi_table_type type;
+ };
+
+ struct known_table tables[] = {
+ { EFI_TABLE_ESRT, TYPE_ESRT },
+ { EFI_PROPERTIES_TABLE, TYPE_PROP }
+ };
+ bool table_supported = false;
+ size_t table_idx;
+ void *taddr;
+ int rc;
+
+ for (table_idx = 0; table_idx < nitems(tables); table_idx++) {
+ if (!bcmp(&tables[table_idx].uuid, uuid, sizeof(*uuid))) {
+ table_supported = true;
+ break;
+ }
+ }
+
+ if (!table_supported) {
+ return (EINVAL);
+ }
+
+ rc = get_table_length(tables[table_idx].type, table_len, &taddr);
+ if (rc != 0) {
+ return rc;
+ }
+
+ /* return table length to userspace */
+ if (buf == NULL) {
+ return (0);
+ }
+
+ *buf = malloc(*table_len, M_TEMP, M_WAITOK);
+ if (*buf == NULL) {
+ return (ENOMEM);
+ }
+
+ rc = physcopyout((vm_paddr_t)taddr, *buf, *table_len);
+
+ return (rc);
+}
+
static int efi_rt_handle_faults = EFI_RT_HANDLE_FAULTS_DEFAULT;
SYSCTL_INT(_machdep, OID_AUTO, efi_rt_handle_faults, CTLFLAG_RWTUN,
&efi_rt_handle_faults, 0,
@@ -568,6 +697,7 @@
const static struct efi_ops efi_ops = {
.rt_ok = rt_ok,
.get_table = get_table,
+ .copy_table = copy_table,
.get_time = get_time,
.get_time_capabilities = get_time_capabilities,
.reset_system = reset_system,
Index: sys/sys/efi.h
===================================================================
--- sys/sys/efi.h
+++ sys/sys/efi.h
@@ -40,6 +40,10 @@
{0xeb9d2d31,0x2d88,0x11d3,0x9a,0x16,{0x00,0x90,0x27,0x3f,0xc1,0x4d}}
#define EFI_TABLE_SMBIOS3 \
{0xf2fd1544,0x9794,0x4a2c,0x99,0x2e,{0xe5,0xbb,0xcf,0x20,0xe3,0x94}}
+#define EFI_TABLE_ESRT \
+ {0xb122a263,0x3661,0x4f68,0x99,0x29,{0x78,0xf8,0xb0,0xd6,0x21,0x80}}
+#define EFI_PROPERTIES_TABLE \
+ {0x880aaca3,0x4adc,0x4a04,0x90,0x79,{0xb7,0x47,0x34,0x08,0x25,0xe5}}
enum efi_reset {
EFI_RESET_COLD = 0,
@@ -123,6 +127,31 @@
uint32_t __res;
};
+#define ESRT_FIRMWARE_RESOURCE_VERSION 1
+
+struct efi_esrt_table {
+ uint32_t fw_resource_count;
+ uint32_t fw_resource_count_max;
+ uint64_t fw_resource_version;
+ uint8_t entries[];
+};
+
+struct efi_esrt_entry_v1 {
+ struct uuid fw_class;
+ uint32_t fw_type;
+ uint32_t fw_version;
+ uint32_t lowest_supported_fw_version;
+ uint32_t capsule_flags;
+ uint32_t last_attempt_version;
+ uint32_t last_attempt_status;
+};
+
+struct efi_prop_table {
+ uint32_t version;
+ uint32_t length;
+ uint64_t memory_protection_attribute;
+};
+
#ifdef _KERNEL
#ifdef EFIABI_ATTR
@@ -188,6 +217,7 @@
*/
int (*rt_ok)(void);
int (*get_table)(struct uuid *, void **);
+ int (*copy_table)(struct uuid *, void **, size_t, size_t *);
int (*get_time)(struct efi_tm *);
int (*get_time_capabilities)(struct efi_tmcap *);
int (*reset_system)(enum efi_reset);
@@ -216,6 +246,14 @@
return (active_efi_ops->get_table(uuid, ptr));
}
+static inline int efi_copy_table(struct uuid *uuid, void **buf,
+ size_t buf_len, size_t *table_len)
+{
+ if (active_efi_ops->copy_table == NULL)
+ return (ENXIO);
+ return (active_efi_ops->copy_table(uuid, buf, buf_len, table_len));
+}
+
static inline int efi_get_time(struct efi_tm *tm)
{
Index: sys/sys/efiio.h
===================================================================
--- sys/sys/efiio.h
+++ sys/sys/efiio.h
@@ -32,6 +32,14 @@
#include <sys/uuid.h>
#include <sys/efi.h>
+struct efi_get_table_ioc
+{
+ void *buf; /* Pointer to userspace buffer */
+ struct uuid uuid; /* UUID to look up */
+ size_t table_len; /* Table size */
+ size_t buf_len; /* Size of the buffer */
+};
+
struct efi_var_ioc
{
efi_char *name; /* User pointer to name, in wide chars */
@@ -42,6 +50,7 @@
size_t datasize; /* Number of *bytes* in the data */
};
+#define EFIIOC_GET_TABLE _IOWR('E', 1, struct efi_get_table_ioc)
#define EFIIOC_GET_TIME _IOR('E', 2, struct efi_tm)
#define EFIIOC_SET_TIME _IOW('E', 3, struct efi_tm)
#define EFIIOC_VAR_GET _IOWR('E', 4, struct efi_var_ioc)
Index: usr.sbin/Makefile
===================================================================
--- usr.sbin/Makefile
+++ usr.sbin/Makefile
@@ -129,7 +129,7 @@
.endif
SUBDIR.${MK_CXGBETOOL}+= cxgbetool
SUBDIR.${MK_DIALOG}+= bsdconfig
-SUBDIR.${MK_EFI}+= efivar efidp efibootmgr
+SUBDIR.${MK_EFI}+= efivar efidp efibootmgr efitable
.if ${MK_OPENSSL} != "no"
SUBDIR.${MK_EFI}+= uefisign
.endif
Index: usr.sbin/efitable/Makefile
===================================================================
--- /dev/null
+++ usr.sbin/efitable/Makefile
@@ -0,0 +1,7 @@
+# $FreeBSD$
+
+PROG= efitable
+MAN= efitable.8
+SRCS= efitable.c
+
+.include <bsd.prog.mk>
Index: usr.sbin/efitable/efitable.8
===================================================================
--- /dev/null
+++ usr.sbin/efitable/efitable.8
@@ -0,0 +1,58 @@
+.\"
+.\" Copyright (c) 2021 3mdeb Embedded Systems Consulting.
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\" notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\" notice, this list of conditions and the following disclaimer in the
+.\" documentation and/or other materials provided with the distribution.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+.\" SUCH DAMAGE.
+.\"
+.\" $FreeBSD$
+.\"
+.Dd June 10, 2021
+.Dt EFITABLE 8
+.Os
+.Sh NAME
+.Nm efitable
+.Nd UEFI tables interaction
+.Sh SYNOPSIS
+.Nm
+.Op Fl u Ar uuid | Fl t Ar name
+.Op Fl j
+.Sh DESCRIPTION
+This program prints data from
+.Dq Unified Extensible Firmware Interface
+.Pq UEFI
+tables.
+.Pp
+The following options are available:
+.Bl -tag -width 20m
+.It Fl t Ar name Fl -table Ar name
+Specify the name of the table to print. Currently
+supported tables: esrt (EFI System Resource Table),
+prop (EFI Properties Table)
+.It Fl u Ar uuid Fl -uuid Ar uuid
+Specify the UUID of the table to print.
+.It Fl j Fl -json
+Print table content in JSON format
+.El
+.Sh HISTORY
+The
+.Nm
+utility first appeared in
+.Fx 14.0 .
Index: usr.sbin/efitable/efitable.c
===================================================================
--- /dev/null
+++ usr.sbin/efitable/efitable.c
@@ -0,0 +1,268 @@
+/*-
+ * Copyright (c) 2021 3mdeb Embedded Systems Consulting.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#include <stdio.h>
+#include <fcntl.h>
+#include <errno.h>
+#include <unistd.h>
+#include <string.h>
+#include <stdlib.h>
+#include <getopt.h>
+#include <uuid.h>
+#include <sys/mman.h>
+#include <sys/stat.h>
+#include <sys/efi.h>
+#include <sys/efiio.h>
+
+#define TABLE_MAX_LEN 30
+#define ARR_LEN(arr) (sizeof(arr) / sizeof((arr)[0]))
+
+static void efi_table_print_esrt(const void *data, int json_format);
+static void efi_table_print_prop(const void *data, int json_format);
+
+struct efi_table_op {
+ char name[TABLE_MAX_LEN];
+ void (*parse) (const void *, int);
+ struct uuid uuid;
+};
+
+static struct efi_table_op efi_table_ops[] = {
+ { .name = "esrt", .parse = efi_table_print_esrt, .uuid = EFI_TABLE_ESRT },
+ { .name = "prop", .parse = efi_table_print_prop, .uuid = EFI_PROPERTIES_TABLE }
+};
+
+int
+main(int argc, char **argv)
+{
+ struct efi_get_table_ioc table = {
+ .buf = NULL,
+ .buf_len = 0,
+ .table_len = 0
+ };
+
+ int efi_fd, ch, rc = 1, efi_idx = -1;
+ int got_table = 0;
+ int table_set = 0;
+ int uuid_set = 0;
+ int use_json = 0;
+
+ struct option longopts[] = {
+ { "uuid", required_argument, NULL, 'u' },
+ { "table", required_argument, NULL, 't' },
+ { "json", no_argument, NULL, 'j' },
+ { NULL, 0, NULL, 0 }
+ };
+
+ while ((ch = getopt_long(argc, argv, "u:t:j", longopts, NULL)) != -1) {
+ switch (ch) {
+ case 'u':
+ {
+ char *uuid_str = optarg;
+ struct uuid uuid;
+ uint32_t status;
+
+ uuid_set = 1;
+
+ uuid_from_string(uuid_str, &uuid, &status);
+ if (status != uuid_s_ok) {
+ fprintf(stderr, "invalid UUID\n");
+ exit(EXIT_FAILURE);
+ }
+ for (size_t n = 0; n < ARR_LEN(efi_table_ops); n++) {
+ if (!memcmp(&uuid, &efi_table_ops[n].uuid, sizeof(uuid))) {
+ efi_idx = n;
+ got_table = 1;
+ break;
+ }
+ }
+ break;
+ }
+ case 't':
+ {
+ char *table_name = optarg;
+
+ table_set = 1;
+
+ for (size_t n = 0; n < ARR_LEN(efi_table_ops); n++) {
+ if (!strcmp(table_name, efi_table_ops[n].name)) {
+ efi_idx = n;
+ got_table = 1;
+ break;
+ }
+ }
+
+ if (!got_table) {
+ fprintf(stderr, "unsupported efi table\n");
+ exit(EXIT_FAILURE);
+ }
+
+ break;
+ }
+ case 'j':
+ use_json = 1;
+ break;
+ default:
+ fprintf(stderr, "Usage: %s [-d uuid | -t name] [-j]\n", argv[0]);
+ exit(EXIT_FAILURE);
+ }
+ }
+
+ if (!table_set && !uuid_set) {
+ fprintf(stderr, "table is not set\n");
+ exit(EXIT_FAILURE);
+ }
+
+ if (!got_table) {
+ fprintf(stderr, "unsupported table\n");
+ exit(EXIT_FAILURE);
+ }
+
+ efi_fd = open("/dev/efi", O_RDWR);
+ if (efi_fd < 0) {
+ fprintf(stderr, "Cannot open /dev/efi: %s\n", strerror(errno));
+ exit(EXIT_FAILURE);
+ }
+
+ table.uuid = efi_table_ops[efi_idx].uuid;
+ if (ioctl(efi_fd, EFIIOC_GET_TABLE, &table) == -1) {
+ fprintf(stderr, "ioctl error: %s\n", strerror(errno));
+ exit(EXIT_FAILURE);
+ }
+
+ table.buf = malloc(table.table_len);
+ table.buf_len = table.table_len;
+
+ if (ioctl(efi_fd, EFIIOC_GET_TABLE, &table) == -1) {
+ fprintf(stderr, "ioctl error: %s\n", strerror(errno));
+ exit(EXIT_FAILURE);
+ }
+
+ efi_table_ops[efi_idx].parse(table.buf, use_json);
+ close(efi_fd);
+
+ return (rc);
+}
+
+static void efi_table_print_esrt(const void *data, int json_format)
+{
+ const struct efi_esrt_table *esrt = NULL;
+ const struct efi_esrt_entry_v1 *entries_v1;
+
+ esrt = (const struct efi_esrt_table *)data;
+ if (!json_format) {
+ printf("fw_resource_count: %u\n", esrt->fw_resource_count);
+ printf("fw_resource_count_max: %u\n", esrt->fw_resource_count_max);
+ printf("fw_resource_version: %lu\n", esrt->fw_resource_version);
+
+ entries_v1 = (const void *) esrt->entries;
+ for (uint32_t i = 0; i < esrt->fw_resource_count; i++) {
+ const struct efi_esrt_entry_v1 *e = &entries_v1[i];
+ uint32_t status;
+ char *uuid;
+
+ uuid_to_string(&e->fw_class, &uuid, &status);
+ if (status != uuid_s_ok) {
+ fprintf(stderr, "uuid_to_string error\n");
+ exit(EXIT_FAILURE);
+ }
+
+ printf("%s%d:\n", "entry", i);
+ printf(" %s: %s\n", "fw_class", uuid);
+ printf(" %s: %u\n", "fw_type", e->fw_type);
+ printf(" %s: %u\n", "fw_version", e->fw_version);
+ printf(" %s: %u\n", "lowest_supported_fw_version",
+ e->lowest_supported_fw_version);
+ printf(" %s: %#x\n", "capsule_flags", e->capsule_flags);
+ printf(" %s: %u\n", "last_attempt_version", e->last_attempt_version);
+ printf(" %s: %u\n", "last_attempt_status", e->last_attempt_status);
+
+ free(uuid);
+
+ return;
+ }
+ }
+
+ printf("{");
+ printf("\"fw_resource_count\": \"%u\",", esrt->fw_resource_count);
+ printf("\"fw_resource_count_max\": \"%u\",", esrt->fw_resource_count_max);
+ printf("\"fw_resource_version\": \"%lu\",", esrt->fw_resource_version);
+ printf("\"entries\":[");
+
+ entries_v1 = (const void *) esrt->entries;
+ for (uint32_t i = 0; i < esrt->fw_resource_count; i++) {
+ const struct efi_esrt_entry_v1 *e = &entries_v1[i];
+ uint32_t status;
+ char *uuid;
+
+ uuid_to_string(&e->fw_class, &uuid, &status);
+ if (status != uuid_s_ok) {
+ fprintf(stderr, "\nuuid_to_string error\n");
+ exit(EXIT_FAILURE);
+ }
+
+ printf("%s", (!i) ? "{" : ",{");
+ printf("\"%s\": \"%s\",", "fw_class", uuid);
+ printf("\"%s\": \"%u\",", "fw_type", e->fw_type);
+ printf("\"%s\": \"%u\",", "fw_version", e->fw_version);
+ printf("\"%s\": \"%u\",", "lowest_supported_fw_version",
+ e->lowest_supported_fw_version);
+ printf("\"%s\": \"%#x\",", "capsule_flags", e->capsule_flags);
+ printf("\"%s\": \"%u\",", "last_attempt_version", e->last_attempt_version);
+ printf("\"%s\": \"%u\"", "last_attempt_status", e->last_attempt_status);
+ printf("%s", "}");
+
+ free(uuid);
+ }
+ printf("]}");
+
+ return;
+}
+
+static void efi_table_print_prop(const void *data, int json_format)
+{
+ const struct efi_prop_table *prop = NULL;
+
+ prop = (const struct efi_prop_table *)data;
+
+ if (!json_format) {
+ printf("version: %#x\n", prop->version);
+ printf("length: %u\n", prop->length);
+ printf("memory_protection_attribute: %#lx\n",
+ prop->memory_protection_attribute);
+ return;
+ }
+
+ printf("{");
+ printf("\"version\": \"%#x\",", prop->version);
+ printf("\"length\": \"%u\",", prop->length);
+ printf("\"memory_protection_attribute\": \"%#lx\"",
+ prop->memory_protection_attribute);
+ printf("}");
+
+ return;
+}
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Sat, May 16, 10:15 AM (3 h, 40 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
33126243
Default Alt Text
D30104.id91103.diff (18 KB)
Attached To
Mode
D30104: efirt: add ESRT table support
Attached
Detach File
Event Timeline
Log In to Comment