aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMike Waychison <mikew@google.com>2011-03-14 23:58:45 -0700
committerGreg Kroah-Hartman <gregkh@suse.de>2011-04-29 14:13:15 -0700
commit57d5f9f808b7650a92f31e9cd3acd3f415a22530 (patch)
tree47f8714e96f2f6d1fa0de28cb10812b5e43ea32b
parent773d67903ad608d3f64cc5b00e2f881473413c13 (diff)
x86: get_bios_ebda_length()
Add a wrapper routine that tells us the length of the EBDA if it is present. This guy also ensures that the returned length doesn't let the EBDA run past the 640KiB mark. Signed-off-by: Mike Waychison <mikew@google.com> Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
-rw-r--r--arch/x86/include/asm/bios_ebda.h21
1 files changed, 21 insertions, 0 deletions
diff --git a/arch/x86/include/asm/bios_ebda.h b/arch/x86/include/asm/bios_ebda.h
index 3c7521063d3f..5174cf0bf590 100644
--- a/arch/x86/include/asm/bios_ebda.h
+++ b/arch/x86/include/asm/bios_ebda.h
@@ -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