Date: Thu, 10 Dec 2020 13:11:52 +0000 (UTC) From: "Bradley T. Hughes" <bhughes@FreeBSD.org> To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r368513 - head/sys/dev/hyperv/vmbus Message-ID: <202012101311.0BADBqdq022221@repo.freebsd.org>
next in thread | raw e-mail | index | archive | help
Author: bhughes (ports committer) Date: Thu Dec 10 13:11:52 2020 New Revision: 368513 URL: https://svnweb.freebsd.org/changeset/base/368513 Log: hyperv/vmbus: avoid crash, panic if vbe fb info is missing Do not assume that VBE framebuffer metadata can be used. Like with the EFI fb metadata, it may be null, so we should take care not to dereference the null vbefb pointer. This avoids a panic when booting -CURRENT on a gen1 VM in Azure. Approved by: tsoome Sponsored by: Miles AS Differential Revision: https://reviews.freebsd.org/D27533 Modified: head/sys/dev/hyperv/vmbus/vmbus.c Modified: head/sys/dev/hyperv/vmbus/vmbus.c ============================================================================== --- head/sys/dev/hyperv/vmbus/vmbus.c Thu Dec 10 13:08:06 2020 (r368512) +++ head/sys/dev/hyperv/vmbus/vmbus.c Thu Dec 10 13:11:52 2020 (r368513) @@ -1361,35 +1361,33 @@ vmbus_fb_mmio_res(device_t dev) kmdp = preload_search_by_type("elf64 kernel"); efifb = (struct efi_fb *)preload_search_info(kmdp, MODINFO_METADATA | MODINFOMD_EFI_FB); - if (efifb == NULL) { - vbefb = (struct vbe_fb *)preload_search_info(kmdp, - MODINFO_METADATA | MODINFOMD_VBE_FB); + vbefb = (struct vbe_fb *)preload_search_info(kmdp, + MODINFO_METADATA | MODINFOMD_VBE_FB); + if (efifb != NULL) { + fb_start = efifb->fb_addr; + fb_end = efifb->fb_addr + efifb->fb_size; + fb_count = efifb->fb_size; + fb_height = efifb->fb_height; + fb_width = efifb->fb_width; + } else if (vbefb != NULL) { fb_start = vbefb->fb_addr; fb_end = vbefb->fb_addr + vbefb->fb_size; fb_count = vbefb->fb_size; fb_height = vbefb->fb_height; fb_width = vbefb->fb_width; } else { - fb_start = efifb->fb_addr; - fb_end = efifb->fb_addr + efifb->fb_size; - fb_count = efifb->fb_size; - fb_height = efifb->fb_height; - fb_width = efifb->fb_width; - } - - if (fb_start == 0) { if (bootverbose) device_printf(dev, "no preloaded kernel fb information\n"); /* We are on Gen1 VM, just return. */ return; - } else { - if (bootverbose) - device_printf(dev, - "fb: fb_addr: %#jx, size: %#jx, " - "actual size needed: 0x%x\n", - fb_start, fb_count, fb_height * fb_width); } + + if (bootverbose) + device_printf(dev, + "fb: fb_addr: %#jx, size: %#jx, " + "actual size needed: 0x%x\n", + fb_start, fb_count, fb_height * fb_width); hv_fb_res = pcib_host_res_alloc(&sc->vmbus_mmio_res, dev, SYS_RES_MEMORY, &rid, fb_start, fb_end, fb_count,
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?202012101311.0BADBqdq022221>