On 11/26/22 11:59, Safae Ouajih wrote: > [You don't often get email from soua...@baylibre.com. Learn why this is > important at https://aka.ms/LearnAboutSenderIdentification ] > > This adds support for libxbc used to support Bootconfig feature. > Bootconfig documentation : [1] > This was imported from [2], commit [3]
This should be written something like This was adapted from downstream [2] commit 7af0a0506d4 ("shortlog summary"). > > [1] > https://source.android.com/docs/core/architecture/bootloader/implementing-bootconfig > [2] https://android.googlesource.com/platform/external/u-boot/ > [3] `7af0a0506d4de6f5ea147d10fb0664a8af07d326` > > Signed-off-by: Safae Ouajih <soua...@baylibre.com> > --- > include/xbc.h | 1 + > lib/Kconfig | 12 +++++ > lib/Makefile | 1 + > lib/libxbc/Makefile | 1 + > lib/libxbc/libxbc.c | 112 ++++++++++++++++++++++++++++++++++++++++++++ > lib/libxbc/libxbc.h | 54 +++++++++++++++++++++ > 6 files changed, 181 insertions(+) > create mode 100644 include/xbc.h > create mode 100644 lib/libxbc/Makefile > create mode 100644 lib/libxbc/libxbc.c > create mode 100644 lib/libxbc/libxbc.h I understand that you may want to import this "library" directly, but it is really so short that I question the virtue of this. I think it would be better to convert this to U-Boot style. --Sean > diff --git a/include/xbc.h b/include/xbc.h > new file mode 100644 > index 000000000000..725e65ff6ad8 > --- /dev/null > +++ b/include/xbc.h > @@ -0,0 +1 @@ > +#include <../lib/libxbc/libxbc.h> > diff --git a/lib/Kconfig b/lib/Kconfig > index 6abe1d0a863b..eca752b7db79 100644 > --- a/lib/Kconfig > +++ b/lib/Kconfig > @@ -417,6 +417,18 @@ config LIBAVB > > endmenu > > +menu "Android Boot Configuration" > +config LIBXBC > + bool "Android Boot Configuration support" > + depends on ANDROID_BOOT_IMAGE > + default n > + help > + This enables support of Boot Configuration which can be used > + to pass boot configuration parameters to user space. These > + parameters will show up in /proc/bootconfig similar to the kernel > + parameters that show up in /proc/cmdline > +endmenu > + > menu "Hashing Support" > > config BLAKE2 > diff --git a/lib/Makefile b/lib/Makefile > index f2cfd1e42892..b0ad522ac116 100644 > --- a/lib/Makefile > +++ b/lib/Makefile > @@ -87,6 +87,7 @@ obj-$(CONFIG_$(SPL_)LZ4) += lz4_wrapper.o > obj-$(CONFIG_$(SPL_)LIB_RATIONAL) += rational.o > > obj-$(CONFIG_LIBAVB) += libavb/ > +obj-$(CONFIG_LIBXBC) += libxbc/ > > obj-$(CONFIG_$(SPL_TPL_)OF_LIBFDT) += libfdt/ > obj-$(CONFIG_$(SPL_TPL_)OF_REAL) += fdtdec_common.o fdtdec.o > diff --git a/lib/libxbc/Makefile b/lib/libxbc/Makefile > new file mode 100644 > index 000000000000..7ac4cde05666 > --- /dev/null > +++ b/lib/libxbc/Makefile > @@ -0,0 +1 @@ > +obj-$(CONFIG_LIBXBC) += libxbc.o > diff --git a/lib/libxbc/libxbc.c b/lib/libxbc/libxbc.c > new file mode 100644 > index 000000000000..129bffc7c628 > --- /dev/null > +++ b/lib/libxbc/libxbc.c > @@ -0,0 +1,112 @@ > +/* > + * Copyright (C) 2021 The Android Open Source Project > + * > + * Licensed under the Apache License, Version 2.0 (the "License"); > + * you may not use this file except in compliance with the License. > + * You may obtain a copy of the License at > + * > + * http://www.apache.org/licenses/LICENSE-2.0 > + * > + * Unless required by applicable law or agreed to in writing, software > + * distributed under the License is distributed on an "AS IS" BASIS, > + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. > + * See the License for the specific language governing permissions and > + * limitations under the License. > + */ > +#include "libxbc.h" > +#define BOOTCONFIG_MAGIC "#BOOTCONFIG\n" > +#define BOOTCONFIG_MAGIC_SIZE 12 > +#define BOOTCONFIG_SIZE_SIZE 4 > +#define BOOTCONFIG_CHECKSUM_SIZE 4 > +#define BOOTCONFIG_TRAILER_SIZE BOOTCONFIG_MAGIC_SIZE + \ > + BOOTCONFIG_SIZE_SIZE + \ > + BOOTCONFIG_CHECKSUM_SIZE > + > +/* > + * Simple checksum for a buffer. > + * > + * @param addr pointer to the start of the buffer. > + * @param size size of the buffer in bytes. > + * @return check sum result. > + */ > +static uint32_t checksum(const unsigned char* const buffer, uint32_t size) { > + uint32_t sum = 0; > + for (uint32_t i = 0; i < size; i++) { > + sum += buffer[i]; > + } > + return sum; > +} > + > +/* > + * Check if the bootconfig trailer is present within the bootconfig section. > + * > + * @param bootconfig_end_addr address of the end of the bootconfig section. > If > + * the trailer is present, it will be directly preceding this address. > + * @return true if the trailer is present, false if not. > + */ > +static bool isTrailerPresent(uint64_t bootconfig_end_addr) { > + return !strncmp((char*)(bootconfig_end_addr - BOOTCONFIG_MAGIC_SIZE), > + BOOTCONFIG_MAGIC, BOOTCONFIG_MAGIC_SIZE); > +} > + > +/* > + * Add a string of boot config parameters to memory appended by the trailer. > + */ > +int32_t addBootConfigParameters(char* params, uint32_t params_size, > + uint64_t bootconfig_start_addr, uint32_t bootconfig_size) { > + if (!params || !bootconfig_start_addr) { > + return -1; > + } > + if (params_size == 0) { > + return 0; > + } > + int32_t applied_bytes = 0; > + int32_t new_size = 0; > + uint64_t end = bootconfig_start_addr + bootconfig_size; > + if (isTrailerPresent(end)) { > + end -= BOOTCONFIG_TRAILER_SIZE; > + applied_bytes -= BOOTCONFIG_TRAILER_SIZE; > + memcpy(&new_size, (void *)end, BOOTCONFIG_SIZE_SIZE); > + } else { > + new_size = bootconfig_size; > + } > + // params > + memcpy((void*)end, params, params_size); > + applied_bytes += params_size; > + applied_bytes += addBootConfigTrailer(bootconfig_start_addr, > + bootconfig_size + applied_bytes); > + return applied_bytes; > +} > + > +/* > + * Add boot config trailer. > + */ > + > +int32_t addBootConfigTrailer(uint64_t bootconfig_start_addr, > + uint32_t bootconfig_size) { > + if (!bootconfig_start_addr) { > + return -1; > + } > + > + if (bootconfig_size == 0) { > + return 0; > + } > + > + uint64_t end = bootconfig_start_addr + bootconfig_size; > + if (isTrailerPresent(end)) { > + return 0; > + } > + > + // size > + memcpy((void *)(end), &bootconfig_size, BOOTCONFIG_SIZE_SIZE); > + > + // checksum > + uint32_t sum = checksum((unsigned char*)bootconfig_start_addr, > bootconfig_size); > + memcpy((void *)(end + BOOTCONFIG_SIZE_SIZE), &sum, > BOOTCONFIG_CHECKSUM_SIZE); > + > + // magic > + memcpy((void *)(end + BOOTCONFIG_SIZE_SIZE + BOOTCONFIG_CHECKSUM_SIZE), > + BOOTCONFIG_MAGIC, BOOTCONFIG_MAGIC_SIZE); > + > + return BOOTCONFIG_TRAILER_SIZE; > +} > diff --git a/lib/libxbc/libxbc.h b/lib/libxbc/libxbc.h > new file mode 100644 > index 000000000000..0b6ba4960905 > --- /dev/null > +++ b/lib/libxbc/libxbc.h > @@ -0,0 +1,54 @@ > +/* > + * Copyright (C) 2021 The Android Open Source Project > + * > + * Licensed under the Apache License, Version 2.0 (the "License"); > + * you may not use this file except in compliance with the License. > + * You may obtain a copy of the License at > + * > + * http://www.apache.org/licenses/LICENSE-2.0 > + * > + * Unless required by applicable law or agreed to in writing, software > + * distributed under the License is distributed on an "AS IS" BASIS, > + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. > + * See the License for the specific language governing permissions and > + * limitations under the License. > + */ > +#ifndef LIBXBC_H_ > +#define LIBXBC_H_ > + > +#include <common.h> > +/* > + * Add a string of boot config parameters to memory appended by the trailer. > + * This memory needs to be immediately following the end of the ramdisks. > + * The new boot config trailer will be written to the end of the entire > + * parameter section(previous + new). The trailer contains a 4 byte size of > the > + * parameters, followed by a 4 byte checksum of the parameters, followed by > a 12 > + * byte magic string. > + * > + * @param params pointer to string of boot config parameters > + * @param params_size size of params string in bytes > + * @param bootconfig_start_addr address that the boot config section is > starting > + * at in memory. > + * @param bootconfig_size size of the current bootconfig section in bytes. > + * @return number of bytes added to the boot config section. -1 for error. > + */ > +int addBootConfigParameters(char *params, uint32_t params_size, > + uint64_t bootconfig_start_addr, > + uint32_t bootconfig_size); > +/* > + * Add the boot config trailer to the end of the boot config parameter > section. > + * This can be used after the vendor bootconfig section has been placed into > + * memory if there are no additional parameters that need to be added. > + * The new boot config trailer will be written to the end of the entire > + * parameter section at (bootconfig_start_addr + bootconfig_size). > + * The trailer contains a 4 byte size of the parameters, followed by a 4 byte > + * checksum of the parameters, followed by a 12 byte magic string. > + * > + * @param bootconfig_start_addr address that the boot config section is > starting > + * at in memory. > + * @param bootconfig_size size of the current bootconfig section in bytes. > + * @return number of bytes added to the boot config section. -1 for error. > + */ > +int addBootConfigTrailer(uint64_t bootconfig_start_addr, > + uint32_t bootconfig_size); > +#endif /* LIBXBC_H_ */ > -- > 2.25.1 >