summaryrefslogtreecommitdiffstats
path: root/kexec
diff options
context:
space:
mode:
authorHongyan Xia <hongyxia@amazon.com>2021-04-06 15:11:52 +0100
committerSimon Horman <horms@verge.net.au>2021-04-07 21:26:41 +0200
commit774a16b16328310c2be41794fa462a0f6691c121 (patch)
tree2b794d0755c30e105171c6326e3db48bf9df99eb /kexec
parent28b0491b0f089046c623286c45815682d6506159 (diff)
downloadkexec-tools-774a16b16328310c2be41794fa462a0f6691c121.tar.gz
Fix where the real mode interrupt vector ends
The real mode ends at 0x400, not 0x100. The code intentionally excludes the IVT as RAM, so use the correct address. Also, 0x100 is not 1K aligned and will be rejected by add_memmap(). We have observed problems that after a multiboot2 kexec, the next kexec will throw away such unaligned chunks, losing memory for the next next kernel. In some corner cases, such loss of memory can actually cause OOM during boot. Signed-off-by: Hongyan Xia <hongyxia@amazon.com> Signed-off-by: Simon Horman <horms@verge.net.au>
Diffstat (limited to 'kexec')
-rw-r--r--kexec/arch/i386/kexec-x86-common.c10
1 files changed, 8 insertions, 2 deletions
diff --git a/kexec/arch/i386/kexec-x86-common.c b/kexec/arch/i386/kexec-x86-common.c
index 9303704a..ffc95a9e 100644
--- a/kexec/arch/i386/kexec-x86-common.c
+++ b/kexec/arch/i386/kexec-x86-common.c
@@ -48,6 +48,12 @@
#define E820_PRAM 12
#endif
+/*
+ * The real mode IVT ends at 0x400.
+ * See https://wiki.osdev.org/Interrupt_Vector_Table.
+ */
+#define REALMODE_IVT_END 0x400
+
static struct memory_range memory_range[MAX_MEMORY_RANGES];
/**
@@ -360,8 +366,8 @@ int get_memory_ranges(struct memory_range **range, int *ranges,
/* Don't report the interrupt table as ram */
for (i = 0; i < *ranges; i++) {
if ((*range)[i].type == RANGE_RAM &&
- ((*range)[i].start < 0x100)) {
- (*range)[i].start = 0x100;
+ ((*range)[i].start < REALMODE_IVT_END)) {
+ (*range)[i].start = REALMODE_IVT_END;
break;
}
}