Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 31 Mar 2023 04:17:49 -0600
From:      Warner Losh <imp@bsdimp.com>
To:        Toomas Soome <tsoome@me.com>
Cc:        Gleb Smirnoff <glebius@freebsd.org>, Wei Hu <whu@freebsd.org>,  src-committers <src-committers@freebsd.org>,  "<dev-commits-src-all@freebsd.org>" <dev-commits-src-all@freebsd.org>,  "<dev-commits-src-main@freebsd.org>" <dev-commits-src-main@freebsd.org>, imp@freebsd.org, gallatin@freebsd.org,  kevans@freebsd.org
Subject:   Re: git: 927358dd98cb - main - amd64 loader: Use efiserialio for Hyper-V booted systems
Message-ID:  <CANCZdfqYB61ist=zded6xkATc0MQZmnnSVbsRetuAxPc0uNBOA@mail.gmail.com>
In-Reply-To: <256C0F87-8B73-4E5E-9B5E-E9BF00DEC019@me.com>
References:  <202303180720.32I7KXOc030612@gitrepo.freebsd.org> <ZCYb4V4Mg8y%2BU7tu@FreeBSD.org> <CANCZdfpbWSbhJUDU_VUXzkqWE9Xc=MrE%2BgmEOqg%2ByOhG%2BTS6xw@mail.gmail.com> <256C0F87-8B73-4E5E-9B5E-E9BF00DEC019@me.com>

next in thread | previous in thread | raw e-mail | index | archive | help
--0000000000001a12e105f82f8633
Content-Type: text/plain; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable

On Fri, Mar 31, 2023 at 12:22=E2=80=AFAM Toomas Soome <tsoome@me.com> wrote=
:

>
>
> On 31. Mar 2023, at 02:40, Warner Losh <imp@bsdimp.com> wrote:
>
> Let's back it out. I didn't get a chance to review it and the duplicated
> name strikes me as massively unwise.
> Of course, the efi serial driver never should have had the name comconsol=
e
> in the first place, imho. It was OK
> on arm where we couldn't conflict.
>
> So let's back it out and talk about how we should do this, including the
> need to possibly just rename the efi
> version of the console driver to something else. IMHO, it never should
> have been comconsole in the first
> place because it's configured differently than comconsole....
>
> Warner
>
>
> ok, lets start from beginning. The loader device naming is total mess and
> should not go this way - it is not understandable for users and not
> understandable for developers.
>
> the config below is perfect example of the situation:
>
> First the config does set:
>
> console=3D"comconsole vidconsole efi=E2=80=9D
>
>
> So, we do try to set serial console, bios video console and efi console.
> So we have =E2=80=9Cshared=E2=80=9D config for BIOS and UEFI loader, whic=
h should be
> totally reasonable from user point of view, but is technically wrong,
> because BIOS loader has no idea what is efi console and EFI loader has no
> idea what is vidconsole. So this mixture ends up with message:
>

I strongly disagree this is wrong. You have a boot loader that may have one
of many console devices. Not all may be present.


>
console vidconsole is invalid!"
>
>
> And the user will get the similar error when booting BIOS setup.
>

Yes. This message is a bit bogus: it just means we don't have a comconsole
configured. And that's fine.

It's like if I had ifconfig_ixl0=3DDHCP and ifconfig_xe0=3DDHCP in my rc.co=
nf
file, imho. It says if they are there, use them. Otherwise don't. We don't
have a eth device that's a generic thing. Nor should comconsole be all
possible uarts.


> Then we just set console=3D=E2=80=9Cefi=E2=80=9D.
>
> Then there is setting for uart=E2=80=A6
>

This is an orthogonal issue.


> With todays UEFI setups, the logic is that you set up your hardware, that
> is, you configure serial port attributes from firmware setup, and the UEF=
I
> firmware will populate its internal structures with those values.
>

Agreed. Still orthogonal to the naming issue.


> Now, first issue is, while developing uefi loader, it was easy path to
> reuse bits from BIOS loader. smbios, acpi, and sadly, comconsole. Sadly,
> because comconsole is built assuming x86 IO port features which are not
> available on other platforms.
>

Agreed. However, we are stuck with comconsole =3D=3D talk to the hardware a=
nd
bypass the UEFI firmware. We need to have a efiserial and efivideo device,
even for x86, so that we can specify things more closely. Overloading
comconsole is unwise.


> So yes, bios version of comconsole should not have been used to build UEF=
I
> loader at all.
>

Yes and no. It's in use today, so saying it shouldn't is about 10 years too
late.


> Now the fun part, even as UEFI does provide SIO API to access serial
> ports, to read from port, write to port and set attributes, it turns out
> there are UEFI implementation(s?), where changing some attributes will
> cause system to hung. Which is the reason, why we need to set up hardware
> properly from firmware, and our generic config should not try to enforce
> some other value(s). Default should pick up values from the system. Sure,
> if the machine operator has some reason to change those values and has
> tested the change, we should have method to change the config, but again,
> defaults should come from system setup.
>

Agreed. And it mostly does today. If you have serial redirect, the efi
driver does all that automatically.


> While I see the reasoning to try to create all those different names,
> maybe the first thing should be to look on this as innocent end user, who
> has no idea about those fine technical details and historical reasons and
> is just trying to get system to behave=E2=80=A6.
>

It has to be a new name. You can't just overload comconsole and have it
work reliably. The user has to understand the technical details.

Part of the problem here too is that comconsole's interface says 'use the
one at port 0x378' which is impossible without parsing ACPI tables, which
the efi loader doesn't do. So there's already a new, kludgy interface to
specify the UID of the efiserial device. This UID is just a number with no
relationship to the port from machine to machine. So we're already forcing
changes on the user. It's no longer transparent: it takes effort to
configure and you already have to know the differences because the simple
port simply doesn't work.

This is why I've been advocating for efi (use CONOUT text interface),
efiserial (use the efi's uart routines) and efivideo (use graphic frame
buffer) for years. Having this separation will allow people to configure
the consoles on their systems more deterministically. For those that have
nice serial redirect, 'efi' is the way to go. It just does the right thing.
For those that do not, then you can use one or more of efiserial and
efivideo to get the combination you want. Plus we can move the graphics
dependencies into efivideo and get rid of the crazy stubs that things like
kboot need that can never ever have graphical video. I'm still mad that my
desire for this was ignored when the graphics stuff was added

When we bring this driver back, it absolutely must have a new name. It
cannot try to 'fake' it by doing the games it's doing. That simply won't
work and breaks many working configurations today.

So my suggestion is that we have a new efiserial driver, hyperV uses it. We
rename the current efi serial interface to be efiserial. On aarch64 (and on
aarch64 only) we have a new comconsole driver that just redirects to
efiserial. It doesn't try to change the name of anything, nor try to do
anything else. Plus it should start warning when you are trying to use the
x86-only configuration knobs of comconsole. And starting after the 14
branch, it should start warning people should use efiserial insteaed. And
we never, ever ever again try to do aliases that aren't really the same
device and have different configuration needs under the covers.

Warner


> just my 2 cents,
> toomas
>
>
> On Thu, Mar 30, 2023 at 5:31=E2=80=AFPM Gleb Smirnoff <glebius@freebsd.or=
g> wrote:
>
>>   Wei, Kyle,
>>
>> this commit hangs loader on real hardware, at least on some
>> of it.  The loader prints list of consoles and hangs hard:
>>
>> [Thu Mar 30 20:46:12 2023]^M|^HLoading /boot/loader.conf^M
>> ^M/^Hconsole vidconsole is invalid!^M
>> ^MAvailable consoles:^M
>> ^M    efi^M
>> ^M    comconsole^M
>> ^M    comconsole^M
>> ^M    nullconsole^M
>> ^M    spinconsole^M
>>
>> Machine is unrecoverable unless you got alternate boot media
>> and access to BMC console.
>>
>> First, please DO NOT MFC this as scheduled. Second, let's try
>> to fix it or back it out if we hear from any other CURRENT
>> user.
>>
>> Our configuration isn't special. This is what we got in
>> loader.conf, related to consoles:
>>
>> console=3D"comconsole vidconsole efi"
>> comconsole_speed=3D115200
>> comconsole_port=3D0x3e8
>> console=3D"efi"
>> hw.uart.console=3D"io:1016,br:115200"
>>
>> On Sat, Mar 18, 2023 at 07:20:33AM +0000, Wei Hu wrote:
>> W> The branch main has been updated by whu:
>> W>
>> W> URL:
>> https://cgit.FreeBSD.org/src/commit/?id=3D927358dd98cb902160093e0dc0bac0=
02d6b43858
>> <https://cgit.freebsd.org/src/commit/?id=3D927358dd98cb902160093e0dc0bac=
002d6b43858>
>> W>
>> W> commit 927358dd98cb902160093e0dc0bac002d6b43858
>> W> Author:     Wei Hu <whu@FreeBSD.org>
>> W> AuthorDate: 2023-03-14 15:13:46 +0000
>> W> Commit:     Wei Hu <whu@FreeBSD.org>
>> W> CommitDate: 2023-03-18 07:07:35 +0000
>> W>
>> W>     amd64 loader: Use efiserialio for Hyper-V booted systems
>> W>
>> W>     UEFI provides ConIn/ConOut handles for consoles that it supports,
>> W>     which include the text-video and serial ports. When the serial po=
rt
>> W>     is available, use the UEFI driver instead of direct io-port
>> accesses
>> W>     to avoid conflicts between the firmware and direct hardware
>> access, as
>> W>     happens on Hyper-V (Azure) setups.
>> W>
>> W>     This change enables efiserialio to be built for efi-amd64 and has
>> W>     higher order priority vs comconsole, and only uses efiserialio
>> W>     if the hypervisor is Hyper-V. When efiserialio successfully
>> W>     probes, it will set efi_comconsole_avail=3Dtrue which will preven=
t
>> W>     comconsole from probing in this setup.
>> W>
>> W>     Tested on Hyper-V, ESXi and Azure VMs.
>> W>
>> W>     PR:             264267
>> W>     Reviewed by:    kevans, whu
>> W>     Tested by:      whu
>> W>     Obtained from:  Rubicon Communications, LLC (Netgate)
>> W>     MFC after:      2 weeks
>> W>     Sponsored by:   Rubicon Communications, LLC (Netgate)
>> W> ---
>> W>  stand/efi/loader/arch/amd64/Makefile.inc |  1 +
>> W>  stand/efi/loader/bootinfo.c              | 11 ++++++--
>> W>  stand/efi/loader/conf.c                  |  6 +++++
>> W>  stand/efi/loader/efiserialio.c           | 43
>> ++++++++++++++++++++++++++++----
>> W>  stand/i386/libi386/comconsole.c          | 14 +++++++++++
>> W>  5 files changed, 68 insertions(+), 7 deletions(-)
>> W>
>> W> diff --git a/stand/efi/loader/arch/amd64/Makefile.inc
>> b/stand/efi/loader/arch/amd64/Makefile.inc
>> W> index 0d9e2648cb59..bd89044bd6c7 100644
>> W> --- a/stand/efi/loader/arch/amd64/Makefile.inc
>> W> +++ b/stand/efi/loader/arch/amd64/Makefile.inc
>> W> @@ -5,6 +5,7 @@ SRCS+=3D       amd64_tramp.S \
>> W>      elf64_freebsd.c \
>> W>      trap.c \
>> W>      multiboot2.c \
>> W> +    efiserialio.c \
>> W>      exc.S
>> W>
>> W>  .PATH:      ${BOOTSRC}/i386/libi386
>> W> diff --git a/stand/efi/loader/bootinfo.c b/stand/efi/loader/bootinfo.=
c
>> W> index 939f2cf4c3fe..d79f59343af1 100644
>> W> --- a/stand/efi/loader/bootinfo.c
>> W> +++ b/stand/efi/loader/bootinfo.c
>> W> @@ -119,10 +119,17 @@ bi_getboothowto(char *kargs)
>> W>                      if (tmp !=3D NULL)
>> W>                              speed =3D strtol(tmp, NULL, 0);
>> W>                      tmp =3D getenv("efi_com_port");
>> W> -                    if (tmp =3D=3D NULL)
>> W> -                            tmp =3D getenv("comconsole_port");
>> W>                      if (tmp !=3D NULL)
>> W>                              port =3D strtol(tmp, NULL, 0);
>> W> +                    if (port <=3D 0) {
>> W> +                            tmp =3D getenv("comconsole_port");
>> W> +                            if (tmp !=3D NULL)
>> W> +                                    port =3D strtol(tmp, NULL, 0);
>> W> +                            else {
>> W> +                                    if (port =3D=3D 0)
>> W> +                                            port =3D 0x3f8;
>> W> +                            }
>> W> +                    }
>> W>                      if (speed !=3D -1 && port !=3D -1) {
>> W>                              snprintf(buf, sizeof(buf), "io:%d,br:%d"=
,
>> port,
>> W>                                  speed);
>> W> diff --git a/stand/efi/loader/conf.c b/stand/efi/loader/conf.c
>> W> index 863c9188c72c..051e1a3381d1 100644
>> W> --- a/stand/efi/loader/conf.c
>> W> +++ b/stand/efi/loader/conf.c
>> W> @@ -81,6 +81,9 @@ struct netif_driver *netif_drivers[] =3D {
>> W>
>> W>  extern struct console efi_console;
>> W>  extern struct console comconsole;
>> W> +#if defined(__amd64__)
>> W> +extern struct console eficomconsole;
>> W> +#endif
>> W>  #if defined(__amd64__) || defined(__i386__)
>> W>  extern struct console nullconsole;
>> W>  extern struct console spinconsole;
>> W> @@ -88,6 +91,9 @@ extern struct console spinconsole;
>> W>
>> W>  struct console *consoles[] =3D {
>> W>      &efi_console,
>> W> +#if defined(__amd64__)
>> W> +    &eficomconsole,
>> W> +#endif
>> W>      &comconsole,
>> W>  #if defined(__amd64__) || defined(__i386__)
>> W>      &nullconsole,
>> W> diff --git a/stand/efi/loader/efiserialio.c
>> b/stand/efi/loader/efiserialio.c
>> W> index 375e679d2590..5fbc700f6ac2 100644
>> W> --- a/stand/efi/loader/efiserialio.c
>> W> +++ b/stand/efi/loader/efiserialio.c
>> W> @@ -69,6 +69,11 @@ static int        comc_speed_set(struct env_var *,
>> int, const void *);
>> W>
>> W>  static struct serial        *comc_port;
>> W>  extern struct console efi_console;
>> W> +bool efi_comconsole_avail =3D false;
>> W> +
>> W> +#if defined(__amd64__)
>> W> +#define comconsole eficomconsole
>> W> +#endif
>> W>
>> W>  struct console comconsole =3D {
>> W>      .c_name =3D "comconsole",
>> W> @@ -254,11 +259,22 @@ comc_probe(struct console *sc)
>> W>      char *env, *buf, *ep;
>> W>      size_t sz;
>> W>
>> W> +#if defined(__amd64__)
>> W> +    /*
>> W> +     * For x86-64, don't use this driver if not running in Hyper-V.
>> W> +     */
>> W> +    env =3D getenv("smbios.bios.version");
>> W> +    if (env =3D=3D NULL || strncmp(env, "Hyper-V", 7) !=3D 0) {
>> W> +            return;
>> W> +    }
>> W> +#endif
>> W> +
>> W>      if (comc_port =3D=3D NULL) {
>> W>              comc_port =3D calloc(1, sizeof (struct serial));
>> W>              if (comc_port =3D=3D NULL)
>> W>                      return;
>> W>      }
>> W> +
>> W>      /* Use defaults from firmware */
>> W>      comc_port->databits =3D 8;
>> W>      comc_port->parity =3D DefaultParity;
>> W> @@ -308,6 +324,10 @@ comc_probe(struct console *sc)
>> W>          comc_port_set, env_nounset);
>> W>
>> W>      env =3D getenv("efi_com_speed");
>> W> +    if (env =3D=3D NULL)
>> W> +            /* fallback to comconsole setting */
>> W> +            env =3D getenv("comconsole_speed");
>> W> +
>> W>      if (comc_parse_intval(env, &val) =3D=3D CMD_OK)
>> W>              comc_port->baudrate =3D val;
>> W>
>> W> @@ -318,8 +338,13 @@ comc_probe(struct console *sc)
>> W>          comc_speed_set, env_nounset);
>> W>
>> W>      comconsole.c_flags =3D 0;
>> W> -    if (comc_setup())
>> W> +    if (comc_setup()) {
>> W>              sc->c_flags =3D C_PRESENTIN | C_PRESENTOUT;
>> W> +            efi_comconsole_avail =3D true;
>> W> +    } else {
>> W> +            /* disable being seen as "comconsole" */
>> W> +            comconsole.c_name =3D "efiserialio";
>> W> +    }
>> W>  }
>> W>
>> W>  static int
>> W> @@ -489,6 +514,7 @@ comc_setup(void)
>> W>  {
>> W>      EFI_STATUS status;
>> W>      UINT32 control;
>> W> +    char *ev;
>> W>
>> W>      /* port is not usable */
>> W>      if (comc_port->sio =3D=3D NULL)
>> W> @@ -498,10 +524,17 @@ comc_setup(void)
>> W>      if (EFI_ERROR(status))
>> W>              return (false);
>> W>
>> W> -    status =3D comc_port->sio->SetAttributes(comc_port->sio,
>> W> -        comc_port->baudrate, comc_port->receivefifodepth,
>> W> -        comc_port->timeout, comc_port->parity,
>> W> -        comc_port->databits, comc_port->stopbits);
>> W> +    ev =3D getenv("smbios.bios.version");
>> W> +    if (ev !=3D NULL && strncmp(ev, "Hyper-V", 7) =3D=3D 0) {
>> W> +            status =3D comc_port->sio->SetAttributes(comc_port->sio,
>> W> +                0, 0, 0, DefaultParity, 0, DefaultStopBits);
>> W> +    } else {
>> W> +            status =3D comc_port->sio->SetAttributes(comc_port->sio,
>> W> +                comc_port->baudrate, comc_port->receivefifodepth,
>> W> +                comc_port->timeout, comc_port->parity,
>> W> +                comc_port->databits, comc_port->stopbits);
>> W> +    }
>> W> +
>> W>      if (EFI_ERROR(status))
>> W>              return (false);
>> W>
>> W> diff --git a/stand/i386/libi386/comconsole.c
>> b/stand/i386/libi386/comconsole.c
>> W> index ed1f1aa08ed7..3fbb6a292c19 100644
>> W> --- a/stand/i386/libi386/comconsole.c
>> W> +++ b/stand/i386/libi386/comconsole.c
>> W> @@ -85,6 +85,20 @@ comc_probe(struct console *cp)
>> W>      int speed, port;
>> W>      uint32_t locator;
>> W>
>> W> +#if defined(__amd64__)
>> W> +    extern bool efi_comconsole_avail;
>> W> +
>> W> +    if (efi_comconsole_avail) {
>> W> +            /*
>> W> +             * If EFI provides serial I/O, then don't use this legac=
y
>> W> +             * com driver to avoid conflicts with the firmware's
>> driver.
>> W> +             * Change c_name so that it cannot be found in the looku=
p.
>> W> +             */
>> W> +            comconsole.c_name =3D "xcomconsole";
>> W> +            return;
>> W> +    }
>> W> +#endif
>> W> +
>> W>      if (comc_curspeed =3D=3D 0) {
>> W>              comc_curspeed =3D COMSPEED;
>> W>              /*
>>
>> --
>> Gleb Smirnoff
>>
>
>

--0000000000001a12e105f82f8633
Content-Type: text/html; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable

<div dir=3D"ltr"><div dir=3D"ltr"><br></div><br><div class=3D"gmail_quote">=
<div dir=3D"ltr" class=3D"gmail_attr">On Fri, Mar 31, 2023 at 12:22=E2=80=
=AFAM Toomas Soome &lt;<a href=3D"mailto:tsoome@me.com">tsoome@me.com</a>&g=
t; wrote:<br></div><blockquote class=3D"gmail_quote" style=3D"margin:0px 0p=
x 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div><=
br><div><br><blockquote type=3D"cite"><div>On 31. Mar 2023, at 02:40, Warne=
r Losh &lt;<a href=3D"mailto:imp@bsdimp.com" target=3D"_blank">imp@bsdimp.c=
om</a>&gt; wrote:</div><br><div><div dir=3D"ltr">Let&#39;s back it out. I d=
idn&#39;t get a chance to review it and the duplicated name strikes me as m=
assively unwise.<div>Of course, the efi serial driver never should have had=
 the name comconsole in the first place, imho. It was OK</div><div>on arm w=
here we couldn&#39;t conflict.</div><div><br></div><div>So let&#39;s back i=
t out and talk about how we should do this, including the need to possibly =
just rename the efi</div><div>version of the console driver to something el=
se. IMHO, it never should have been comconsole in the first</div><div>place=
 because it&#39;s configured differently than comconsole....</div><div><div=
><br></div><div>Warner</div></div></div></div></blockquote><div><br></div><=
div>ok, lets start from beginning. The loader device naming is total mess a=
nd should not go this way - it is not understandable for users and not unde=
rstandable for developers.</div><div><br></div><div>the config below is per=
fect example of the situation:</div><div><br></div><div>First the config do=
es set:=C2=A0</div><div><br></div><div><blockquote type=3D"cite"><div class=
=3D"gmail_quote"><blockquote class=3D"gmail_quote" style=3D"margin:0px 0px =
0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">console=
=3D&quot;comconsole vidconsole efi=E2=80=9D</blockquote></div></blockquote>=
<br></div><div>So, we do try to set serial console, bios video console and =
efi console. So we have =E2=80=9Cshared=E2=80=9D config for BIOS and UEFI l=
oader, which should be totally reasonable from user point of view, but is t=
echnically wrong, because BIOS loader has no idea what is efi console and E=
FI loader has no idea what is vidconsole. So this mixture ends up with mess=
age:</div></div></div></blockquote><div><br></div><div>I strongly disagree =
this is wrong. You have a boot loader that may have one of many console dev=
ices. Not all may be present.</div><div><br></div><blockquote class=3D"gmai=
l_quote" style=3D"margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,20=
4,204);padding-left:1ex"><div><div><div>=C2=A0</div></div></div></blockquot=
e><blockquote class=3D"gmail_quote" style=3D"margin:0px 0px 0px 0.8ex;borde=
r-left:1px solid rgb(204,204,204);padding-left:1ex"><div><div><blockquote t=
ype=3D"cite"><div class=3D"gmail_quote"><blockquote class=3D"gmail_quote" s=
tyle=3D"margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);pad=
ding-left:1ex">console vidconsole is invalid!&quot;</blockquote></div></blo=
ckquote><div><br></div><div>And the user will get the similar error when bo=
oting BIOS setup.</div></div></div></blockquote><div><br></div><div>Yes. Th=
is message is a bit bogus: it just means we don&#39;t have a comconsole con=
figured. And that&#39;s fine.</div><div><br></div><div>It&#39;s like if I h=
ad ifconfig_ixl0=3DDHCP and ifconfig_xe0=3DDHCP in my rc.conf file, imho. I=
t says if they are there, use them. Otherwise don&#39;t. We don&#39;t have =
a eth device that&#39;s a generic thing. Nor should comconsole be all possi=
ble uarts.</div><div>=C2=A0</div><blockquote class=3D"gmail_quote" style=3D=
"margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-le=
ft:1ex"><div><div><div>Then we just set console=3D=E2=80=9Cefi=E2=80=9D.</d=
iv><div><br></div><div>Then there is setting for uart=E2=80=A6=C2=A0</div><=
/div></div></blockquote><div><br></div><div>This is an orthogonal=C2=A0issu=
e.</div><div>=C2=A0</div><blockquote class=3D"gmail_quote" style=3D"margin:=
0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">=
<div><div><div>With todays UEFI setups, the logic is that you set up your h=
ardware, that is, you configure serial port attributes from firmware setup,=
 and the UEFI firmware will populate its internal structures with those val=
ues.</div></div></div></blockquote><div><br></div><div>Agreed. Still orthog=
onal to the naming issue.</div><div>=C2=A0</div><blockquote class=3D"gmail_=
quote" style=3D"margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,=
204);padding-left:1ex"><div><div><div>Now, first issue is, while developing=
 uefi loader, it was easy path to reuse bits from BIOS loader. smbios, acpi=
, and sadly, comconsole. Sadly, because comconsole is built assuming x86 IO=
 port features which are not available on other platforms.</div></div></div=
></blockquote><div><br></div><div>Agreed. However, we are stuck with comcon=
sole =3D=3D talk to the hardware and bypass the UEFI firmware. We need to h=
ave a efiserial=C2=A0and efivideo=C2=A0device, even for x86, so that we can=
 specify things more closely. Overloading comconsole is unwise.</div><div>=
=C2=A0</div><blockquote class=3D"gmail_quote" style=3D"margin:0px 0px 0px 0=
.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div><div><di=
v>So yes, bios version of comconsole should not have been used to build UEF=
I loader at all.</div></div></div></blockquote><div><br></div><div>Yes and =
no. It&#39;s in use today, so saying it shouldn&#39;t is about 10 years too=
 late.</div><div>=C2=A0</div><blockquote class=3D"gmail_quote" style=3D"mar=
gin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1=
ex"><div><div><div>Now the fun part, even as UEFI does provide SIO API to a=
ccess serial ports, to read from port, write to port and set attributes, it=
 turns out there are UEFI implementation(s?), where changing some attribute=
s will cause system to hung. Which is the reason, why we need to set up har=
dware properly from firmware, and our generic config should not try to enfo=
rce some other value(s). Default should pick up values from the system. Sur=
e, if the machine operator has some reason to change those values and has t=
ested the change, we should have method to change the config, but again, de=
faults should come from system setup.</div></div></div></blockquote><div><b=
r></div><div>Agreed. And it mostly does today. If you have serial redirect,=
 the efi driver does all that automatically.</div><div>=C2=A0</div><blockqu=
ote class=3D"gmail_quote" style=3D"margin:0px 0px 0px 0.8ex;border-left:1px=
 solid rgb(204,204,204);padding-left:1ex"><div><div><div>While I see the re=
asoning to try to create all those different names, maybe the first thing s=
hould be to look on this as innocent end user, who has no idea about those =
fine technical details and historical reasons and is just trying to get sys=
tem to behave=E2=80=A6.</div></div></div></blockquote><div><br></div><div>I=
t has to be a new name. You can&#39;t just overload comconsole and have it =
work reliably. The user has to understand the technical details.</div><div>=
<br></div><div>Part of the problem here too is that comconsole&#39;s=C2=A0i=
nterface says &#39;use the one at port 0x378&#39; which is impossible witho=
ut parsing ACPI tables, which the efi loader doesn&#39;t do. So there&#39;s=
 already a new, kludgy interface to specify the UID of the efiserial device=
. This UID is just a number with no relationship to the port from machine t=
o machine. So we&#39;re already forcing changes on the user. It&#39;s no lo=
nger transparent: it takes effort to configure and you already have to know=
 the differences because the simple port simply doesn&#39;t work.</div><div=
><br></div><div>This is why I&#39;ve been advocating for efi (use CONOUT te=
xt interface), efiserial=C2=A0(use the efi&#39;s uart routines) and efivide=
o=C2=A0(use graphic frame buffer) for years. Having this separation will al=
low people to configure the consoles on their systems more deterministicall=
y. For those that have nice serial redirect, &#39;efi&#39; is the way to go=
. It just does the right thing. For those that do not, then you can use one=
 or more of efiserial=C2=A0and efivideo to get the combination you want. Pl=
us we can move the graphics dependencies into efivideo=C2=A0and get rid of =
the crazy stubs that things like kboot need that can never ever have graphi=
cal video. I&#39;m still mad that my desire for this was ignored when the g=
raphics stuff was added</div><div><br></div><div>When we bring this driver =
back, it absolutely must have a new name. It cannot try to &#39;fake&#39; i=
t by doing the games it&#39;s doing. That simply won&#39;t work and breaks =
many working configurations today.</div><div><br></div><div>So my suggestio=
n is that we have a new efiserial=C2=A0driver, hyperV uses it. We rename th=
e current efi serial interface to be efiserial. On aarch64 (and on aarch64 =
only) we have a new comconsole driver that just redirects to efiserial. It =
doesn&#39;t try to change the name of anything, nor try to do anything else=
. Plus it should start warning when you are trying to use the x86-only conf=
iguration knobs of comconsole. And starting after the 14 branch, it should =
start warning people should use efiserial=C2=A0insteaed. And we never, ever=
 ever again try to do aliases that aren&#39;t really the same device and ha=
ve different configuration needs under the covers.</div><div><br></div><div=
>Warner</div><div>=C2=A0</div><blockquote class=3D"gmail_quote" style=3D"ma=
rgin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:=
1ex"><div><div><div>just my 2 cents,</div><div>toomas</div><div><br></div><=
blockquote type=3D"cite"><div><br><div class=3D"gmail_quote"><div dir=3D"lt=
r" class=3D"gmail_attr">On Thu, Mar 30, 2023 at 5:31=E2=80=AFPM Gleb Smirno=
ff &lt;<a href=3D"mailto:glebius@freebsd.org" target=3D"_blank">glebius@fre=
ebsd.org</a>&gt; wrote:<br></div><blockquote class=3D"gmail_quote" style=3D=
"margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-le=
ft:1ex">=C2=A0 Wei, Kyle,<br>
<br>
this commit hangs loader on real hardware, at least on some<br>
of it.=C2=A0 The loader prints list of consoles and hangs hard:<br>
<br>
[Thu Mar 30 20:46:12 2023]^M|^HLoading /boot/loader.conf^M<br>
^M/^Hconsole vidconsole is invalid!^M<br>
^MAvailable consoles:^M<br>
^M=C2=A0 =C2=A0 efi^M<br>
^M=C2=A0 =C2=A0 comconsole^M<br>
^M=C2=A0 =C2=A0 comconsole^M<br>
^M=C2=A0 =C2=A0 nullconsole^M<br>
^M=C2=A0 =C2=A0 spinconsole^M<br>
<br>
Machine is unrecoverable unless you got alternate boot media<br>
and access to BMC console.<br>
<br>
First, please DO NOT MFC this as scheduled. Second, let&#39;s try<br>
to fix it or back it out if we hear from any other CURRENT<br>
user.<br>
<br>
Our configuration isn&#39;t special. This is what we got in<br>
loader.conf, related to consoles:<br>
<br>
console=3D&quot;comconsole vidconsole efi&quot;<br>
comconsole_speed=3D115200<br>
comconsole_port=3D0x3e8<br>
console=3D&quot;efi&quot;<br>
hw.uart.console=3D&quot;io:1016,br:115200&quot;<br>
<br>
On Sat, Mar 18, 2023 at 07:20:33AM +0000, Wei Hu wrote:<br>
W&gt; The branch main has been updated by whu:<br>
W&gt; <br>
W&gt; URL: <a href=3D"https://cgit.freebsd.org/src/commit/?id=3D927358dd98c=
b902160093e0dc0bac002d6b43858" rel=3D"noreferrer" target=3D"_blank">https:/=
/cgit.FreeBSD.org/src/commit/?id=3D927358dd98cb902160093e0dc0bac002d6b43858=
</a><br>
W&gt; <br>
W&gt; commit 927358dd98cb902160093e0dc0bac002d6b43858<br>
W&gt; Author:=C2=A0 =C2=A0 =C2=A0Wei Hu &lt;whu@FreeBSD.org&gt;<br>
W&gt; AuthorDate: 2023-03-14 15:13:46 +0000<br>
W&gt; Commit:=C2=A0 =C2=A0 =C2=A0Wei Hu &lt;whu@FreeBSD.org&gt;<br>
W&gt; CommitDate: 2023-03-18 07:07:35 +0000<br>
W&gt; <br>
W&gt;=C2=A0 =C2=A0 =C2=A0amd64 loader: Use efiserialio for Hyper-V booted s=
ystems<br>
W&gt;=C2=A0 =C2=A0 =C2=A0<br>
W&gt;=C2=A0 =C2=A0 =C2=A0UEFI provides ConIn/ConOut handles for consoles th=
at it supports,<br>
W&gt;=C2=A0 =C2=A0 =C2=A0which include the text-video and serial ports. Whe=
n the serial port<br>
W&gt;=C2=A0 =C2=A0 =C2=A0is available, use the UEFI driver instead of direc=
t io-port accesses<br>
W&gt;=C2=A0 =C2=A0 =C2=A0to avoid conflicts between the firmware and direct=
 hardware access, as<br>
W&gt;=C2=A0 =C2=A0 =C2=A0happens on Hyper-V (Azure) setups.<br>
W&gt;=C2=A0 =C2=A0 =C2=A0<br>
W&gt;=C2=A0 =C2=A0 =C2=A0This change enables efiserialio to be built for ef=
i-amd64 and has<br>
W&gt;=C2=A0 =C2=A0 =C2=A0higher order priority vs comconsole, and only uses=
 efiserialio<br>
W&gt;=C2=A0 =C2=A0 =C2=A0if the hypervisor is Hyper-V. When efiserialio suc=
cessfully<br>
W&gt;=C2=A0 =C2=A0 =C2=A0probes, it will set efi_comconsole_avail=3Dtrue wh=
ich will prevent<br>
W&gt;=C2=A0 =C2=A0 =C2=A0comconsole from probing in this setup.<br>
W&gt;=C2=A0 =C2=A0 =C2=A0<br>
W&gt;=C2=A0 =C2=A0 =C2=A0Tested on Hyper-V, ESXi and Azure VMs.<br>
W&gt;=C2=A0 =C2=A0 =C2=A0<br>
W&gt;=C2=A0 =C2=A0 =C2=A0PR:=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0264267<br>
W&gt;=C2=A0 =C2=A0 =C2=A0Reviewed by:=C2=A0 =C2=A0 kevans, whu<br>
W&gt;=C2=A0 =C2=A0 =C2=A0Tested by:=C2=A0 =C2=A0 =C2=A0 whu<br>
W&gt;=C2=A0 =C2=A0 =C2=A0Obtained from:=C2=A0 Rubicon Communications, LLC (=
Netgate)<br>
W&gt;=C2=A0 =C2=A0 =C2=A0MFC after:=C2=A0 =C2=A0 =C2=A0 2 weeks<br>
W&gt;=C2=A0 =C2=A0 =C2=A0Sponsored by:=C2=A0 =C2=A0Rubicon Communications, =
LLC (Netgate)<br>
W&gt; ---<br>
W&gt;=C2=A0 stand/efi/loader/arch/amd64/Makefile.inc |=C2=A0 1 +<br>
W&gt;=C2=A0 stand/efi/loader/bootinfo.c=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 | 11 ++++++--<br>
W&gt;=C2=A0 stand/efi/loader/conf.c=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 |=C2=A0 6 +++++<br>
W&gt;=C2=A0 stand/efi/loader/efiserialio.c=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0| 43 ++++++++++++++++++++++++++++----<br>
W&gt;=C2=A0 stand/i386/libi386/comconsole.c=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 | 14 +++++++++++<br>
W&gt;=C2=A0 5 files changed, 68 insertions(+), 7 deletions(-)<br>
W&gt; <br>
W&gt; diff --git a/stand/efi/loader/arch/amd64/Makefile.inc b/stand/efi/loa=
der/arch/amd64/Makefile.inc<br>
W&gt; index 0d9e2648cb59..bd89044bd6c7 100644<br>
W&gt; --- a/stand/efi/loader/arch/amd64/Makefile.inc<br>
W&gt; +++ b/stand/efi/loader/arch/amd64/Makefile.inc<br>
W&gt; @@ -5,6 +5,7 @@ SRCS+=3D=C2=A0 =C2=A0 =C2=A0 =C2=A0amd64_tramp.S \<br=
>
W&gt;=C2=A0 =C2=A0 =C2=A0 elf64_freebsd.c \<br>
W&gt;=C2=A0 =C2=A0 =C2=A0 trap.c \<br>
W&gt;=C2=A0 =C2=A0 =C2=A0 multiboot2.c \<br>
W&gt; +=C2=A0 =C2=A0 efiserialio.c \<br>
W&gt;=C2=A0 =C2=A0 =C2=A0 exc.S<br>
W&gt;=C2=A0 <br>
W&gt;=C2=A0 .PATH:=C2=A0 =C2=A0 =C2=A0 ${BOOTSRC}/i386/libi386<br>
W&gt; diff --git a/stand/efi/loader/bootinfo.c b/stand/efi/loader/bootinfo.=
c<br>
W&gt; index 939f2cf4c3fe..d79f59343af1 100644<br>
W&gt; --- a/stand/efi/loader/bootinfo.c<br>
W&gt; +++ b/stand/efi/loader/bootinfo.c<br>
W&gt; @@ -119,10 +119,17 @@ bi_getboothowto(char *kargs)<br>
W&gt;=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 if (tmp !=3D NULL)<br>
W&gt;=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 speed =3D strtol(tmp, NULL, 0);<br>
W&gt;=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 tmp =3D getenv(&quot;efi_com_port&quot;);<br>
W&gt; -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 if (tmp =3D=3D NULL)<br>
W&gt; -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 tmp =3D getenv(&quot;comconsole_port&quot;)=
;<br>
W&gt;=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 if (tmp !=3D NULL)<br>
W&gt;=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 port =3D strtol(tmp, NULL, 0);<br>
W&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 if (port &lt;=3D 0) {<br>
W&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 tmp =3D getenv(&quot;comconsole_port&quot;)=
;<br>
W&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 if (tmp !=3D NULL)<br>
W&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 port =3D strtol=
(tmp, NULL, 0);<br>
W&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 else {<br>
W&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 if (port =3D=3D=
 0)<br>
W&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 port =3D 0x3f8;<br>
W&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 }<br>
W&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 }<br>
W&gt;=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 if (speed !=3D -1 &amp;&amp; port !=3D -1) {<br>
W&gt;=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 snprintf(buf, sizeof(buf), &quot;io:%d,b=
r:%d&quot;, port,<br>
W&gt;=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 speed);<br>
W&gt; diff --git a/stand/efi/loader/conf.c b/stand/efi/loader/conf.c<br>
W&gt; index 863c9188c72c..051e1a3381d1 100644<br>
W&gt; --- a/stand/efi/loader/conf.c<br>
W&gt; +++ b/stand/efi/loader/conf.c<br>
W&gt; @@ -81,6 +81,9 @@ struct netif_driver *netif_drivers[] =3D {<br>
W&gt;=C2=A0 <br>
W&gt;=C2=A0 extern struct console efi_console;<br>
W&gt;=C2=A0 extern struct console comconsole;<br>
W&gt; +#if defined(__amd64__)<br>
W&gt; +extern struct console eficomconsole;<br>
W&gt; +#endif<br>
W&gt;=C2=A0 #if defined(__amd64__) || defined(__i386__)<br>
W&gt;=C2=A0 extern struct console nullconsole;<br>
W&gt;=C2=A0 extern struct console spinconsole;<br>
W&gt; @@ -88,6 +91,9 @@ extern struct console spinconsole;<br>
W&gt;=C2=A0 <br>
W&gt;=C2=A0 struct console *consoles[] =3D {<br>
W&gt;=C2=A0 =C2=A0 =C2=A0 &amp;efi_console,<br>
W&gt; +#if defined(__amd64__)<br>
W&gt; +=C2=A0 =C2=A0 &amp;eficomconsole,<br>
W&gt; +#endif<br>
W&gt;=C2=A0 =C2=A0 =C2=A0 &amp;comconsole,<br>
W&gt;=C2=A0 #if defined(__amd64__) || defined(__i386__)<br>
W&gt;=C2=A0 =C2=A0 =C2=A0 &amp;nullconsole,<br>
W&gt; diff --git a/stand/efi/loader/efiserialio.c b/stand/efi/loader/efiser=
ialio.c<br>
W&gt; index 375e679d2590..5fbc700f6ac2 100644<br>
W&gt; --- a/stand/efi/loader/efiserialio.c<br>
W&gt; +++ b/stand/efi/loader/efiserialio.c<br>
W&gt; @@ -69,6 +69,11 @@ static int=C2=A0 =C2=A0 =C2=A0 =C2=A0 comc_speed_s=
et(struct env_var *, int, const void *);<br>
W&gt;=C2=A0 <br>
W&gt;=C2=A0 static struct serial=C2=A0 =C2=A0 =C2=A0 =C2=A0 *comc_port;<br>
W&gt;=C2=A0 extern struct console efi_console;<br>
W&gt; +bool efi_comconsole_avail =3D false;<br>
W&gt; +<br>
W&gt; +#if defined(__amd64__)<br>
W&gt; +#define comconsole eficomconsole<br>
W&gt; +#endif<br>
W&gt;=C2=A0 <br>
W&gt;=C2=A0 struct console comconsole =3D {<br>
W&gt;=C2=A0 =C2=A0 =C2=A0 .c_name =3D &quot;comconsole&quot;,<br>
W&gt; @@ -254,11 +259,22 @@ comc_probe(struct console *sc)<br>
W&gt;=C2=A0 =C2=A0 =C2=A0 char *env, *buf, *ep;<br>
W&gt;=C2=A0 =C2=A0 =C2=A0 size_t sz;<br>
W&gt;=C2=A0 <br>
W&gt; +#if defined(__amd64__)<br>
W&gt; +=C2=A0 =C2=A0 /*<br>
W&gt; +=C2=A0 =C2=A0 =C2=A0* For x86-64, don&#39;t use this driver if not r=
unning in Hyper-V.<br>
W&gt; +=C2=A0 =C2=A0 =C2=A0*/<br>
W&gt; +=C2=A0 =C2=A0 env =3D getenv(&quot;smbios.bios.version&quot;);<br>
W&gt; +=C2=A0 =C2=A0 if (env =3D=3D NULL || strncmp(env, &quot;Hyper-V&quot=
;, 7) !=3D 0) {<br>
W&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 return;<br>
W&gt; +=C2=A0 =C2=A0 }<br>
W&gt; +#endif<br>
W&gt; +<br>
W&gt;=C2=A0 =C2=A0 =C2=A0 if (comc_port =3D=3D NULL) {<br>
W&gt;=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 comc_port =3D calloc(=
1, sizeof (struct serial));<br>
W&gt;=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 if (comc_port =3D=3D =
NULL)<br>
W&gt;=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 return;<br>
W&gt;=C2=A0 =C2=A0 =C2=A0 }<br>
W&gt; +<br>
W&gt;=C2=A0 =C2=A0 =C2=A0 /* Use defaults from firmware */<br>
W&gt;=C2=A0 =C2=A0 =C2=A0 comc_port-&gt;databits =3D 8;<br>
W&gt;=C2=A0 =C2=A0 =C2=A0 comc_port-&gt;parity =3D DefaultParity;<br>
W&gt; @@ -308,6 +324,10 @@ comc_probe(struct console *sc)<br>
W&gt;=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 comc_port_set, env_nounset);<br>
W&gt;=C2=A0 <br>
W&gt;=C2=A0 =C2=A0 =C2=A0 env =3D getenv(&quot;efi_com_speed&quot;);<br>
W&gt; +=C2=A0 =C2=A0 if (env =3D=3D NULL)<br>
W&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 /* fallback to comconsole =
setting */<br>
W&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 env =3D getenv(&quot;comco=
nsole_speed&quot;);<br>
W&gt; +<br>
W&gt;=C2=A0 =C2=A0 =C2=A0 if (comc_parse_intval(env, &amp;val) =3D=3D CMD_O=
K)<br>
W&gt;=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 comc_port-&gt;baudrat=
e =3D val;<br>
W&gt;=C2=A0 <br>
W&gt; @@ -318,8 +338,13 @@ comc_probe(struct console *sc)<br>
W&gt;=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 comc_speed_set, env_nounset);<br>
W&gt;=C2=A0 <br>
W&gt;=C2=A0 =C2=A0 =C2=A0 comconsole.c_flags =3D 0;<br>
W&gt; -=C2=A0 =C2=A0 if (comc_setup())<br>
W&gt; +=C2=A0 =C2=A0 if (comc_setup()) {<br>
W&gt;=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 sc-&gt;c_flags =3D C_=
PRESENTIN | C_PRESENTOUT;<br>
W&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 efi_comconsole_avail =3D t=
rue;<br>
W&gt; +=C2=A0 =C2=A0 } else {<br>
W&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 /* disable being seen as &=
quot;comconsole&quot; */<br>
W&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 comconsole.c_name =3D &quo=
t;efiserialio&quot;;<br>
W&gt; +=C2=A0 =C2=A0 }<br>
W&gt;=C2=A0 }<br>
W&gt;=C2=A0 <br>
W&gt;=C2=A0 static int<br>
W&gt; @@ -489,6 +514,7 @@ comc_setup(void)<br>
W&gt;=C2=A0 {<br>
W&gt;=C2=A0 =C2=A0 =C2=A0 EFI_STATUS status;<br>
W&gt;=C2=A0 =C2=A0 =C2=A0 UINT32 control;<br>
W&gt; +=C2=A0 =C2=A0 char *ev;<br>
W&gt;=C2=A0 <br>
W&gt;=C2=A0 =C2=A0 =C2=A0 /* port is not usable */<br>
W&gt;=C2=A0 =C2=A0 =C2=A0 if (comc_port-&gt;sio =3D=3D NULL)<br>
W&gt; @@ -498,10 +524,17 @@ comc_setup(void)<br>
W&gt;=C2=A0 =C2=A0 =C2=A0 if (EFI_ERROR(status))<br>
W&gt;=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 return (false);<br>
W&gt;=C2=A0 <br>
W&gt; -=C2=A0 =C2=A0 status =3D comc_port-&gt;sio-&gt;SetAttributes(comc_po=
rt-&gt;sio,<br>
W&gt; -=C2=A0 =C2=A0 =C2=A0 =C2=A0 comc_port-&gt;baudrate, comc_port-&gt;re=
ceivefifodepth,<br>
W&gt; -=C2=A0 =C2=A0 =C2=A0 =C2=A0 comc_port-&gt;timeout, comc_port-&gt;par=
ity,<br>
W&gt; -=C2=A0 =C2=A0 =C2=A0 =C2=A0 comc_port-&gt;databits, comc_port-&gt;st=
opbits);<br>
W&gt; +=C2=A0 =C2=A0 ev =3D getenv(&quot;smbios.bios.version&quot;);<br>
W&gt; +=C2=A0 =C2=A0 if (ev !=3D NULL &amp;&amp; strncmp(ev, &quot;Hyper-V&=
quot;, 7) =3D=3D 0) {<br>
W&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 status =3D comc_port-&gt;s=
io-&gt;SetAttributes(comc_port-&gt;sio,<br>
W&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 0, 0, 0, Def=
aultParity, 0, DefaultStopBits);<br>
W&gt; +=C2=A0 =C2=A0 } else {<br>
W&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 status =3D comc_port-&gt;s=
io-&gt;SetAttributes(comc_port-&gt;sio,<br>
W&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 comc_port-&g=
t;baudrate, comc_port-&gt;receivefifodepth,<br>
W&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 comc_port-&g=
t;timeout, comc_port-&gt;parity,<br>
W&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 comc_port-&g=
t;databits, comc_port-&gt;stopbits);<br>
W&gt; +=C2=A0 =C2=A0 }<br>
W&gt; +<br>
W&gt;=C2=A0 =C2=A0 =C2=A0 if (EFI_ERROR(status))<br>
W&gt;=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 return (false);<br>
W&gt;=C2=A0 <br>
W&gt; diff --git a/stand/i386/libi386/comconsole.c b/stand/i386/libi386/com=
console.c<br>
W&gt; index ed1f1aa08ed7..3fbb6a292c19 100644<br>
W&gt; --- a/stand/i386/libi386/comconsole.c<br>
W&gt; +++ b/stand/i386/libi386/comconsole.c<br>
W&gt; @@ -85,6 +85,20 @@ comc_probe(struct console *cp)<br>
W&gt;=C2=A0 =C2=A0 =C2=A0 int speed, port;<br>
W&gt;=C2=A0 =C2=A0 =C2=A0 uint32_t locator;<br>
W&gt;=C2=A0 <br>
W&gt; +#if defined(__amd64__)<br>
W&gt; +=C2=A0 =C2=A0 extern bool efi_comconsole_avail;<br>
W&gt; +<br>
W&gt; +=C2=A0 =C2=A0 if (efi_comconsole_avail) {<br>
W&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 /*<br>
W&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0* If EFI provides se=
rial I/O, then don&#39;t use this legacy<br>
W&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0* com driver to avoi=
d conflicts with the firmware&#39;s driver.<br>
W&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0* Change c_name so t=
hat it cannot be found in the lookup.<br>
W&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0*/<br>
W&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 comconsole.c_name =3D &quo=
t;xcomconsole&quot;;<br>
W&gt; +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 return;<br>
W&gt; +=C2=A0 =C2=A0 }<br>
W&gt; +#endif<br>
W&gt; +<br>
W&gt;=C2=A0 =C2=A0 =C2=A0 if (comc_curspeed =3D=3D 0) {<br>
W&gt;=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 comc_curspeed =3D COM=
SPEED;<br>
W&gt;=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 /*<br>
<br>
-- <br>
Gleb Smirnoff<br>
</blockquote></div>
</div></blockquote></div><br></div></blockquote></div></div>

--0000000000001a12e105f82f8633--



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?CANCZdfqYB61ist=zded6xkATc0MQZmnnSVbsRetuAxPc0uNBOA>