mirror of
https://github.com/torvalds/linux.git
synced 2024-11-23 12:42:02 +00:00
x86, realmode: realmode.bin infrastructure
Create realmode.bin and realmode.relocs files. Piggy pack them into relocatable object that will be included into .init.data section of the main kernel image. The first file includes binary image of the real-mode code. The latter file includes all relocations. The layout of the binary image is specified in realmode.lds.S. The makefile generates pa_ prefixed symbols for each exported global. These are used in 32-bit code and in realmode header to define symbols that need to be relocated. Signed-off-by: Jarkko Sakkinen <jarkko.sakkinen@intel.com> Link: http://lkml.kernel.org/r/1336501366-28617-3-git-send-email-jarkko.sakkinen@intel.com Originally-by: H. Peter Anvin <hpa@linux.intel.com> Signed-off-by: H. Peter Anvin <hpa@linux.intel.com>
This commit is contained in:
parent
433de739bb
commit
b3266bd6ff
@ -1,4 +1,3 @@
|
||||
|
||||
obj-$(CONFIG_KVM) += kvm/
|
||||
|
||||
# Xen paravirtualization support
|
||||
@ -7,6 +6,7 @@ obj-$(CONFIG_XEN) += xen/
|
||||
# lguest paravirtualization support
|
||||
obj-$(CONFIG_LGUEST_GUEST) += lguest/
|
||||
|
||||
obj-y += realmode/
|
||||
obj-y += kernel/
|
||||
obj-y += mm/
|
||||
|
||||
|
20
arch/x86/realmode/Makefile
Normal file
20
arch/x86/realmode/Makefile
Normal file
@ -0,0 +1,20 @@
|
||||
#
|
||||
# arch/x86/realmode/Makefile
|
||||
#
|
||||
# This file is subject to the terms and conditions of the GNU General Public
|
||||
# License. See the file "COPYING" in the main directory of this archive
|
||||
# for more details.
|
||||
#
|
||||
#
|
||||
|
||||
subdir- := rm
|
||||
|
||||
obj-y += rmpiggy.o
|
||||
|
||||
$(obj)/rmpiggy.o: $(obj)/rm/realmode.relocs $(obj)/rm/realmode.bin
|
||||
|
||||
$(obj)/rm/realmode.bin: FORCE
|
||||
$(Q)$(MAKE) $(build)=$(obj)/rm $@
|
||||
|
||||
$(obj)/rm/realmode.relocs: FORCE
|
||||
$(Q)$(MAKE) $(build)=$(obj)/rm $@
|
3
arch/x86/realmode/rm/.gitignore
vendored
Normal file
3
arch/x86/realmode/rm/.gitignore
vendored
Normal file
@ -0,0 +1,3 @@
|
||||
pasyms.h
|
||||
realmode.lds
|
||||
realmode.relocs
|
63
arch/x86/realmode/rm/Makefile
Normal file
63
arch/x86/realmode/rm/Makefile
Normal file
@ -0,0 +1,63 @@
|
||||
#
|
||||
# arch/x86/realmode/Makefile
|
||||
#
|
||||
# This file is subject to the terms and conditions of the GNU General Public
|
||||
# License. See the file "COPYING" in the main directory of this archive
|
||||
# for more details.
|
||||
#
|
||||
#
|
||||
|
||||
subdir- := wakeup
|
||||
|
||||
always := realmode.bin
|
||||
|
||||
realmode-y += header.o
|
||||
|
||||
targets += $(realmode-y)
|
||||
|
||||
REALMODE_OBJS = $(addprefix $(obj)/,$(realmode-y))
|
||||
|
||||
sed-pasyms := -n -r -e 's/^([0-9a-fA-F]+) [ABCDGRSTVW] (.+)$$/pa_\2 = \2;/p'
|
||||
|
||||
quiet_cmd_pasyms = PASYMS $@
|
||||
cmd_pasyms = $(NM) $(filter-out FORCE,$^) | \
|
||||
sed $(sed-pasyms) | sort | uniq > $@
|
||||
|
||||
$(obj)/pasyms.h: $(REALMODE_OBJS) FORCE
|
||||
$(call if_changed,pasyms)
|
||||
|
||||
$(obj)/realmode.lds: $(obj)/pasyms.h
|
||||
|
||||
LDFLAGS_realmode.elf := --emit-relocs -T
|
||||
CPPFLAGS_realmode.lds += -P -C -I$(obj)
|
||||
|
||||
$(obj)/realmode.elf: $(obj)/realmode.lds $(REALMODE_OBJS) FORCE
|
||||
$(call if_changed,ld)
|
||||
|
||||
OBJCOPYFLAGS_realmode.bin := -O binary
|
||||
|
||||
$(obj)/realmode.bin: $(obj)/realmode.elf
|
||||
$(call if_changed,objcopy)
|
||||
|
||||
quiet_cmd_relocs = RELOCS $@
|
||||
cmd_relocs = scripts/x86-relocs --realmode $< > $@
|
||||
$(obj)/realmode.relocs: $(obj)/realmode.elf FORCE
|
||||
$(call if_changed,relocs)
|
||||
|
||||
# ---------------------------------------------------------------------------
|
||||
|
||||
# How to compile the 16-bit code. Note we always compile for -march=i386,
|
||||
# that way we can complain to the user if the CPU is insufficient.
|
||||
KBUILD_CFLAGS := $(LINUXINCLUDE) -m32 -g -Os -D_SETUP -D__KERNEL__ \
|
||||
-DDISABLE_BRANCH_PROFILING \
|
||||
-Wall -Wstrict-prototypes \
|
||||
-march=i386 -mregparm=3 \
|
||||
-include $(srctree)/$(src)/../../boot/code16gcc.h \
|
||||
-fno-strict-aliasing -fomit-frame-pointer \
|
||||
$(call cc-option, -ffreestanding) \
|
||||
$(call cc-option, -fno-toplevel-reorder,\
|
||||
$(call cc-option, -fno-unit-at-a-time)) \
|
||||
$(call cc-option, -fno-stack-protector) \
|
||||
$(call cc-option, -mpreferred-stack-boundary=2)
|
||||
KBUILD_AFLAGS := $(KBUILD_CFLAGS) -D__ASSEMBLY__
|
||||
GCOV_PROFILE := n
|
16
arch/x86/realmode/rm/header.S
Normal file
16
arch/x86/realmode/rm/header.S
Normal file
@ -0,0 +1,16 @@
|
||||
/*
|
||||
* Real-mode blob header; this should match realmode.h and be
|
||||
* readonly; for mutable data instead add pointers into the .data
|
||||
* or .bss sections as appropriate.
|
||||
*/
|
||||
|
||||
#include <linux/linkage.h>
|
||||
#include <asm/page_types.h>
|
||||
|
||||
.section ".header", "a"
|
||||
|
||||
ENTRY(real_mode_header)
|
||||
.long pa_text_start
|
||||
.long pa_ro_end
|
||||
.long pa_end
|
||||
END(real_mode_header)
|
68
arch/x86/realmode/rm/realmode.lds.S
Normal file
68
arch/x86/realmode/rm/realmode.lds.S
Normal file
@ -0,0 +1,68 @@
|
||||
/*
|
||||
* realmode.lds.S
|
||||
*
|
||||
* Linker script for the real-mode code
|
||||
*/
|
||||
|
||||
#include <asm/page_types.h>
|
||||
|
||||
#undef i386
|
||||
|
||||
OUTPUT_FORMAT("elf32-i386", "elf32-i386", "elf32-i386")
|
||||
OUTPUT_ARCH(i386)
|
||||
|
||||
SECTIONS
|
||||
{
|
||||
real_mode_seg = 0;
|
||||
|
||||
. = 0;
|
||||
.header : {
|
||||
pa_real_mode_base = .;
|
||||
*(.header)
|
||||
}
|
||||
|
||||
. = ALIGN(4);
|
||||
.rodata : {
|
||||
*(.rodata)
|
||||
*(.rodata.*)
|
||||
}
|
||||
|
||||
. = ALIGN(PAGE_SIZE);
|
||||
.text : {
|
||||
pa_text_start = .;
|
||||
*(.text)
|
||||
*(.text.*)
|
||||
}
|
||||
|
||||
.text32 : {
|
||||
*(.text32)
|
||||
*(.text32.*)
|
||||
pa_ro_end = .;
|
||||
}
|
||||
|
||||
. = ALIGN(PAGE_SIZE);
|
||||
.data : {
|
||||
*(.data)
|
||||
*(.data.*)
|
||||
}
|
||||
|
||||
. = ALIGN(128);
|
||||
.bss : {
|
||||
*(.bss*)
|
||||
}
|
||||
|
||||
/* End signature for integrity checking */
|
||||
. = ALIGN(4);
|
||||
.signature : {
|
||||
*(.signature)
|
||||
pa_end = .;
|
||||
}
|
||||
|
||||
/DISCARD/ : {
|
||||
*(.note*)
|
||||
*(.debug*)
|
||||
*(.eh_frame*)
|
||||
}
|
||||
|
||||
#include "pasyms.h"
|
||||
}
|
18
arch/x86/realmode/rmpiggy.S
Normal file
18
arch/x86/realmode/rmpiggy.S
Normal file
@ -0,0 +1,18 @@
|
||||
/*
|
||||
* Wrapper script for the realmode binary as a transport object
|
||||
* before copying to low memory.
|
||||
*/
|
||||
#include <linux/linkage.h>
|
||||
#include <asm/page_types.h>
|
||||
|
||||
.section ".init.data","aw"
|
||||
|
||||
.balign PAGE_SIZE
|
||||
|
||||
ENTRY(real_mode_blob)
|
||||
.incbin "arch/x86/realmode/rm/realmode.bin"
|
||||
END(real_mode_blob)
|
||||
|
||||
ENTRY(real_mode_relocs)
|
||||
.incbin "arch/x86/realmode/rm/realmode.relocs"
|
||||
END(real_mode_relocs)
|
Loading…
Reference in New Issue
Block a user