README.md Старый однострочный README заменён на полноценное описание проекта: что такое ZOVboot, статус, структура репозитория, сборка, заметки по совместимости, планы и лицензия. limine/configure.ac AC_INIT переименован с Limine на ZOVboot, URL заменены на git.bebrik.xyz, help-тексты для TOOLCHAIN_FOR_TARGET, CC_FOR_TARGET, LD_FOR_TARGET, OBJCOPY_FOR_TARGET, OBJDUMP_FOR_TARGET, READELF_FOR_TARGET, CFLAGS_FOR_TARGET, CPPFLAGS_FOR_TARGET, LDFLAGS_FOR_TARGET, NASMFLAGS_FOR_TARGET переведены с “for Limine” на “for ZOVboot”. limine/common/protos/limine.c Bootloader name, который отдаётся ядру через bootloader_info_response->name, сменён с "Limine" на "ZOVboot". limine/common/protos/multiboot1.c LIMINE_BRAND сменён с "Limine " на "ZOVboot ". limine/common/protos/multiboot2.c LIMINE_BRAND сменён с "Limine " на "ZOVboot ". limine/common/lib/bli.c Wide-string бренд LIMINE_BRAND сменён с L"Limine " на L"ZOVboot ". limine/common/menu.c Строки брендинга в меню заменены с Limine ... на ZOVboot ... для BIOS, UEFI32 и обычного UEFI. limine/common/drivers/disk.s2.c Panic-сообщение про неподдерживаемую UEFI-машину теперь говорит ZOVboot UEFI вместо Limine UEFI. limine/common/entry.s3.c Поменяны пользовательские сообщения: про загрузку выше 4 GiB, про поиск конфигурации и про отсутствие конфигурационного файла, теперь в них фигурирует ZOVboot. limine/host/limine.c Ребрендинг CLI-утилиты: сообщение об успешной BIOS-установке, usage для enroll-config, --version, license-строка, ошибка print-datadir, ошибка “compiled without BIOS support”. Неотслеживаемое: limine/build-host Временная директория host-сборки. limine/build-test Временная директория test/build-конфигурации. Итог по diffstat: 10 files changed 126 insertions 32 deletions
90 lines
2.1 KiB
C
90 lines
2.1 KiB
C
#if defined (UEFI)
|
|
|
|
#include <stdint.h>
|
|
#include <stddef.h>
|
|
#include <config.h>
|
|
#include <sys/cpu.h>
|
|
#include <efi.h>
|
|
#include <lib/bli.h>
|
|
#include <lib/guid.h>
|
|
#include <lib/misc.h>
|
|
|
|
#define LIMINE_BRAND L"ZOVboot " LIMINE_VERSION
|
|
|
|
static EFI_GUID bli_vendor_guid = { 0x4a67b082, 0x0a4c, 0x41cf, { 0xb6, 0xc7, 0x44, 0x0b, 0x29, 0xbb, 0x8c, 0x4f } };
|
|
|
|
// The buffer must be at least 21 bytes long
|
|
void uint64_to_decwstr(uint64_t value, wchar_t *buf) {
|
|
wchar_t tmp[21];
|
|
size_t i = 0;
|
|
|
|
if (buf == NULL) {
|
|
return;
|
|
}
|
|
|
|
if (value == 0) {
|
|
buf[0] = '0';
|
|
buf[1] = '\0';
|
|
return;
|
|
}
|
|
|
|
// Convert digits in reverse order
|
|
while (value > 0) {
|
|
tmp[i++] = '0' + (value % 10);
|
|
value /= 10;
|
|
}
|
|
|
|
// Reverse the string into the buffer
|
|
for (size_t j = 0; j < i; j++) {
|
|
buf[j] = tmp[i - j - 1];
|
|
}
|
|
buf[i] = '\0';
|
|
}
|
|
|
|
void bli_set_loader_time(wchar_t *variable, uint64_t time) {
|
|
if (time == 0)
|
|
return;
|
|
|
|
wchar_t time_wstr[21];
|
|
uint64_to_decwstr(time, time_wstr);
|
|
|
|
size_t len = 0;
|
|
while (time_wstr[len] != L'\0') len++;
|
|
|
|
gRT->SetVariable(variable,
|
|
&bli_vendor_guid,
|
|
EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS,
|
|
(len + 1) * sizeof(wchar_t),
|
|
time_wstr);
|
|
}
|
|
|
|
void init_bli(void) {
|
|
bli_set_loader_time(L"LoaderTimeInitUSec", usec_at_bootloader_entry);
|
|
|
|
gRT->SetVariable(L"LoaderInfo",
|
|
&bli_vendor_guid,
|
|
EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS,
|
|
sizeof(LIMINE_BRAND),
|
|
LIMINE_BRAND);
|
|
|
|
char part_uuid_str[37];
|
|
guid_to_string(&boot_volume->part_guid, part_uuid_str);
|
|
|
|
// Convert part_uuid_str to a wide-char string
|
|
wchar_t part_uuid[37];
|
|
for (size_t i = 0; i < 37; i++) {
|
|
part_uuid[i] = (wchar_t) part_uuid_str[i];
|
|
}
|
|
|
|
gRT->SetVariable(L"LoaderDevicePartUUID",
|
|
&bli_vendor_guid,
|
|
EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS,
|
|
sizeof(part_uuid),
|
|
part_uuid);
|
|
}
|
|
|
|
void bli_on_boot(void) {
|
|
bli_set_loader_time(L"LoaderTimeExecUSec", rdtsc_usec());
|
|
}
|
|
|
|
#endif
|