From nobody Fri Feb 3 15:50:58 2023 X-Original-To: dev-commits-src-all@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 4P7g9b0rNgz3kS5f; Fri, 3 Feb 2023 15:50:59 +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 "R3" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 4P7g9Z5FFmz3JVL; Fri, 3 Feb 2023 15:50:58 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1675439458; 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=QKpi14qKQCeXTeEA77thjpdFSkxbKTDvPlsKcns1oWY=; b=s6V1JCg5KCeDuHQ8TnxDtudlQbbjxzb7gaA34ei/o7A/nVkxmeLZ0+Bo4IABJSZEsBtFw+ 8RCE/QqLFls5bWLDb/IxlnBk1sc+gQGkwkMhs3WGlEcCTTmK/v3S4nlLBiOY8wyzy0KdrN khgrcd4Gn7y4BKb3VspcUC7zS/J2kWaMd/1qqtm8Bx9sx7llX5imOZbHU0+laz4pBiWyeq 4EYSXeDM2nQiYCdFHX63+6TLz0SvIbOR5rh0zsadAb55i15fW4MQvnI8u9fehV/lwz3IVT hdgVKFYZ1KUcd0Z6QbB39SbD4EwtUsAUOrpvgS4biAhVicWpQ3nwloG9fhjqbQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1675439458; 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=QKpi14qKQCeXTeEA77thjpdFSkxbKTDvPlsKcns1oWY=; b=GTNmr/0rzCw49XTUEVpOImRQnFx0ZGS7boQU+JWa0rdCrxSg8zaeklw3vzB+yTUHAsQNUS rR2Z6zWFdOQyqV316xWpCHcpVIMs55oxCICjIUplI48hyCnrI8PHdsqJHBcrbyZcot/lyW BL27A5AP8K15ltdkxfOzARy/Dk+ucUNsJXoWg8oDhSyiM9kN6hsnz5E96Ey6hRf+BMZRWR 3hAm/s+Qb4dJUFwKkAfbtmEa1nYX2Vu/N2HVYDbuQZYyzQZhsCC/NFLcMawmV/PqJW3lP0 1pjf/+bw7RCE58s82R7jOSqQuiWRoS3f/OL9iw7giZWN91GACC++3jh0vwpifQ== ARC-Authentication-Results: i=1; mx1.freebsd.org; none ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1675439458; a=rsa-sha256; cv=none; b=VN2TDSFPNELolUxR1/Q52jgZnQdMg29qbyjRSY8uYZchUwgjmhf/bwcNHPZX0Glh5s15L7 eC5cKu4x1f+fXKyFDlfEPuISsZ0b8oj2W1iDlJ1S7vITrVhBMmipWCGyPb8DsYo0ugUW7t tf1bsWl8/0p3Ec3oSMVbJuxAZPzwOlHcoFBgn0yX1/C0D1eQTSgg5jmj7ABZnY9Zgo5GKO HYt6FkzoMsXrYF8cjQH9jBY8i6SqUYTMnyQYfLGtpP097JUBVldT/6AvMsmhZe/sHZcaMu O+muJIqQsLf2bWlz3bxiNCU+yI7zmtLvmbWbtixqN9CQbUdq9WfQPzzNB/i76Q== 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 4P7g9Z40Mgzg8P; Fri, 3 Feb 2023 15:50:58 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from gitrepo.freebsd.org ([127.0.1.44]) by gitrepo.freebsd.org (8.16.1/8.16.1) with ESMTP id 313FowdC024234; Fri, 3 Feb 2023 15:50:58 GMT (envelope-from git@gitrepo.freebsd.org) Received: (from git@localhost) by gitrepo.freebsd.org (8.16.1/8.16.1/Submit) id 313Fowpa024233; Fri, 3 Feb 2023 15:50:58 GMT (envelope-from git) Date: Fri, 3 Feb 2023 15:50:58 GMT Message-Id: <202302031550.313Fowpa024233@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: 335e3daaf043 - main - kboot: Keep track of what's used in the segment List-Id: Commit messages for all branches of the src repository List-Archive: https://lists.freebsd.org/archives/dev-commits-src-all List-Help: List-Post: List-Subscribe: List-Unsubscribe: Sender: owner-dev-commits-src-all@freebsd.org X-BeenThere: dev-commits-src-all@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: 335e3daaf043fb32aaa5fbef513cae0c8c858ee7 Auto-Submitted: auto-generated X-ThisMailContainsUnwantedMimeParts: N The branch main has been updated by imp: URL: https://cgit.FreeBSD.org/src/commit/?id=335e3daaf043fb32aaa5fbef513cae0c8c858ee7 commit 335e3daaf043fb32aaa5fbef513cae0c8c858ee7 Author: Warner Losh AuthorDate: 2023-02-03 15:41:11 +0000 Commit: Warner Losh CommitDate: 2023-02-03 15:41:41 +0000 kboot: Keep track of what's used in the segment Keep track of how much is used in the segment as we allocate it to the application. Set memsz to 0 first, and increment it as used. Adjust the bufsz before we call kexec so the kernel copies the right amount (it's an error for bufsz to be bigger than memsz, so we set them == when we retrieve the segment). Make sure we round to the page size, otherwise kexec_load gets cranky. Sponsored by: Netflix Reviewed by: tsoome Differential Revision: https://reviews.freebsd.org/D38315 --- stand/kboot/main.c | 29 +++++++++++++++++++---------- 1 file changed, 19 insertions(+), 10 deletions(-) diff --git a/stand/kboot/main.c b/stand/kboot/main.c index 450934b72777..f81d7b2cead4 100644 --- a/stand/kboot/main.c +++ b/stand/kboot/main.c @@ -322,14 +322,14 @@ get_phys_buffer(vm_offset_t dest, const size_t len, void **buf) { int i = 0; const size_t segsize = 64*1024*1024; - size_t sz; + size_t sz, amt, l; if (nkexec_segments == HOST_KEXEC_SEGMENT_MAX) panic("Tried to load too many kexec segments"); for (i = 0; i < nkexec_segments; i++) { if (dest >= (vm_offset_t)loaded_segments[i].mem && dest < (vm_offset_t)loaded_segments[i].mem + - loaded_segments[i].memsz) + loaded_segments[i].bufsz) /* Need to use bufsz since memsz is in use size */ goto out; } @@ -348,16 +348,21 @@ get_phys_buffer(vm_offset_t dest, const size_t len, void **buf) loaded_segments[nkexec_segments].buf = host_getmem(sz); loaded_segments[nkexec_segments].bufsz = sz; loaded_segments[nkexec_segments].mem = (void *)rounddown2(dest,SEGALIGN); - loaded_segments[nkexec_segments].memsz = sz; + loaded_segments[nkexec_segments].memsz = 0; i = nkexec_segments; nkexec_segments++; out: - *buf = loaded_segments[i].buf + (dest - - (vm_offset_t)loaded_segments[i].mem); - return (min(len,loaded_segments[i].bufsz - (dest - - (vm_offset_t)loaded_segments[i].mem))); + /* + * Keep track of the highest amount used in a segment + */ + amt = dest - (vm_offset_t)loaded_segments[i].mem; + l = min(len,loaded_segments[i].bufsz - amt); + *buf = loaded_segments[i].buf + amt; + if (amt + l > loaded_segments[i].memsz) + loaded_segments[i].memsz = amt + l; + return (l); } ssize_t @@ -447,12 +452,16 @@ kboot_autoload(void) void kboot_kseg_get(int *nseg, void **ptr) { - int a; - printf("kseg_get: %d segments\n", nkexec_segments); printf("VA SZ PA MEMSZ\n"); printf("---------------- -------- ---------------- -----\n"); - for (a = 0; a < nkexec_segments; a++) { + for (int a = 0; a < nkexec_segments; a++) { + /* + * Truncate each segment to just what we've used in the segment, + * rounded up to the next page. + */ + loaded_segments[a].memsz = roundup2(loaded_segments[a].memsz,PAGE_SIZE); + loaded_segments[a].bufsz = loaded_segments[a].memsz; printf("%016jx %08jx %016jx %08jx\n", (uintmax_t)loaded_segments[a].buf, (uintmax_t)loaded_segments[a].bufsz,