[Top][All Lists]

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Incorrect values in APM cseg_len and cseg_16_len fields

From: Владимир Андреев
Subject: Incorrect values in APM cseg_len and cseg_16_len fields
Date: Sat, 25 Nov 2017 22:44:34 +0300


GRUB provides ability to pass APM BIOS data to payload as well as to show it to 
user via "lsapm" command.
Pointed data is obtained via grub_apm_get_info function which in turn calls INT 
0x15 AH 0x53 BIOS service routine.
BIOS returns data via CPU registers and then received data is being scattered 
into fields of grub_apm_info struct.

According to APM BIOS spec v.1.2 low part of ESI register contains cseg_len 
value and high part of this register contains cseg_16_len value.
But in current implementation of grub_apm_get_info function these we have 
reverse assignment, i.e. low part of ESI is assigned to cseg_16_len and high 
part is assigned to cseg_len.

The following diff contains bug fix:

diff --git a/grub-core/commands/i386/pc/lsapm.c 
index c82476d..d1c699b 100644
--- a/grub-core/commands/i386/pc/lsapm.c
+++ b/grub-core/commands/i386/pc/lsapm.c
@@ -59,8 +59,8 @@ grub_apm_get_info (struct grub_apm_info *info)
   info->offset = regs.ebx;
   info->cseg_16 = regs.ecx & 0xffff;
   info->dseg = regs.edx & 0xffff;
-  info->cseg_len = regs.esi >> 16;
-  info->cseg_16_len = regs.esi & 0xffff;
+  info->cseg_len = regs.esi & 0xffff;
+  info->cseg_16_len = regs.esi >> 16;
   info->dseg_len = regs.edi;

   return 1;

With Best regards, Vladimir Andreev

reply via email to

[Prev in Thread] Current Thread [Next in Thread]