Revision f1d4d47c5851b348b7713007e152bc68b94d728b authored by Mike Rapoport on 01 June 2021, 07:53:52 UTC, committed by Borislav Petkov on 03 June 2021, 17:57:55 UTC
There are BIOSes that are known to corrupt the memory under 1M, or more
precisely under 640K because the memory above 640K is anyway reserved
for the EGA/VGA frame buffer and BIOS.

To prevent usage of the memory that will be potentially clobbered by the
kernel, the beginning of the memory is always reserved. The exact size
of the reserved area is determined by CONFIG_X86_RESERVE_LOW build time
and the "reservelow=" command line option. The reserved range may be
from 4K to 640K with the default of 64K. There are also configurations
that reserve the entire 1M range, like machines with SandyBridge graphic
devices or systems that enable crash kernel.

In addition to the potentially clobbered memory, EBDA of unknown size may
be as low as 128K and the memory above that EBDA start is also reserved
early.

It would have been possible to reserve the entire range under 1M unless for
the real mode trampoline that must reside in that area.

To accommodate placement of the real mode trampoline and keep the memory
safe from being clobbered by BIOS, reserve the first 64K of RAM before
memory allocations are possible and then, after the real mode trampoline
is allocated, reserve the entire range from 0 to 1M.

Update trim_snb_memory() and reserve_real_mode() to avoid redundant
reservations of the same memory range.

Also make sure the memory under 1M is not getting freed by
efi_free_boot_services().

 [ bp: Massage commit message and comments. ]

Fixes: a799c2bd29d1 ("x86/setup: Consolidate early memory reservations")
Signed-off-by: Mike Rapoport <rppt@linux.ibm.com>
Signed-off-by: Borislav Petkov <bp@suse.de>
Tested-by: Hugh Dickins <hughd@google.com>
Link: https://bugzilla.kernel.org/show_bug.cgi?id=213177
Link: https://lkml.kernel.org/r/20210601075354.5149-2-rppt@kernel.org
1 parent 2b31e8e
History
File Mode Size
9p
adfs
affs
afs
autofs
befs
bfs
btrfs
cachefiles
ceph
cifs
coda
configfs
cramfs
crypto
debugfs
devpts
dlm
ecryptfs
efivarfs
efs
erofs
exfat
exportfs
ext2
ext4
f2fs
fat
freevxfs
fscache
fuse
gfs2
hfs
hfsplus
hostfs
hpfs
hugetlbfs
iomap
isofs
jbd2
jffs2
jfs
kernfs
lockd
minix
netfs
nfs
nfs_common
nfsd
nilfs2
nls
notify
ntfs
ocfs2
omfs
openpromfs
orangefs
overlayfs
proc
pstore
qnx4
qnx6
quota
ramfs
reiserfs
romfs
squashfs
sysfs
sysv
tracefs
ubifs
udf
ufs
unicode
vboxsf
verity
xfs
zonefs
Kconfig -rw-r--r-- 8.7 KB
Kconfig.binfmt -rw-r--r-- 7.6 KB
Makefile -rw-r--r-- 4.5 KB
aio.c -rw-r--r-- 56.4 KB
anon_inodes.c -rw-r--r-- 6.8 KB
attr.c -rw-r--r-- 13.1 KB
bad_inode.c -rw-r--r-- 5.8 KB
binfmt_aout.c -rw-r--r-- 8.3 KB
binfmt_elf.c -rw-r--r-- 60.5 KB
binfmt_elf_fdpic.c -rw-r--r-- 43.7 KB
binfmt_em86.c -rw-r--r-- 2.7 KB
binfmt_flat.c -rw-r--r-- 28.5 KB
binfmt_misc.c -rw-r--r-- 17.4 KB
binfmt_script.c -rw-r--r-- 4.2 KB
block_dev.c -rw-r--r-- 48.5 KB
buffer.c -rw-r--r-- 89.6 KB
char_dev.c -rw-r--r-- 16.5 KB
compat_binfmt_elf.c -rw-r--r-- 3.7 KB
coredump.c -rw-r--r-- 28.1 KB
d_path.c -rw-r--r-- 11.5 KB
dax.c -rw-r--r-- 46.7 KB
dcache.c -rw-r--r-- 85.4 KB
direct-io.c -rw-r--r-- 39.7 KB
drop_caches.c -rw-r--r-- 1.8 KB
eventfd.c -rw-r--r-- 12.1 KB
eventpoll.c -rw-r--r-- 63.8 KB
exec.c -rw-r--r-- 49.4 KB
fcntl.c -rw-r--r-- 23.7 KB
fhandle.c -rw-r--r-- 6.8 KB
file.c -rw-r--r-- 29.2 KB
file_table.c -rw-r--r-- 10.2 KB
filesystems.c -rw-r--r-- 6.4 KB
fs-writeback.c -rw-r--r-- 76.0 KB
fs_context.c -rw-r--r-- 17.2 KB
fs_parser.c -rw-r--r-- 10.1 KB
fs_pin.c -rw-r--r-- 1.9 KB
fs_struct.c -rw-r--r-- 3.4 KB
fs_types.c -rw-r--r-- 2.5 KB
fsopen.c -rw-r--r-- 11.0 KB
init.c -rw-r--r-- 6.1 KB
inode.c -rw-r--r-- 62.1 KB
internal.h -rw-r--r-- 5.4 KB
io-wq.c -rw-r--r-- 25.2 KB
io-wq.h -rw-r--r-- 3.6 KB
io_uring.c -rw-r--r-- 249.0 KB
ioctl.c -rw-r--r-- 29.3 KB
kernel_read_file.c -rw-r--r-- 4.4 KB
libfs.c -rw-r--r-- 39.7 KB
locks.c -rw-r--r-- 81.3 KB
mbcache.c -rw-r--r-- 12.0 KB
mount.h -rw-r--r-- 4.0 KB
mpage.c -rw-r--r-- 20.5 KB
namei.c -rw-r--r-- 130.7 KB
namespace.c -rw-r--r-- 107.9 KB
no-block.c -rw-r--r-- 478 bytes
nsfs.c -rw-r--r-- 6.6 KB
open.c -rw-r--r-- 33.9 KB
pipe.c -rw-r--r-- 33.8 KB
pnode.c -rw-r--r-- 15.1 KB
pnode.h -rw-r--r-- 2.0 KB
posix_acl.c -rw-r--r-- 23.4 KB
proc_namespace.c -rw-r--r-- 8.1 KB
read_write.c -rw-r--r-- 39.4 KB
readdir.c -rw-r--r-- 13.9 KB
remap_range.c -rw-r--r-- 14.0 KB
select.c -rw-r--r-- 34.7 KB
seq_file.c -rw-r--r-- 25.1 KB
signalfd.c -rw-r--r-- 9.0 KB
splice.c -rw-r--r-- 38.8 KB
stack.c -rw-r--r-- 2.5 KB
stat.c -rw-r--r-- 20.6 KB
statfs.c -rw-r--r-- 9.7 KB
super.c -rw-r--r-- 45.2 KB
sync.c -rw-r--r-- 10.5 KB
timerfd.c -rw-r--r-- 13.6 KB
userfaultfd.c -rw-r--r-- 54.2 KB
utimes.c -rw-r--r-- 7.6 KB
xattr.c -rw-r--r-- 27.4 KB

back to top