From 50bc81e7001c3843339e5ea75edf8e908fb8ad8d Mon Sep 17 00:00:00 2001 From: Warner Losh Date: Wed, 16 Apr 2025 22:04:58 -0600 Subject: [PATCH] kboot/amd64: Use segs framework to find kernel location Use the segs framework to find a place to land the kernel, with the same super ugly defaults as aarch64. Sponsored by: Netflix Reviewed by: kevans, jhibbits Differential Revision: https://reviews.freebsd.org/D49866 --- stand/kboot/kboot/arch/amd64/load_addr.c | 27 +++++++++++++----------- 1 file changed, 15 insertions(+), 12 deletions(-) diff --git a/stand/kboot/kboot/arch/amd64/load_addr.c b/stand/kboot/kboot/arch/amd64/load_addr.c index ae53aa75da1..e0815cd0790 100644 --- a/stand/kboot/kboot/arch/amd64/load_addr.c +++ b/stand/kboot/kboot/arch/amd64/load_addr.c @@ -43,23 +43,26 @@ enumerate_memory_arch(void) return (true); } +/* XXX refactor with aarch64 */ uint64_t kboot_get_phys_load_segment(void) { - static uint64_t base_seg = BAD_SEG; +#define HOLE_SIZE (64ul << 20) +#define KERN_ALIGN (2ul << 20) + static uint64_t s = 0; - if (base_seg != BAD_SEG) - return (base_seg); + if (s != 0) + return (s); - if (nr_seg > 0) - base_seg = find_ram(segs, nr_seg, 2ULL << 20, 2ULL << 20, - 64ULL << 20, 4ULL << 30); - if (base_seg == BAD_SEG) { - /* XXX Should fall back to using /proc/iomem maybe? */ - /* XXX PUNT UNTIL I NEED SOMETHING BETTER */ - base_seg = 300ULL * (1 << 20); - } - return (base_seg); + print_avail(); + s = first_avail(KERN_ALIGN, HOLE_SIZE, SYSTEM_RAM); + printf("KBOOT GET PHYS Using %#llx\n", (long long)s); + if (s != 0) + return (s); + s = 0x40000000 | 0x4200000; /* should never get here */ + /* XXX PANIC? XXX */ + printf("Falling back to the crazy address %#lx which works in qemu\n", s); + return (s); } void