From nobody Thu Apr 17 21:59:18 2025 X-Original-To: dev-commits-src-main@mlmmj.nyi.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mlmmj.nyi.freebsd.org (Postfix) with ESMTP id 4ZdsHX4yhSz5sr86; Thu, 17 Apr 2025 21:59:20 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from mxrelay.nyi.freebsd.org (mxrelay.nyi.freebsd.org [IPv6:2610:1c1:1:606c::19:3]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 client-signature RSA-PSS (4096 bits) client-digest SHA256) (Client CN "mxrelay.nyi.freebsd.org", Issuer "R10" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 4ZdsHW0zN8z3V7q; Thu, 17 Apr 2025 21:59:19 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1744927159; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=39lB3ekm2j/Ng/WJgCwi3DZSjUOJCNfHpatWSj20PvA=; b=ZTqaOS4AIn45YxVdcVEQWMRrigiv8+gcOajHcct+jbzreArdtJkKUEDg4AcIpNsoqBPYSc lHg4XY4btCJ0tsHKmYtAjyQ6V9nRXrG8GgZq1BDrXcJKczTSuWUxRS8ly8OA/z+0G/+7Vi voLxKtan8qWLIM4qxlH27G8/MQepCvSFjltswMaPUtRNbxYtxKgMG2Wgs4GRU2a1LS7oQ3 wroufz9luwPyKFGOv4SEiLYmDNx1A1nAtsHNks4kk15UR5W3xMjiWA8xpw3yjUSg0pNOL2 QMWzkA6u4iBfZt4A4ZGW0m5xZ9KScC38mSB9+D/eoKhs5EYzjLd84TE/oYU9jg== ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1744927159; a=rsa-sha256; cv=none; b=BeI+2PbUPLzaIIpeTbXrDa4+7rzRJuxunT1gUEVb1WAmYjIB7NnWuoJ9dJyR3GqYRMrZYs n0WiH+H2aAn1Zpi+LfIUZIDbIdHNHIsD/o8Na1A8+8sG5UsScDUNOb5Hnl5Xx9QyS0tZoE Aj5KzOtJ5onRLayNpLTGSg+ldupcQNRz7n4cm/CmQndFo2YVE9agihndicuI04CKLCF/Bb /Y+4KbWf2ow0BxLYfdc9HnaWna58W7QUo1VgK/V+us8m9wqB/dp+aCgiHRfN8EBJC23Kw2 NWQoCMMUOqLJH8Qal3kHeKkPmX79tEpd8shk/1+3zSwHeD7oJmdck49N8JMVJA== ARC-Authentication-Results: i=1; mx1.freebsd.org; none ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1744927159; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=39lB3ekm2j/Ng/WJgCwi3DZSjUOJCNfHpatWSj20PvA=; b=jmtYi0hEG2H5iaN0oIUbGzLm99RG9fdRJ/LNCvdfQNgS0dqTlkXjIbWkR7wLj4xHir5som q33fq3LPnQ5nxj3/qJrmbCeTk0ZePj18uZx6rz5Y0kLyYWQei4a5OQookMCbSpNoVXvmty 7Imyb0EP2dtV7kaCqvip9PDD5EZaD/+6TLk4bsjTFQNpxu1cfHNkGEXMljsoNR9jtDHAZE dQuqY+MVR6nvWRX6KCZMowtZogQ+x/FC914yhxfmA7jYI5JprkTN0EiVKCmg6gIxJXkh6t QP4ckhoy1MEuKLwziT+gOSPp7JvNoVjQBg0TDTPbPDmYYW0KUzz7BgBxvd85Yg== Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (Client did not present a certificate) by mxrelay.nyi.freebsd.org (Postfix) with ESMTPS id 4ZdsHW0SnFz1540; Thu, 17 Apr 2025 21:59:19 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from gitrepo.freebsd.org ([127.0.1.44]) by gitrepo.freebsd.org (8.18.1/8.18.1) with ESMTP id 53HLxIma002795; Thu, 17 Apr 2025 21:59:18 GMT (envelope-from git@gitrepo.freebsd.org) Received: (from git@localhost) by gitrepo.freebsd.org (8.18.1/8.18.1/Submit) id 53HLxIsU002792; Thu, 17 Apr 2025 21:59:18 GMT (envelope-from git) Date: Thu, 17 Apr 2025 21:59:18 GMT Message-Id: <202504172159.53HLxIsU002792@gitrepo.freebsd.org> To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org From: Warner Losh Subject: git: 9acf6422208a - main - kboot/amd64: Use common routines for memory map parsing List-Id: Commit messages for the main branch of the src repository List-Archive: https://lists.freebsd.org/archives/dev-commits-src-main List-Help: List-Post: List-Subscribe: List-Unsubscribe: X-BeenThere: dev-commits-src-main@freebsd.org Sender: owner-dev-commits-src-main@FreeBSD.org MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Git-Committer: imp X-Git-Repository: src X-Git-Refname: refs/heads/main X-Git-Reftype: branch X-Git-Commit: 9acf6422208a7b43b2ba7d3e66f13f2874d4a3aa Auto-Submitted: auto-generated The branch main has been updated by imp: URL: https://cgit.FreeBSD.org/src/commit/?id=9acf6422208a7b43b2ba7d3e66f13f2874d4a3aa commit 9acf6422208a7b43b2ba7d3e66f13f2874d4a3aa Author: Warner Losh AuthorDate: 2025-04-17 04:04:39 +0000 Commit: Warner Losh CommitDate: 2025-04-17 21:56:46 +0000 kboot/amd64: Use common routines for memory map parsing Use populate_avail_from_iomem and efi_read_from_sysfs from the refactored work rather than replicating them (imperfectly) here. Note: memmap might need to be revisited. EFI memory maps are complex on x86 and we might need to reconstruct it from /sys/firmware/memmap as well as using that for the BIOS case, should we ever want to support that again (hardware makes no sense, but many VM hosting services use that). For now, we're going all in on EFI, though, and will revisit what to do about BIOS later. The zfsboot project suggests BIOS support isn't really that hard (but is a distraction atm). Sponsored by: Netflix Reviewed by: kevans, jhibbits Differential Revision: https://reviews.freebsd.org/D49864 --- stand/kboot/kboot/arch/amd64/load_addr.c | 111 ++----------------------------- 1 file changed, 6 insertions(+), 105 deletions(-) diff --git a/stand/kboot/kboot/arch/amd64/load_addr.c b/stand/kboot/kboot/arch/amd64/load_addr.c index 4bd2a19dab48..ae53aa75da19 100644 --- a/stand/kboot/kboot/arch/amd64/load_addr.c +++ b/stand/kboot/kboot/arch/amd64/load_addr.c @@ -29,117 +29,18 @@ #include "stand.h" #include "host_syscall.h" +#include "efi.h" #include "kboot.h" #include "bootstrap.h" -/* Refactor when we do arm64 */ - -enum types { - system_ram = 1, - acpi_tables, - acpi_nv_storage, - unusable, - persistent_old, - persistent, - soft_reserved, - reserved, -}; - -struct kv -{ - uint64_t type; - char * name; -} str2type_kv[] = { - { system_ram, "System RAM" }, - { acpi_tables, "ACPI Tables" }, - { acpi_nv_storage, "ACPI Non-volatile Storage" }, - { unusable, "Unusable memory" }, - { persistent_old, "Persistent Memory (legacy)" }, - { persistent, "Persistent Memory" }, - { soft_reserved, "Soft Reserved" }, - { reserved, "reserved" }, - { 0, NULL }, -}; - -#define MEMMAP "/sys/firmware/memmap" - -static struct memory_segments segs[64]; /* make dynamic later */ -static int nr_seg; - -static bool -str2type(struct kv *kv, const char *buf, uint64_t *value) -{ - while (kv->name != NULL) { - if (strcmp(kv->name, buf) == 0) { - *value = kv->type; - return true; - } - kv++; - } - - return false; -} - bool enumerate_memory_arch(void) { - int n; - char name[MAXPATHLEN]; - char buf[80]; - - for (n = 0; n < nitems(segs); n++) { - snprintf(name, sizeof(name), "%s/%d/start", MEMMAP, n); - if (!file2u64(name, &segs[n].start)) - break; - snprintf(name, sizeof(name), "%s/%d/end", MEMMAP, n); - if (!file2u64(name, &segs[n].end)) - break; - snprintf(name, sizeof(name), "%s/%d/type", MEMMAP, n); - if (!file2str(name, buf, sizeof(buf))) - break; - if (!str2type(str2type_kv, buf, &segs[n].type)) - break; - } - - nr_seg = n; - - return true; -} - -#define BAD_SEG ~0ULL - -#define SZ(s) (((s).end - (s).start) + 1) - -static uint64_t -find_ram(struct memory_segments *segs, int nr_seg, uint64_t minpa, uint64_t align, - uint64_t sz, uint64_t maxpa) -{ - uint64_t start; - - printf("minpa %#jx align %#jx sz %#jx maxpa %#jx\n", - (uintmax_t)minpa, - (uintmax_t)align, - (uintmax_t)sz, - (uintmax_t)maxpa); - /* XXX assume segs are sorted in numeric order -- assumed not ensured */ - for (int i = 0; i < nr_seg; i++) { - if (segs[i].type != system_ram || - SZ(segs[i]) < sz || - minpa + sz > segs[i].end || - maxpa < segs[i].start) - continue; - start = roundup(segs[i].start, align); - if (start < minpa) /* Too small, round up and try again */ - start = (roundup(minpa, align)); - if (start + sz > segs[i].end) /* doesn't fit in seg */ - continue; - if (start > maxpa || /* Over the edge */ - start + sz > maxpa) /* on the edge */ - break; /* No hope to continue */ - return start; - } - - return BAD_SEG; + efi_read_from_sysfs(); + if (!populate_avail_from_iomem()) + return (false); + print_avail(); + return (true); } uint64_t