grub2/include/grub
Daniel Kiper ae2a274518 chainloader: Fix wrong break condition (must be AND not, OR)
The definition of bpb's num_total_sectors_16 and num_total_sectors_32
is that either the 16-bit field is non-zero and is used (in which case
eg mkfs.fat sets the 32-bit field to zero), or it is zero and the
32-bit field is used. Therefore, a BPB is invalid only if *both*
fields are zero; having one field as zero and the other as non-zero is
the case to be expected. (Indeed, according to Microsoft's specification
one of the fields *must* be zero, and the other non-zero.)

This affects all users of grub_chainloader_patch_bpb which are in
chainloader.c, freedos.c, and ntldr.c

Some descriptions of the semantics of these two fields:

https://www.win.tue.nl/~aeb/linux/fs/fat/fat-1.html

  The old 2-byte fields "total number of sectors" and "number of
  sectors per FAT" are now zero; this information is now found in
  the new 4-byte fields.

(Here given in the FAT32 EBPB section but the total sectors 16/32 bit
fields semantic is true of FAT12 and FAT16 too.)

https://wiki.osdev.org/FAT#BPB_.28BIOS_Parameter_Block.29

  19 | 2 | The total sectors in the logical volume. If this value is 0,
  it means there are more than 65535 sectors in the volume, and the actual
  count is stored in "Large Sectors (bytes 32-35).

  32 | 4 | Large amount of sector on media. This field is set if there
  are more than 65535 sectors in the volume.

(Doesn't specify what the "large" field is set to when unused, but as
mentioned mkfs.fat sets it to zero then.)

https://technet.microsoft.com/en-us/library/cc976796.aspx

  0x13 | WORD | 0x0000 |
  Small Sectors . The number of sectors on the volume represented in 16
  bits (< 65,536). For volumes larger than 65,536 sectors, this field
  has a value of zero and the Large Sectors field is used instead.

  0x20 | DWORD | 0x01F03E00 |
  Large Sectors . If the value of the Small Sectors field is zero, this
  field contains the total number of sectors in the FAT16 volume. If the
  value of the Small Sectors field is not zero, the value of this field
  is zero.

https://staff.washington.edu/dittrich/misc/fatgen103.pdf page 10

  BPB_TotSec16 | 19 | 2 |
  This field is the old 16-bit total count of sectors on the volume.
  This count includes the count of all sectors in all four regions of the
  volume. This field can be 0; if it is 0, then BPB_TotSec32 must be
  non-zero. For FAT32 volumes, this field must be 0. For FAT12 and
  FAT16 volumes, this field contains the sector count, and
  BPB_TotSec32 is 0 if the total sector count “fits” (is less than
  0x10000).

  BPB_TotSec32 | 32 | 4 |
  This field is the new 32-bit total count of sectors on the volume.
  This count includes the count of all sectors in all four regions of the
  volume. This field can be 0; if it is 0, then BPB_TotSec16 must be
  non-zero. For FAT32 volumes, this field must be non-zero. For
  FAT12/FAT16 volumes, this field contains the sector count if
  BPB_TotSec16 is 0 (count is greater than or equal to 0x10000).

(This specifies that an unused BPB_TotSec32 field is set to zero.)

By the way fix offsets in include/grub/fat.h.

Tested with lDebug booted in qemu via grub2's
FreeDOS direct loading support, refer to
https://bitbucket.org/ecm/ldosboot + https://bitbucket.org/ecm/ldebug

Signed-off-by: C. Masloch <pushbx@38.de>
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
2018-02-23 22:32:55 +01:00
..
arc arc: Do not create spurious variable grub_arc_memory_type_t. 2017-08-30 15:18:24 +02:00
arm arm_coreboot: Add Chromebook keyboard driver. 2017-05-09 08:47:34 +02:00
arm64 efi: Add GRUB_PE32_MAGIC definition 2017-08-07 18:52:09 +02:00
coreboot coreboot: Split parts that are platform-independent. 2017-05-08 19:10:24 +02:00
efi efi: Free malloc regions on exit 2017-09-07 23:35:01 +02:00
efiemu Add gcc_struct to all packed structures when compiling with mingw. 2013-12-15 14:14:30 +01:00
emu Fix canonicalize_file_name clash. 2015-03-04 01:00:19 +01:00
gcry Import gcrypt public-key cryptography and implement signature checking. 2013-01-11 21:32:42 +01:00
gcrypt Remove autogenerated files from VCS 2013-01-12 16:17:31 +01:00
i386 Fix compilation for x86_64-efi. 2017-09-07 13:55:22 +02:00
ia64 ia64: Add support for R_IA64_GPREL64I. 2017-01-31 12:39:01 +01:00
ieee1275 Don't continue to query block-size if disk doesn't have it. 2015-03-03 20:50:37 +01:00
lib * include/grub/lib/LzmaDec.h: Fix to include LzmaTypes.h and 2013-11-10 20:37:01 +01:00
mips multiboot fixup 2017-08-14 16:24:05 +02:00
net Add Virtual LAN support. 2017-05-03 13:03:50 +02:00
osdep Use _W64 to detect MinGW W64-32 instead of _FILE_OFFSET_BITS 2014-01-18 20:04:11 +04:00
powerpc * grub-core/lib/powerpc/setjmp.S (grub_setjmp): Save r31. 2013-11-18 02:35:32 +01:00
sparc64 Add gcc_struct to all packed structures when compiling with mingw. 2013-12-15 14:14:30 +01:00
uboot Leif's API fixes 2013-05-03 15:07:39 +02:00
util Make grub-install check for errors from efibootmgr 2018-02-14 18:02:01 +01:00
x86_64 Support grub-emu on x32 (ILP32 but with x86-64 instruction set) 2014-09-07 23:04:50 +01:00
xen xen: modify page table construction 2016-10-27 16:22:06 +02:00
zfs zfs: com.delphix:embedded_data feature support 2015-05-03 18:45:40 +03:00
acorn_filecore.h working copy, wo nested packaging 2010-08-17 19:03:22 +05:30
acpi.h Make grub_acpi_find_fadt accessible generically 2016-02-12 11:35:48 +01:00
aout.h working copy, wo nested packaging 2010-08-17 19:03:22 +05:30
archelp.h Support for cbfs. Also factor out the part which is common 2013-06-16 00:06:13 +02:00
at_keyboard.h at_keyboard: Fix falco chromebook case. 2017-05-09 14:27:52 +02:00
ata.h Remove nested functions from device iterators. 2013-01-20 15:52:15 +00:00
auth.h working copy, wo nested packaging 2010-08-17 19:03:22 +05:30
autoefi.h Remove grub_efi_allocate_pages. 2017-08-07 18:33:29 +02:00
backtrace.h Several cleanups 2012-02-26 19:10:52 +01:00
bitmap_scale.h * grub-core/gfxmenu/theme_loader.c: New global options for the 2013-10-02 18:17:33 +04:00
bitmap.h Detach optional parts of gfxterm and integrate in with coreboot init. 2013-05-31 00:42:33 +02:00
boottime.h * include/grub/boottime.h: Add missing file. 2013-03-20 16:58:07 +01:00
bsdlabel.h Add gcc_struct to all packed structures when compiling with mingw. 2013-12-15 14:14:30 +01:00
btrfs.h Add gcc_struct to all packed structures when compiling with mingw. 2013-12-15 14:14:30 +01:00
bufio.h working copy, wo nested packaging 2010-08-17 19:03:22 +05:30
cache.h cache: Fix compilation for ppc, sparc and arm64 2017-07-09 20:59:15 +02:00
cbfs_core.h Add gcc_struct to all packed structures when compiling with mingw. 2013-12-15 14:14:30 +01:00
charset.h * grub-core/commands/cat.c: Show UTF-8 characters. 2013-05-08 11:09:08 +02:00
cmos.h * include/grub/cmos.h: Handle high CMOS addresses on sparc64. 2013-03-02 23:59:05 +01:00
color.h Detach optional parts of gfxterm and integrate in with coreboot init. 2013-05-31 00:42:33 +02:00
command.h fix include loop on MinGW due to libintl.h pulling stdio.h 2014-01-18 21:22:57 +04:00
compiler-rt-emu.h arm-emu: Add __aeabi_memcpy* and __aeabi_memclr* symbols. 2015-07-23 02:15:46 +02:00
compiler-rt.h ARM: provide __aeabi_memclr* and __aeabi_memcpy* symbols 2015-07-22 20:40:13 +02:00
compiler.h fix include loop on MinGW due to libintl.h pulling stdio.h 2014-01-18 21:22:57 +04:00
crypto.h fix Mingw W64-32 cross compile failure due to printf redefinition in libintl.h 2014-01-25 21:49:41 +04:00
cryptodisk.h cryptodisk: teach grub_cryptodisk_insert() about partitions (bug #45889) 2015-11-07 18:52:59 +03:00
cs5536.h Some CS5536 code 2011-10-01 22:51:12 +02:00
datetime.h * include/grub/datetime.h (grub_datetime2unixtime): Fix unixtime 2013-03-10 19:19:21 +01:00
decompressor.h MAke a separate scratch for decompressor 2010-09-21 19:39:51 +02:00
deflate.h Implement Truecrypt ISO loader. 2013-12-17 14:45:46 +01:00
device.h Remove nested functions from device iterators. 2013-01-20 15:52:15 +00:00
disk.h Add new ports: i386-xen and x86_64-xen. This allows running GRUB in 2013-11-09 21:29:11 +01:00
diskfilter.h diskfilter: Make name a const char to fix compilation error. 2015-07-22 20:39:14 +02:00
dl.h arm64: Add support for GOT and PCREL32 relocations. 2017-02-01 21:46:19 +01:00
dma.h arm_coreboot: Support DMA. 2017-05-08 22:06:04 +02:00
elf.h arm64: Add support for GOT and PCREL32 relocations. 2017-02-01 21:46:19 +01:00
elfload.h * grub-core/kern/elfXX.c (grub_elfXX_load): Handle 2013-04-19 15:05:11 +02:00
env_private.h working copy, wo nested packaging 2010-08-17 19:03:22 +05:30
env.h * grub-core/kern/env.c, include/grub/env.h: Change iterator through 2013-03-03 01:34:27 +01:00
err.h fix Mingw W64-32 cross compile failure due to printf redefinition in libintl.h 2014-01-25 21:49:41 +04:00
exfat.h Add gcc_struct to all packed structures when compiling with mingw. 2013-12-15 14:14:30 +01:00
extcmd.h Put terminfo into core on ieee1275 and yeeloong (needed for console). 2010-09-30 17:50:01 +02:00
fat.h chainloader: Fix wrong break condition (must be AND not, OR) 2018-02-23 22:32:55 +01:00
fbblit.h Move blit and fill dispatcher to appropriate files to decrease export 2013-05-30 22:06:28 +02:00
fbfill.h * grub-core/gfxmenu/gui_box.c: Updated to work with area status. 2013-11-08 15:42:38 +04:00
fbutil.h Detach optional parts of gfxterm and integrate in with coreboot init. 2013-05-31 00:42:33 +02:00
fdt.h Add support for device-tree-based drivers. 2017-05-08 21:19:59 +02:00
fdtbus.h fdtbus: Add ability to send/receive messages on parent busses. 2017-05-09 08:43:20 +02:00
file.h Add new ports: i386-xen and x86_64-xen. This allows running GRUB in 2013-11-09 21:29:11 +01:00
fileid.h Implement grub_file tool and use it to implement generating of config 2013-12-17 14:39:48 +01:00
font.h * grub-core/font/font.c, include/grub/font.h: Inline simple font 2013-05-30 21:58:24 +02:00
fontformat.h working copy, wo nested packaging 2010-08-17 19:03:22 +05:30
fs.h Implement better integration with Mac firmware. 2013-12-17 15:21:02 +01:00
fshelp.h fshelp: Add handling of "." and ".." and grub_fshelp_find_file_lookup. 2015-07-27 12:45:35 +02:00
gdb.h Adjust types in gdb module to have intended unsigned shifts rather than 2013-03-10 18:36:39 +01:00
gfxmenu_model.h working copy, wo nested packaging 2010-08-17 19:03:22 +05:30
gfxmenu_view.h * grub-core/gfxmenu/theme_loader.c: New global options for the 2013-10-02 18:17:33 +04:00
gfxterm.h Detach optional parts of gfxterm and integrate in with coreboot init. 2013-05-31 00:42:33 +02:00
gfxwidgets.h Take into account the decorations the computing menu entry width. 2011-04-19 00:44:53 +02:00
gpt_partition.h Add gcc_struct to all packed structures when compiling with mingw. 2013-12-15 14:14:30 +01:00
gui_string_util.h Move gfxmenu color handling to video, so that gfxterm can use it 2010-12-10 16:45:58 +00:00
gui.h * include/grub/gui.h (grub_fixed_sfs_divide): Round rather than 2013-11-08 16:17:29 +01:00
hfs.h Implement better integration with Mac firmware. 2013-12-17 15:21:02 +01:00
hfsplus.h hfsplus: Fix potential access to uninited memory on invalid FS 2015-03-06 22:33:20 +01:00
i18n.h Add missing format_arg attribute to check that printf with translated 2013-12-17 16:42:01 +01:00
icon_manager.h working copy, wo nested packaging 2010-08-17 19:03:22 +05:30
kernel.h Add support for device-tree-based drivers. 2017-05-08 21:19:59 +02:00
keyboard_layouts.h Handle Japanese special keys. 2013-10-17 00:49:05 +02:00
legacy_parse.h * grub-core/tests/legacy_password_test.c: New test. 2013-11-12 02:38:33 +01:00
libpciaccess.h working copy, wo nested packaging 2010-08-17 19:03:22 +05:30
linux.h Add ability to generate newc additions on runtime. 2013-03-22 21:01:28 +01:00
list.h fix include loop on MinGW due to libintl.h pulling stdio.h 2014-01-18 21:22:57 +04:00
loader.h Terminate UNDI and PXE before launching the payload to avoid problems 2012-04-11 22:32:31 +02:00
lvm.h Add gcc_struct to all packed structures when compiling with mingw. 2013-12-15 14:14:30 +01:00
macho.h * grub-core/loader/machoXX.c: Fix compilation on non-i386. 2013-12-17 22:44:46 +01:00
machoload.h Add LZSS Mach-O support (needed for new xnu kernelcache). 2012-02-29 13:26:13 +01:00
memory.h Translate UEFI persistent memory type 2015-12-15 10:25:34 +03:00
menu_viewer.h working copy, wo nested packaging 2010-08-17 19:03:22 +05:30
menu.h Fix menu title instability bug. 2012-03-04 14:55:13 +01:00
misc.h efi: Move grub_reboot() into kernel 2017-09-07 23:29:31 +02:00
mm_private.h fix grub-emu compilation 2010-08-28 14:52:25 +02:00
mm.h Remove grub_memalign on emu. 2013-12-08 18:12:20 +01:00
module_verifier.h grub-module-verifier: Ignore all_video emptiness on xen. 2017-01-30 00:13:41 +00:00
msdos_partition.h Add gcc_struct to all packed structures when compiling with mingw. 2013-12-15 14:14:30 +01:00
multiboot2.h Add a file missing in multiboot2 commit. 2017-09-05 23:13:55 +02:00
multiboot_loader.h working copy, wo nested packaging 2010-08-17 19:03:22 +05:30
multiboot.h multiboot: disentangle multiboot and multiboot2. 2017-08-14 14:08:54 +02:00
net.h Add Virtual LAN support. 2017-05-03 13:03:50 +02:00
normal.h * grub-core/normal/main.c: Don't drop to rescue console in 2014-09-21 18:51:09 +02:00
ns8250.h Fix compilation on yeeloong 2010-08-29 13:45:36 +02:00
ntfs.h Add gcc_struct to all packed structures when compiling with mingw. 2013-12-15 14:14:30 +01:00
offsets.h qemu, coreboot, multiboot: Change linking address to 0x9000. 2017-08-30 16:29:59 +02:00
parser.h * grub-core/disk/ldm.c: Rename variables and arguments to prevent 2013-10-18 16:54:57 +02:00
partition.h Remove nested functions from device iterators. 2013-01-20 15:52:15 +00:00
parttool.h Add missing const qualifiers. 2011-11-30 16:20:13 +01:00
pci.h arm_coreboot: Support DMA. 2017-05-08 22:06:04 +02:00
pciutils.h working copy, wo nested packaging 2010-08-17 19:03:22 +05:30
priority_queue.h * tests/priority_queue_unit_test.cc: New test. 2013-05-07 11:30:48 +02:00
procfs.h fix include loop on MinGW due to libintl.h pulling stdio.h 2014-01-18 21:22:57 +04:00
ps2.h at_keyboard: Split protocol from controller code. 2017-05-08 21:41:22 +02:00
pubkey.h Import gcrypt public-key cryptography and implement signature checking. 2013-01-11 21:32:42 +01:00
random.h Add RNG module. 2016-02-12 12:39:38 +01:00
reader.h Remove nested functions from script reading and parsing. 2013-01-15 12:03:25 +00:00
reed_solomon.h C part of Reed-Solomon 2010-09-24 14:05:47 +02:00
relocator_private.h Fix ppc compilation problems 2010-05-01 13:23:19 +02:00
relocator.h boot services avoid code based on the patch by Matthew Garrett 2012-03-03 20:06:41 +01:00
script_sh.h * grub-core/disk/ldm.c: Rename variables and arguments to prevent 2013-10-18 16:54:57 +02:00
scsi.h Remove nested functions from device iterators. 2013-01-20 15:52:15 +00:00
scsicmd.h Add gcc_struct to all packed structures when compiling with mingw. 2013-12-15 14:14:30 +01:00
sdl.h working copy, wo nested packaging 2010-08-17 19:03:22 +05:30
search.h support subpartition hints 2010-09-13 12:16:22 +02:00
serial.h * grub-core/term/serial.c: Add option for enabling/disabling 2013-11-08 18:20:20 +01:00
setjmp.h * include/grub/setjmp.h: Define RETURNS_TWICE. Keep it empty for 2013-10-18 16:38:36 +02:00
smbus.h working copy, wo nested packaging 2010-08-17 19:03:22 +05:30
speaker.h New terminal outputs using serial: morse and spkmodem. 2013-01-16 20:39:54 +01:00
symbol.h With Apple assembly in .macro environvemnt you have to use $$ instead 2013-11-24 07:08:18 +01:00
syslinux_parse.h Implement syslinux parser. 2013-12-18 05:28:05 +01:00
term.h core: use GRUB_TERM_ definitions when handling term characters 2017-08-07 19:28:22 +02:00
terminfo.h Lift 255x255 erminal sie restriction to 65535x65535. Also change from 2013-10-19 23:59:32 +02:00
test.h * include/grub/test.h: Use gnu_printf rather than printf on GRUB 2013-12-15 14:39:21 +01:00
time.h Add a new "none" platform that only builds utilities 2014-09-23 12:06:30 +01:00
tparm.h Add missing const qualifiers. 2011-11-30 16:20:13 +01:00
trig.h * grub-core/gentrigtables.c: Make tables const. 2013-03-01 11:15:09 +01:00
types.h Make unaligned types public. 2016-02-12 09:11:06 +01:00
udf.h Split out blocklist retrieving from setup.c to 2013-10-15 17:02:26 +02:00
unicode.h Add gcc_struct to all packed structures when compiling with mingw. 2013-12-15 14:14:30 +01:00
usb.h arm_coreboot: Support EHCI. 2017-05-08 22:15:05 +02:00
usbdesc.h Add gcc_struct to all packed structures when compiling with mingw. 2013-12-15 14:14:30 +01:00
usbserial.h Implement USBDebug (full USB stack variant). 2013-02-01 21:49:29 +01:00
usbtrans.h Add gcc_struct to all packed structures when compiling with mingw. 2013-12-15 14:14:30 +01:00
vga.h Add monochrome text support (mda_text, aka `hercules' in grub-legacy). 2012-06-28 15:27:54 +02:00
vgaregs.h Add monochrome text support (mda_text, aka `hercules' in grub-legacy). 2012-06-28 15:27:54 +02:00
video_fb.h * grub-core/gfxmenu/gui_box.c: Updated to work with area status. 2013-11-08 15:42:38 +04:00
video.h * include/grub/video.h (grub_video_rgba_color_rgb): Fix prototype 2013-12-21 14:31:47 +01:00
xen_file.h xen: add capability to load p2m list outside of kernel mapping 2016-10-27 16:22:06 +02:00
xen.h Adapt build-system to use imported xen headers. 2015-11-08 21:24:18 +01:00
xnu.h Add gcc_struct to all packed structures when compiling with mingw. 2013-12-15 14:14:30 +01:00