The branch main has been updated by vexeduxr:

URL: 
https://cgit.FreeBSD.org/src/commit/?id=efe5907279e1aa1781fc4d5260204888cd235cc2

commit efe5907279e1aa1781fc4d5260204888cd235cc2
Author:     Ahmad Khalifa <vexed...@freebsd.org>
AuthorDate: 2025-07-06 19:09:15 +0000
Commit:     Ahmad Khalifa <vexed...@freebsd.org>
CommitDate: 2025-07-06 19:26:07 +0000

    amd64: fix physmap entry addition logic
    
    Since physmap_idx points to the next slot, we should make sure both 'i'
    and 'insert_idx' are less than physmap_idx, but never equal to it.
    
    Also allow physmap_idx to reach PHYS_AVAIL_ENTRIES so the last slot can
    be populated.
    
    Reviewed by:    kib, markj
    Approved by:    imp (mentor)
    Differential Revision:  https://reviews.freebsd.org/D51173
---
 sys/amd64/amd64/machdep.c | 11 ++++++-----
 1 file changed, 6 insertions(+), 5 deletions(-)

diff --git a/sys/amd64/amd64/machdep.c b/sys/amd64/amd64/machdep.c
index 032a134bbd4b..9724a6acb130 100644
--- a/sys/amd64/amd64/machdep.c
+++ b/sys/amd64/amd64/machdep.c
@@ -645,7 +645,7 @@ add_physmap_entry(uint64_t base, uint64_t length, 
vm_paddr_t *physmap,
         * NB: physmap_idx points to the next free slot.
         */
        insert_idx = physmap_idx;
-       for (i = 0; i <= physmap_idx; i += 2) {
+       for (i = 0; i < physmap_idx; i += 2) {
                if (base < physmap[i + 1]) {
                        if (base + length <= physmap[i]) {
                                insert_idx = i;
@@ -659,7 +659,7 @@ add_physmap_entry(uint64_t base, uint64_t length, 
vm_paddr_t *physmap,
        }
 
        /* See if we can prepend to the next entry. */
-       if (insert_idx <= physmap_idx && base + length == physmap[insert_idx]) {
+       if (insert_idx < physmap_idx && base + length == physmap[insert_idx]) {
                physmap[insert_idx] = base;
                return (1);
        }
@@ -670,8 +670,6 @@ add_physmap_entry(uint64_t base, uint64_t length, 
vm_paddr_t *physmap,
                return (1);
        }
 
-       physmap_idx += 2;
-       *physmap_idxp = physmap_idx;
        if (physmap_idx == PHYS_AVAIL_ENTRIES) {
                printf(
                "Too many segments in the physical address map, giving up\n");
@@ -682,11 +680,14 @@ add_physmap_entry(uint64_t base, uint64_t length, 
vm_paddr_t *physmap,
         * Move the last 'N' entries down to make room for the new
         * entry if needed.
         */
-       for (i = (physmap_idx - 2); i > insert_idx; i -= 2) {
+       for (i = physmap_idx; i > insert_idx; i -= 2) {
                physmap[i] = physmap[i - 2];
                physmap[i + 1] = physmap[i - 1];
        }
 
+       physmap_idx += 2;
+       *physmap_idxp = physmap_idx;
+
        /* Insert the new entry. */
        physmap[insert_idx] = base;
        physmap[insert_idx + 1] = base + length;

Reply via email to