/* ieee1275.c - Access the Open Firmware client interface. */ /* * GRUB -- GRand Unified Bootloader * Copyright (C) 2003,2004,2005,2007,2008,2009 Free Software Foundation, Inc. * Copyright (C) 2020, 2021, 2022, 2023, 2024, 2025 IBM Corporation * * 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 . */ #include #include #include grub_int32_t grub_ieee1275_test (const char *interface_name) { struct test_args { struct grub_ieee1275_common_hdr common;/* The header information like interface name, number of inputs and outputs. */ grub_ieee1275_cell_t name; /* The interface name. */ grub_ieee1275_cell_t missing; } args; INIT_IEEE1275_COMMON (&args.common, "test", 1, 1); args.name = (grub_ieee1275_cell_t) interface_name; if (IEEE1275_CALL_ENTRY_FN (&args) == -1) return -1; if (args.missing == IEEE1275_CELL_INVALID) return -1; return 0; } grub_int32_t grub_ieee1275_pks_max_object_size (grub_uint32_t *result) { struct mos_args { struct grub_ieee1275_common_hdr common;/* The header information like interface name, number of inputs and outputs. */ grub_ieee1275_cell_t size; /* The maximum object size for a PKS object. */ } args; INIT_IEEE1275_COMMON (&args.common, GRUB_PKS_MAX_OBJ_INTERFACE, 0, 1); if (IEEE1275_CALL_ENTRY_FN (&args) == -1) return -1; if (args.size == IEEE1275_CELL_INVALID || args.size == 0) return -1; *result = args.size; return 0; } grub_int32_t grub_ieee1275_pks_read_object (const grub_uint32_t consumer, const char *label, const grub_uint32_t label_len, const grub_uint32_t buffer_len, grub_uint8_t *buffer, grub_uint32_t *data_len, grub_uint32_t *policies) { struct pks_read_args { struct grub_ieee1275_common_hdr common; /* The header information like interface name, number of inputs and outputs. */ grub_ieee1275_cell_t consumer; /* The object belonging to consumer with the label. */ grub_ieee1275_cell_t label; /* Object label buffer logical real address. */ grub_ieee1275_cell_t label_len; /* The byte length of the object label. */ grub_ieee1275_cell_t buffer; /* Output buffer logical real address. */ grub_ieee1275_cell_t buffer_len; /* Length of the output buffer. */ grub_ieee1275_cell_t data_len; /* The number of bytes copied to the output buffer. */ grub_ieee1275_cell_t policies; /* The object policies. */ grub_int32_t rc; /* The return code. */ } args; INIT_IEEE1275_COMMON (&args.common, GRUB_PKS_READ_OBJ_INTERFACE, 5, 3); args.consumer = consumer; args.label_len = label_len; args.buffer_len = buffer_len; args.label = (grub_ieee1275_cell_t) label; args.buffer = (grub_ieee1275_cell_t) buffer; 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 args.rc; } grub_int32_t grub_ieee1275_pks_read_sbvar (const grub_uint32_t sbvar_flags, const grub_uint32_t sbvar_type, const grub_uint32_t buffer_len, grub_uint8_t *buffer, grub_size_t *data_len) { struct pks_read_sbvar_args { struct grub_ieee1275_common_hdr common; /* The header information like interface name, number of inputs and outputs. */ grub_ieee1275_cell_t sbvar_flags; /* The sbvar operation flags. */ grub_ieee1275_cell_t sbvar_type; /* The sbvar being requested. */ grub_ieee1275_cell_t buffer; /* Output buffer logical real address. */ grub_ieee1275_cell_t buffer_len; /* Length of the Output buffer. */ grub_ieee1275_cell_t data_len; /* The number of bytes copied to the output buffer. */ grub_int32_t rc; /* The return code. */ } args; INIT_IEEE1275_COMMON (&args.common, GRUB_PKS_READ_SBVAR_INTERFACE, 4, 2); args.sbvar_flags = sbvar_flags; args.sbvar_type = sbvar_type; args.buffer_len = buffer_len; args.buffer = (grub_ieee1275_cell_t) buffer; if (IEEE1275_CALL_ENTRY_FN (&args) == -1) return -1; if (args.data_len == IEEE1275_CELL_INVALID) return -1; *data_len = args.data_len; return args.rc; }