diff options
Diffstat (limited to 'arch/x86/include/asm/bios_ebda.h')
| -rw-r--r-- | arch/x86/include/asm/bios_ebda.h | 28 | 
1 files changed, 26 insertions, 2 deletions
diff --git a/arch/x86/include/asm/bios_ebda.h b/arch/x86/include/asm/bios_ebda.h index 3c7521063d3..aa6a3170ab5 100644 --- a/arch/x86/include/asm/bios_ebda.h +++ b/arch/x86/include/asm/bios_ebda.h @@ -4,16 +4,40 @@  #include <asm/io.h>  /* - * there is a real-mode segmented pointer pointing to the - * 4K EBDA area at 0x40E. + * Returns physical address of EBDA.  Returns 0 if there is no EBDA.   */  static inline unsigned int get_bios_ebda(void)  { +	/* +	 * There is a real-mode segmented pointer pointing to the +	 * 4K EBDA area at 0x40E. +	 */  	unsigned int address = *(unsigned short *)phys_to_virt(0x40E);  	address <<= 4;  	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  |