|
@@ -14,6 +14,27 @@ static inline unsigned int get_bios_ebda(void)
|
|
|
return address; /* 0 means none */
|
|
|
}
|
|
|
|
|
|
+/*
|
|
|
+ * Return the sanitized length of the EBDA in bytes, if it exists.
|
|
|
+ */
|
|
|
+static inline unsigned int get_bios_ebda_length(void)
|
|
|
+{
|
|
|
+ unsigned int address;
|
|
|
+ unsigned int length;
|
|
|
+
|
|
|
+ address = get_bios_ebda();
|
|
|
+ if (!address)
|
|
|
+ return 0;
|
|
|
+
|
|
|
+ /* EBDA length is byte 0 of the EBDA (stored in KiB) */
|
|
|
+ length = *(unsigned char *)phys_to_virt(address);
|
|
|
+ length <<= 10;
|
|
|
+
|
|
|
+ /* Trim the length if it extends beyond 640KiB */
|
|
|
+ length = min_t(unsigned int, (640 * 1024) - address, length);
|
|
|
+ return length;
|
|
|
+}
|
|
|
+
|
|
|
void reserve_ebda_region(void);
|
|
|
|
|
|
#ifdef CONFIG_X86_CHECK_BIOS_CORRUPTION
|