enhancing the infrastructure to enable the Platform Keystore (PKS) feature, which provides access to the SB VERSION, DB, and DBX secure boot variables from PKS.
Signed-off-by: Sudhakar Kuppusamy <sudha...@linux.ibm.com> Reviewed-by: Stefan Berger <stef...@linux.ibm.com> Reviewed-by: Avnish Chouhan <avn...@linux.ibm.com> --- grub-core/Makefile.am | 1 + grub-core/Makefile.core.def | 1 + grub-core/kern/powerpc/ieee1275/ieee1275.c | 140 +++++++++++++++++++++ include/grub/powerpc/ieee1275/ieee1275.h | 14 +++ 4 files changed, 156 insertions(+) create mode 100644 grub-core/kern/powerpc/ieee1275/ieee1275.c diff --git a/grub-core/Makefile.am b/grub-core/Makefile.am index e50db8106..b516e139b 100644 --- a/grub-core/Makefile.am +++ b/grub-core/Makefile.am @@ -241,6 +241,7 @@ KERNEL_HEADER_FILES += $(top_builddir)/include/grub/machine/kernel.h endif if COND_powerpc_ieee1275 +KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/powerpc/ieee1275/ieee1275.h KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/ieee1275/ieee1275.h KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/ieee1275/alloc.h KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/terminfo.h diff --git a/grub-core/Makefile.core.def b/grub-core/Makefile.core.def index 1ed55b0e3..95bccce5d 100644 --- a/grub-core/Makefile.core.def +++ b/grub-core/Makefile.core.def @@ -328,6 +328,7 @@ kernel = { extra_dist = video/sis315_init.c; mips_loongson = commands/keylayouts.c; + powerpc_ieee1275 = kern/powerpc/ieee1275/ieee1275.c; powerpc_ieee1275 = kern/powerpc/cache.S; powerpc_ieee1275 = kern/powerpc/dl.c; powerpc_ieee1275 = kern/powerpc/compiler-rt.S; diff --git a/grub-core/kern/powerpc/ieee1275/ieee1275.c b/grub-core/kern/powerpc/ieee1275/ieee1275.c new file mode 100644 index 000000000..f685afcff --- /dev/null +++ b/grub-core/kern/powerpc/ieee1275/ieee1275.c @@ -0,0 +1,140 @@ +/* of.c - Access the Open Firmware client interface. */ +/* + * GRUB -- GRand Unified Bootloader + * Copyright (C) 2003,2004,2005,2007,2008,2009 Free Software Foundation, Inc. + * + * GRUB is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * GRUB is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with GRUB. If not, see <http://www.gnu.org/licenses/>. + */ +#include <grub/ieee1275/ieee1275.h> +#include <grub/powerpc/ieee1275/ieee1275.h> +#include <grub/misc.h> + +#define IEEE1275_CELL_INVALID ((grub_ieee1275_cell_t) - 1) + +int +grub_ieee1275_test (const char *name, grub_ieee1275_cell_t *missing) +{ + struct test_args + { + struct grub_ieee1275_common_hdr common; + grub_ieee1275_cell_t name; + grub_ieee1275_cell_t missing; + } args; + + INIT_IEEE1275_COMMON (&args.common, "test", 1, 1); + args.name = (grub_ieee1275_cell_t) name; + + if (IEEE1275_CALL_ENTRY_FN (&args) == -1) + return -1; + + if (args.missing == IEEE1275_CELL_INVALID) + return -1; + + *missing = args.missing; + + return 0; +} + +int +grub_ieee1275_pks_max_object_size (grub_size_t *result) +{ + struct mos_args + { + struct grub_ieee1275_common_hdr common; + grub_ieee1275_cell_t size; + } args; + + INIT_IEEE1275_COMMON (&args.common, "pks-max-object-size", 0, 1); + + if (IEEE1275_CALL_ENTRY_FN (&args) == -1) + return -1; + + if (args.size == IEEE1275_CELL_INVALID) + return -1; + + *result = args.size; + + return 0; +} + +int +grub_ieee1275_pks_read_object (grub_uint8_t consumer, grub_uint8_t *label, + grub_size_t label_len, grub_uint8_t *buffer, + grub_size_t buffer_len, grub_size_t *data_len, + grub_uint32_t *policies) +{ + struct pks_read_args + { + struct grub_ieee1275_common_hdr common; + grub_ieee1275_cell_t consumer; + grub_ieee1275_cell_t label; + grub_ieee1275_cell_t label_len; + grub_ieee1275_cell_t buffer; + grub_ieee1275_cell_t buffer_len; + grub_ieee1275_cell_t data_len; + grub_ieee1275_cell_t policies; + grub_ieee1275_cell_t rc; + } args; + + INIT_IEEE1275_COMMON (&args.common, "pks-read-object", 5, 3); + args.consumer = (grub_ieee1275_cell_t) consumer; + args.label = (grub_ieee1275_cell_t) label; + args.label_len = (grub_ieee1275_cell_t) label_len; + args.buffer = (grub_ieee1275_cell_t) buffer; + args.buffer_len = (grub_ieee1275_cell_t) buffer_len; + + if (IEEE1275_CALL_ENTRY_FN (&args) == -1) + return -1; + + if (args.data_len == IEEE1275_CELL_INVALID) + return -1; + + *data_len = args.data_len; + *policies = args.policies; + + return (int) args.rc; +} + +int +grub_ieee1275_pks_read_sbvar (grub_uint8_t sbvarflags, grub_uint8_t sbvartype, + grub_uint8_t *buffer, grub_size_t buffer_len, + grub_size_t *data_len) +{ + struct pks_read_sbvar_args + { + struct grub_ieee1275_common_hdr common; + grub_ieee1275_cell_t sbvarflags; + grub_ieee1275_cell_t sbvartype; + grub_ieee1275_cell_t buffer; + grub_ieee1275_cell_t buffer_len; + grub_ieee1275_cell_t data_len; + grub_ieee1275_cell_t rc; + } args; + + INIT_IEEE1275_COMMON (&args.common, "pks-read-sbvar", 4, 2); + args.sbvarflags = (grub_ieee1275_cell_t) sbvarflags; + args.sbvartype = (grub_ieee1275_cell_t) sbvartype; + args.buffer = (grub_ieee1275_cell_t) buffer; + args.buffer_len = (grub_ieee1275_cell_t) buffer_len; + + if (IEEE1275_CALL_ENTRY_FN (&args) == -1) + return -1; + + if (args.data_len == IEEE1275_CELL_INVALID) + return -1; + + *data_len = args.data_len; + + return (int) args.rc; +} diff --git a/include/grub/powerpc/ieee1275/ieee1275.h b/include/grub/powerpc/ieee1275/ieee1275.h index 4eb207018..0d48331c2 100644 --- a/include/grub/powerpc/ieee1275/ieee1275.h +++ b/include/grub/powerpc/ieee1275/ieee1275.h @@ -28,4 +28,18 @@ typedef grub_uint32_t grub_ieee1275_cell_t; #define PRIxGRUB_IEEE1275_CELL_T PRIxGRUB_UINT32_T #define PRIuGRUB_IEEE1275_CELL_T PRIuGRUB_UINT32_T +int EXPORT_FUNC (grub_ieee1275_test) (const char *name, + grub_ieee1275_cell_t *missing); + +int grub_ieee1275_pks_max_object_size (grub_size_t *result); + +int grub_ieee1275_pks_read_object (grub_uint8_t consumer, grub_uint8_t *label, + grub_size_t label_len, grub_uint8_t *buffer, + grub_size_t buffer_len, grub_size_t *data_len, + grub_uint32_t *policies); + +int grub_ieee1275_pks_read_sbvar (grub_uint8_t sbvarflags, grub_uint8_t sbvartype, + grub_uint8_t *buffer, grub_size_t buffer_len, + grub_size_t *data_len); + #endif /* ! GRUB_IEEE1275_MACHINE_HEADER */ -- 2.43.5 _______________________________________________ Grub-devel mailing list Grub-devel@gnu.org https://lists.gnu.org/mailman/listinfo/grub-devel