changeset 20211:c673ba511cc3

13351 loader: vbe_find_mode_xydm() is using wrong safety and iteration is buggy Reviewed by: Robert Mustacchi <rm@fingolfin.org> Approved by: Dan McDonald <danmcd@joyent.com>
author Toomas Soome <tsoome@me.com>
date Sun, 06 Dec 2020 20:23:46 +0200
parents 97ebd7dc417b
children cd16aeceed83
files usr/src/boot/Makefile.version usr/src/boot/sys/boot/i386/libi386/vbe.c
diffstat 2 files changed, 12 insertions(+), 8 deletions(-) [+]
line wrap: on
line diff
--- a/usr/src/boot/Makefile.version	Fri Nov 13 17:48:45 2020 -0600
+++ b/usr/src/boot/Makefile.version	Sun Dec 06 20:23:46 2020 +0200
@@ -34,4 +34,4 @@
 # Use date like formatting here, YYYY.MM.DD.XX, without leading zeroes.
 # The version is processed from left to right, the version number can only
 # be increased.
-BOOT_VERSION = $(LOADER_VERSION)-2020.12.07.1
+BOOT_VERSION = $(LOADER_VERSION)-2020.12.11.1
--- a/usr/src/boot/sys/boot/i386/libi386/vbe.c	Fri Nov 13 17:48:45 2020 -0600
+++ b/usr/src/boot/sys/boot/i386/libi386/vbe.c	Sun Dec 06 20:23:46 2020 +0200
@@ -51,6 +51,10 @@
 /* The default VGA color palette format is 6 bits per primary color. */
 int palette_format = 6;
 
+#define	VESA_MODE_BASE	0x100
+#define	VESA_MODE_MAX	0x1ff
+#define	VESA_MODE_COUNT	(VESA_MODE_MAX - VESA_MODE_BASE + 1)
+
 /* Actually assuming mode 3. */
 void
 bios_set_text_mode(int mode)
@@ -458,7 +462,7 @@
 	struct modeinfoblock mi;
 	uint32_t farptr;
 	uint16_t mode;
-	int safety = 0, i;
+	int safety, i;
 
 	memset(vbe, 0, sizeof (vbe));
 	memcpy(vbe->VbeSignature, "VBE2", 4);
@@ -466,8 +470,7 @@
 		return (0);
 	if (memcmp(vbe->VbeSignature, "VESA", 4) != 0)
 		return (0);
-	farptr = vbe->VideoModePtr;
-	if (farptr == 0)
+	if (vbe->VideoModePtr == 0)
 		return (0);
 
 	if (m != -1)
@@ -478,10 +481,12 @@
 		i = depth;
 
 	while (i > 0) {
+		farptr = vbe->VideoModePtr;
+		safety = 0;
 		while ((mode = *(uint16_t *)vbe_farptr(farptr)) != 0xffff) {
 			safety++;
 			farptr += 2;
-			if (safety == 100)
+			if (safety == VESA_MODE_COUNT)
 				return (0);
 			if (biosvbe_get_mode_info(mode, &mi) != VBE_SUCCESS) {
 				continue;
@@ -489,7 +494,6 @@
 			/* we only care about linear modes here */
 			if (vbe_mode_is_supported(&mi) == 0)
 				continue;
-			safety = 0;
 
 			if (m != -1) {
 				if (m == mode)
@@ -675,7 +679,7 @@
 	while ((mode = *(uint16_t *)vbe_farptr(farptr)) != 0xffff) {
 		safety++;
 		farptr += 2;
-		if (safety == 100) {
+		if (safety == VESA_MODE_COUNT) {
 			printf("[?] ");
 			break;
 		}
@@ -921,7 +925,7 @@
 		return (CMD_ERROR);
 	}
 
-	if (modenum >= 0x100) {
+	if (modenum >= VESA_MODE_BASE) {
 		if (vbestate.vbe_mode != modenum) {
 			reset_font_flags();
 			bios_text_font(false);