summaryrefslogtreecommitdiffstats
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
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>
-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;
}
}