x86_64 boot: extract common part of head32.c and head64.c into head.c
PATCH 4/5 x86_64 boot: extract common part of head32.c and head64.c into head.c
This patch extracts the common part of head32.c and head64.c into head.c.
Signed-off-by Huang Ying <[email protected]>
--- arch/x86/Makefile | 1 arch/x86/kernel/Makefile | 2 - arch/x86/kernel/head.c | 55 ++++++++++++++++++++++++++++++++++++++++++++ arch/x86/kernel/head32.c | 50 ---------------------------------------- arch/x86/kernel/head64.c | 50 ---------------------------------------- include/asm-x86/bios_ebda.h | 2 + 6 files changed, 59 insertions(+), 101 deletions(-)
arch/x86/kernel/head.c new file +55 -0
@@ -0,0 +1,55 @@ +#include <linux/kernel.h> +#include <linux/init.h> + +#include <asm/setup.h> +#include <asm/bios_ebda.h> + +#define BIOS_LOWMEM_KILOBYTES 0x413 + +/* +* The BIOS places the EBDA/XBDA at the top of conventional +* memory, and usually decreases the reported amount of +* conventional memory (int 0x12) too. This also contains a +* workaround for Dell systems that neglect to reserve EBDA. +* The same workaround also avoids a problem with the AMD768MPX +* chipset: reserve a page before VGA to prevent PCI prefetch +* into it (errata #56). Usually the page is reserved anyways, +* unless you have no PS/2 mouse plugged in. +*/ +void __init reserve_ebda_region (void ) +{ +unsigned int lowmem, ebda_addr; + +/* To determine the position of the EBDA and the */ +/* end of conventional memory, we need to look at */ +/* the BIOS data area. In a paravirtual environment */ +/* that area is absent. We'll just have to assume */ +/* that the paravirt case can handle memory setup */ +/* correctly, without our help. */ +if (paravirt_enabled ()) +return ; + +/* end of low (conventional) memory */ + lowmem = *(unsigned short *)__va (BIOS_LOWMEM_KILOBYTES ); + lowmem <<=10 ; + +/* start of EBDA area */ + ebda_addr =get_bios_ebda (); + +/* Fixup: bios puts an EBDA in the top 64K segment */ +/* of conventional memory, but does not adjust lowmem. */ +if ((lowmem - ebda_addr) <=0x10000 ) + lowmem = ebda_addr; + +/* Fixup: bios does not report an EBDA at all. */ +/* Some old Dells seem to need 4k anyhow (bugzilla 2990) */ +if ((ebda_addr ==0 ) && (lowmem >=0x9f000 )) + lowmem =0x9f000 ; + +/* Paranoia: should never happen, but... */ +if ((lowmem ==0 ) || (lowmem >=0x100000 )) + lowmem =0x9f000 ; + +/* reserve all memory between lowmem and the 1MB mark */ +reserve_early (lowmem,0x100000 ,"BIOS reserved" ); +}
arch/x86/kernel/head32.c +0 -50
56 lines not on this page · raw message
arch/x86/kernel/head64.c +0 -50
56 lines not on this page · raw message
arch/x86/kernel/Makefile +1 -1
@@ -2,7 +2,7 @@ # Makefile for the linux kernel. # -extra-y := head_$(BITS).o head$(BITS).o init_task.o vmlinux.lds +extra-y := head_$(BITS).o head$(BITS).o head.o init_task.o vmlinux.lds CPPFLAGS_vmlinux.lds += -U$(UTS_MACHINE)
include/asm-x86/bios_ebda.h +2 -0
@@ -14,4 +14,6 @@ static inline unsigned int get_bios_ebda return address; /* 0 means none */ } +void reserve_ebda_region (void ); +#endif /* _MACH_BIOS_EBDA_H */
arch/x86/Makefile +1 -0
@@ -160,6 +160,7 @@ KBUILD_AFLAGS += $(mflags-y) head-y := arch/x86/kernel/head_$(BITS).o head-y += arch/x86/kernel/head$(BITS).o +head-y += arch/x86/kernel/head.o head-y += arch/x86/kernel/init_task.o libs-y += arch/x86/lib/