Source-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[src/trunk]: src/sys/arch/i386/stand/efiboot efiboot: Added serial console su...
details: https://anonhg.NetBSD.org/src/rev/2e0fda9b78cb
branches: trunk
changeset: 360720:2e0fda9b78cb
user: nonaka <nonaka%NetBSD.org@localhost>
date: Tue Mar 27 14:15:05 2018 +0000
description:
efiboot: Added serial console support.
diffstat:
sys/arch/i386/stand/efiboot/Makefile.efiboot | 4 +-
sys/arch/i386/stand/efiboot/boot.c | 118 ++++-
sys/arch/i386/stand/efiboot/bootia32/efibootia32.c | 8 +-
sys/arch/i386/stand/efiboot/bootx64/efibootx64.c | 8 +-
sys/arch/i386/stand/efiboot/efiboot.c | 12 +-
sys/arch/i386/stand/efiboot/efiboot.h | 8 +-
sys/arch/i386/stand/efiboot/efichar.c | 195 ++++++++
sys/arch/i386/stand/efiboot/eficons.c | 467 +++++++++++++++++++-
sys/arch/i386/stand/efiboot/efidelay.c | 18 +-
sys/arch/i386/stand/efiboot/efidisk.c | 8 +-
sys/arch/i386/stand/efiboot/efimemory.c | 18 +-
11 files changed, 765 insertions(+), 99 deletions(-)
diffs (truncated from 1318 to 300 lines):
diff -r a410cbd2ee66 -r 2e0fda9b78cb sys/arch/i386/stand/efiboot/Makefile.efiboot
--- a/sys/arch/i386/stand/efiboot/Makefile.efiboot Tue Mar 27 11:59:49 2018 +0000
+++ b/sys/arch/i386/stand/efiboot/Makefile.efiboot Tue Mar 27 14:15:05 2018 +0000
@@ -1,4 +1,4 @@
-# $NetBSD: Makefile.efiboot,v 1.10 2018/03/08 10:34:33 nonaka Exp $
+# $NetBSD: Makefile.efiboot,v 1.11 2018/03/27 14:15:05 nonaka Exp $
S= ${.CURDIR}/../../../../..
@@ -12,7 +12,7 @@
LIBI386SRCS= boot.c biosdisk.c bootinfo.c bootinfo_biosgeom.c
LIBI386SRCS+= bootmenu.c diskbuf.c exec.c menuutils.c
LIBI386SRCS+= panic.c parseutils.c pread.c
-LIBI386SRCS+= eficons.c efidelay.c efidev.c efidisk.c efidisk_ll.c
+LIBI386SRCS+= efichar.c eficons.c efidelay.c efidev.c efidisk.c efidisk_ll.c
LIBI386SRCS+= efigetsecs.c efimemory.c
SRCS= ${SOURCES} ${EXTRA_SOURCES} ${LIBI386SRCS}
diff -r a410cbd2ee66 -r 2e0fda9b78cb sys/arch/i386/stand/efiboot/boot.c
--- a/sys/arch/i386/stand/efiboot/boot.c Tue Mar 27 11:59:49 2018 +0000
+++ b/sys/arch/i386/stand/efiboot/boot.c Tue Mar 27 14:15:05 2018 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: boot.c,v 1.7 2018/03/20 10:18:10 nonaka Exp $ */
+/* $NetBSD: boot.c,v 1.8 2018/03/27 14:15:05 nonaka Exp $ */
/*-
* Copyright (c) 2016 Kimihiro Nonaka <nonaka%netbsd.org@localhost>
@@ -463,11 +463,16 @@
char *sep, *sep2 = NULL;
int ioport, speed = 0;
+ if (*arg == '\0') {
+ efi_cons_show();
+ return;
+ }
+
sep = strchr(arg, ',');
if (sep != NULL) {
*sep++ = '\0';
sep2 = strchr(sep, ',');
- if (sep != NULL)
+ if (sep2 != NULL)
*sep2++ = '\0';
}
@@ -555,6 +560,8 @@
command_version(char *arg)
{
CHAR16 *path;
+ char *upath, *ufirmware;
+ int rv;
if (strcmp(arg, "full") == 0) {
printf("ImageBase: 0x%" PRIxPTR "\n",
@@ -562,12 +569,24 @@
printf("Stack: 0x%" PRIxPTR "\n", efi_main_sp);
printf("EFI version: %d.%02d\n",
ST->Hdr.Revision >> 16, ST->Hdr.Revision & 0xffff);
- Print(L"EFI Firmware: %s (rev %d.%02d)\n", ST->FirmwareVendor,
- ST->FirmwareRevision >> 16, ST->FirmwareRevision & 0xffff);
+ ufirmware = NULL;
+ rv = ucs2_to_utf8(ST->FirmwareVendor, &ufirmware);
+ if (rv == 0) {
+ printf("EFI Firmware: %s (rev %d.%02d)\n", ufirmware,
+ ST->FirmwareRevision >> 16,
+ ST->FirmwareRevision & 0xffff);
+ FreePool(ufirmware);
+ }
path = DevicePathToStr(efi_bootdp);
- Print(L"Boot DevicePath: %d:%d:%s\n", DevicePathType(efi_bootdp),
- DevicePathSubType(efi_bootdp), path);
+ upath = NULL;
+ rv = ucs2_to_utf8(path, &upath);
FreePool(path);
+ if (rv == 0) {
+ printf("Boot DevicePath: %d:%d:%s\n",
+ DevicePathType(efi_bootdp),
+ DevicePathSubType(efi_bootdp), upath);
+ FreePool(upath);
+ }
}
printf("\n"
@@ -603,7 +622,9 @@
EFI_HANDLE *handles;
EFI_DEVICE_PATH *dp0, *dp;
CHAR16 *path;
+ char *upath;
UINTN cols, rows, row = 0;
+ int rv;
status = uefi_call_wrapper(ST->ConOut->QueryMode, 4, ST->ConOut,
ST->ConOut->Mode->Mode, &cols, &rows);
@@ -626,41 +647,54 @@
if (EFI_ERROR(status))
break;
- Print(L"DevicePathType %d\n", DevicePathType(dp0));
+ printf("DevicePathType %d\n", DevicePathType(dp0));
if (++row >= rows) {
row = 0;
- Print(L"Press Any Key to continue :");
+ printf("Press Any Key to continue :");
(void) awaitkey(-1, 0);
- Print(L"\n");
+ printf("\n");
}
for (dp = dp0;
!IsDevicePathEnd(dp);
dp = NextDevicePathNode(dp)) {
+
path = DevicePathToStr(dp);
- Print(L"%d:%d:%s\n", DevicePathType(dp), DevicePathSubType(dp), path);
+ upath = NULL;
+ rv = ucs2_to_utf8(path, &upath);
FreePool(path);
+ if (rv) {
+ printf("convert failed\n");
+ break;
+ }
+
+ printf("%d:%d:%s\n", DevicePathType(dp),
+ DevicePathSubType(dp), upath);
+ FreePool(upath);
if (++row >= rows) {
row = 0;
- Print(L"Press Any Key to continue :");
+ printf("Press Any Key to continue :");
(void) awaitkey(-1, 0);
- Print(L"\n");
+ printf("\n");
}
}
}
}
+
void
command_efivar(char *arg)
{
- static const CHAR16 header[] =
- L"GUID Variable Name Value\n"
- L"=================================== ==================== ========\n";
+ static const char header[] =
+ "GUID Variable Name Value\n"
+ "==================================== ==================== ========\n";
EFI_STATUS status;
UINTN sz = 64, osz;
- CHAR16 *name = NULL, *tmp, *val;
+ CHAR16 *name = NULL, *tmp, *val, guid[128];
+ char *uname, *uval, *uguid;
EFI_GUID vendor;
UINTN cols, rows, row = 0;
+ int rv;
status = uefi_call_wrapper(ST->ConOut->QueryMode, 4, ST->ConOut,
ST->ConOut->Mode->Mode, &cols, &rows);
@@ -671,15 +705,15 @@
name = AllocatePool(sz);
if (name == NULL) {
- Print(L"memory allocation failed: %ld bytes\n",
- (UINT64)sz);
+ printf("memory allocation failed: %" PRIuMAX" bytes\n",
+ (uintmax_t)sz);
return;
}
SetMem(name, sz, 0);
vendor = NullGuid;
- Print(L"%s", header);
+ printf("%s", header);
for (;;) {
osz = sz;
status = uefi_call_wrapper(RT->GetNextVariableName, 3,
@@ -688,15 +722,15 @@
if (status == EFI_NOT_FOUND)
break;
if (status != EFI_BUFFER_TOO_SMALL) {
- Print(L"GetNextVariableName failed: %r\n",
- status);
+ printf("GetNextVariableName failed: %" PRIxMAX "\n",
+ (uintmax_t)status);
break;
}
tmp = AllocatePool(sz);
if (tmp == NULL) {
- Print(L"memory allocation failed: %ld bytes\n",
- (UINT64)sz);
+ printf("memory allocation failed: %" PRIuMAX
+ "bytes\n", (uintmax_t)sz);
break;
}
SetMem(tmp, sz, 0);
@@ -707,15 +741,43 @@
}
val = LibGetVariable(name, &vendor);
- Print(L"%.-35g %.-20s %s\n", &vendor, name,
- val ? val : L"(null)");
- FreePool(val);
+ if (val != NULL) {
+ uval = NULL;
+ rv = ucs2_to_utf8(val, &uval);
+ FreePool(val);
+ if (rv) {
+ printf("value convert failed\n");
+ break;
+ }
+ } else
+ uval = NULL;
+ uname = NULL;
+ rv = ucs2_to_utf8(name, &uname);
+ if (rv) {
+ printf("name convert failed\n");
+ FreePool(uval);
+ break;
+ }
+ GuidToString(guid, &vendor);
+ uguid = NULL;
+ rv = ucs2_to_utf8(guid, &uguid);
+ if (rv) {
+ printf("GUID convert failed\n");
+ FreePool(uval);
+ FreePool(uname);
+ break;
+ }
+ printf("%-35s %-20s %s\n", uguid, uname, uval ? uval : "(null)");
+ FreePool(uguid);
+ FreePool(uname);
+ if (uval != NULL)
+ FreePool(uval);
if (++row >= rows) {
row = 0;
- Print(L"Press Any Key to continue :");
+ printf("Press Any Key to continue :");
(void) awaitkey(-1, 0);
- Print(L"\n");
+ printf("\n");
}
}
diff -r a410cbd2ee66 -r 2e0fda9b78cb sys/arch/i386/stand/efiboot/bootia32/efibootia32.c
--- a/sys/arch/i386/stand/efiboot/bootia32/efibootia32.c Tue Mar 27 11:59:49 2018 +0000
+++ b/sys/arch/i386/stand/efiboot/bootia32/efibootia32.c Tue Mar 27 14:15:05 2018 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: efibootia32.c,v 1.3 2017/04/29 00:05:35 nonaka Exp $ */
+/* $NetBSD: efibootia32.c,v 1.4 2018/03/27 14:15:05 nonaka Exp $ */
/*-
* Copyright (c) 2016 Kimihiro Nonaka <nonaka%netbsd.org@localhost>
@@ -46,8 +46,8 @@
status = uefi_call_wrapper(BS->AllocatePages, 4, AllocateMaxAddress,
EfiLoaderData, sz, &addr);
if (EFI_ERROR(status))
- Panic(L"%a: AllocatePages() failed: %d page(s): %r",
- __func__, sz, status);
+ panic("%s: AllocatePages() failed: %d page(s): %" PRIxMAX,
+ __func__, sz, (uintmax_t)status);
startprog32 = (void *)(u_long)addr;
CopyMem(startprog32, startprog32_start, startprog32_size);
}
@@ -67,5 +67,5 @@
void
multiboot(physaddr_t entry, physaddr_t header, physaddr_t sp)
{
- Panic(L"%a: not implemented", __func__);
+ panic("%s: not implemented", __func__);
}
diff -r a410cbd2ee66 -r 2e0fda9b78cb sys/arch/i386/stand/efiboot/bootx64/efibootx64.c
--- a/sys/arch/i386/stand/efiboot/bootx64/efibootx64.c Tue Mar 27 11:59:49 2018 +0000
+++ b/sys/arch/i386/stand/efiboot/bootx64/efibootx64.c Tue Mar 27 14:15:05 2018 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: efibootx64.c,v 1.3 2017/04/29 00:05:35 nonaka Exp $ */
+/* $NetBSD: efibootx64.c,v 1.4 2018/03/27 14:15:05 nonaka Exp $ */
/*-
* Copyright (c) 2016 Kimihiro Nonaka <nonaka%netbsd.org@localhost>
@@ -46,8 +46,8 @@
status = uefi_call_wrapper(BS->AllocatePages, 4, AllocateMaxAddress,
EfiLoaderData, sz, &addr);
if (EFI_ERROR(status))
- Panic(L"%a: AllocatePages() failed: %d page(s): %r",
- __func__, sz, status);
+ panic("%s: AllocatePages() failed: %d page(s): %" PRIxMAX,
+ __func__, sz, (uintmax_t)status);
startprog64 = (void *)addr;
CopyMem(startprog64, startprog64_start, startprog64_size);
}
@@ -72,5 +72,5 @@
void
multiboot(physaddr_t entry, physaddr_t header, physaddr_t sp)
{
- Panic(L"%a: not implemented", __func__);
+ panic("%s: not implemented", __func__);
}
Home |
Main Index |
Thread Index |
Old Index