From mboxrd@z Thu Jan 1 00:00:00 1970 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on inbox.vuxu.org X-Spam-Level: X-Spam-Status: No, score=0.2 required=5.0 tests=DKIM_ADSP_CUSTOM_MED, DKIM_INVALID,DKIM_SIGNED,FREEMAIL_FROM autolearn=no autolearn_force=no version=3.4.4 Received: (qmail 2136 invoked from network); 19 Nov 2022 16:19:09 -0000 Received: from 9front.inri.net (168.235.81.73) by inbox.vuxu.org with ESMTPUTF8; 19 Nov 2022 16:19:09 -0000 Received: from mail-yw1-f179.google.com ([209.85.128.179]) by 9front; Sat Nov 19 11:15:09 -0500 2022 Received: by mail-yw1-f179.google.com with SMTP id 00721157ae682-3691e040abaso76503237b3.9 for <9front@9front.org>; Sat, 19 Nov 2022 08:15:05 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=to:subject:message-id:date:from:in-reply-to:references:mime-version :from:to:cc:subject:date:message-id:reply-to; bh=a2pzUz0BV76NbS/jY2IGWaHgK+3LV7QSy7LtWkiubgQ=; b=ccVLubwGs7W18wEDbB7+2yr8/L18wRbICMglMsQ8Odw7IC48f4wfHKiI1rIGy4mneI MxW+02mbassJs9jujCVvIYNgXFbOfJIHgA8TX4utldknOIZcBMscAQzyF5OmhoYRtjMm uEEZ01hYyWtTWRnRFeU977e0A+ZtV12+YKeo1J/FPTOrQKapgsQ5aiQdG+n6RWWuBGcK sd/hzfCfY5r4/3op8BzZZuQYOrP2U0VNnLS7WOG0dxMx9/Fq0aJ4f5VqOMC8LKdJnLXj VTJR9BqNwHOssV8Fe580pZWu8d2ExMagIc6MX5tUWKEZOmL148dt/N7m9Ki5ckJeStag AgMA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=to:subject:message-id:date:from:in-reply-to:references:mime-version :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=a2pzUz0BV76NbS/jY2IGWaHgK+3LV7QSy7LtWkiubgQ=; b=owIwDcBuy2G+OG9E6MfKfqkRxbmhd0CoVK4QkeHfvXhpB93CpeYoMazwb4HVNbIAub XMKnGAW+c7eusONcsI4M96iGvJAlglO7GKX+LFhIGOqp3z7lypd2f8JfhBDJZ+6azzuo dyBVK2u+cP12NOVUocD9oJlW/tBKB3qcUWxnwimYdi5NeQQlejfExpEiKRn4gNiesQ3j h1ytCT/wE2O2U+7DsiIswKX97jVuR0BqLmDiyB+GXlPY4pLbrjTokpzLJMWHtIbMWXnn Y4qZ923Ddz6KDkagetLlo5y9eH30azKjyFgz21B0d1iPERE2DbBXN+QLn//ks3LhoPaS IzcA== X-Gm-Message-State: ANoB5pkUnbLbj1z2HVTTmURlBUTa2dVgVZIQbRuaYtR3pIFivNHliyNX Qy8ScpjaEulq2+AdLKZZmaS/u+rEMahtnZsrozCXrMNVVak= X-Google-Smtp-Source: AA0mqf6zW2QgERmDPajFr7HXp9gHes4to0OkX4dnhwL9ooTBAqQkCraNVKFhQtDY1h7IftbcT9tMzCureSjVLqEmYNM= X-Received: by 2002:a81:1716:0:b0:369:e031:c8f6 with SMTP id 22-20020a811716000000b00369e031c8f6mr10440809ywx.516.1668874504625; Sat, 19 Nov 2022 08:15:04 -0800 (PST) MIME-Version: 1.0 References: <058CCCF199316D00FB1ABF63EBD3B3A8@mforney.org> In-Reply-To: <058CCCF199316D00FB1ABF63EBD3B3A8@mforney.org> From: Lucas Francesco Date: Sat, 19 Nov 2022 13:14:48 -0300 Message-ID: To: 9front@9front.org Content-Type: text/plain; charset="UTF-8" List-ID: <9front.9front.org> List-Help: X-Glyph: ➈ X-Bullshit: wrapper just-in-time scripting injection-oriented framework Subject: Re: [9front] [PATCH] boot/efi: delay GetMemoryMap until right before ExitBootServices Reply-To: 9front@9front.org Precedence: bulk Oh, this seems to be the exact same problem I have with my devices here. Was having empty nvme queues after identify (and reading the spec everything else was mostly fine in our driver besides some quirks to workaround shitty controllers) so i banged around to see if firmware was messing it up before boot and realized the nvme feature was pointing to that, couldn't figure out it was actually something that would need to change in the bootloader though! (i banged pcireset/nssr/initseg() a lot) Thanks so much for the find, will test this asap. On Wed, 16 Nov 2022 at 17:13, Michael Forney wrote: > > > The UEFI specification suggests calling GetMemoryMap immediately > before ExitBootServices to ensure that the loader has the current > memory map. The firmware is able to enforce this since we have to > pass a "MapKey" from the last GetMemoryMap to ExitBootServices. > > The T14 AMD gen 1 firmware is quite strict about this, and even a call > to OutputString will invalidate the MapKey. This causes > ExitBootServices to fail, and we enter 9front with boot services still > running. This causes all sorts of problems including leaving the > IOMMU enabled, breaking 9front's PCI drivers. > > To fix this, move memconf() to unload(), right before > ExitBootServices. To retain the ability to override the memory map, > check if *e820 is already set and if so, ignore the output of > GetMemoryMap except for the MapKey. > --- > Still some room for improvement around the *conf helper functions, but > I think this is fine for now. > > I also wonder what we should be doing if GetMemoryMap fails. If we > don't have any potentially valid MapKey, how could ExitBootServices > succeed? Perhaps we could make unload return an error string on > failure, and pass it back from bootkern so that we can inform the user > that something is wrong. > > diff a854bb07cd792a52c5e75aabca76c22b7dd18fc6 eb07ce3baa9705a30ecf3cd6b31ff851e24cb3d1 > --- a/sys/src/boot/efi/efi.c > +++ b/sys/src/boot/efi/efi.c > @@ -36,12 +36,6 @@ > eficall(ST->BootServices->Stall, (UINTN)us); > } > > -void > -unload(void) > -{ > - eficall(ST->BootServices->ExitBootServices, IH, MK); > -} > - > static void > memconf(char **cfg) > { > @@ -72,6 +66,8 @@ > entvers = 1; > if(eficall(ST->BootServices->GetMemoryMap, &mapsize, mapbuf, &MK, &entsize, &entvers)) > return; > + if(cfg == nil) > + return; > > s = *cfg; > for(p = mapbuf; mapsize >= entsize; p += entsize, mapsize -= entsize){ > @@ -93,7 +89,6 @@ > *s = '\0'; > if(s > *cfg){ > s[-1] = '\n'; > - print(*cfg); > *cfg = s; > } > } > @@ -276,9 +271,15 @@ > void > eficonfig(char **cfg) > { > - memconf(cfg); > acpiconf(cfg); > screenconf(cfg); > +} > + > +void > +unload(char **cfg) > +{ > + memconf(cfg); > + eficall(ST->BootServices->ExitBootServices, IH, MK); > } > > EFI_STATUS > --- a/sys/src/boot/efi/fns.h > +++ b/sys/src/boot/efi/fns.h > @@ -16,7 +16,7 @@ > void (*close)(void *f); > > int readn(void *f, void *data, int len); > -void unload(void); > +void unload(char **cfg); > > int getc(void); > void putc(int c); > --- a/sys/src/boot/efi/sub.c > +++ b/sys/src/boot/efi/sub.c > @@ -156,6 +156,23 @@ > > char *confend; > > +static int > +hasconf(char *s) > +{ > + char *p; > + int n; > + > + n = strlen(s); > + for(p = BOOTARGS; n <= confend - p; p++){ > + if(memcmp(p, s, n) == 0) > + return 1; > + p = strchr(p, '\n'); > + if(p == nil) > + break; > + } > + return 0; > +} > + > static char* > getconf(char *s, char *buf) > { > @@ -364,7 +381,7 @@ > > close(f); > print("boot\n"); > - unload(); > + unload(hasconf("*e820=") ? nil : &confend); > > jump(e); >