Skip to content

Commit

Permalink
x86, realmode: realmode.bin infrastructure
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Jarkko Sakkinen authored and H. Peter Anvin committed May 8, 2012
1 parent 433de73 commit b3266bd
Show file tree
Hide file tree
Showing 7 changed files with 189 additions and 1 deletion.
2 changes: 1 addition & 1 deletion arch/x86/Kbuild
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@

obj-$(CONFIG_KVM) += kvm/

# Xen paravirtualization support
Expand All @@ -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/

Expand Down
20 changes: 20 additions & 0 deletions arch/x86/realmode/Makefile
Original file line number Diff line number Diff line change
@@ -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 changes: 3 additions & 0 deletions arch/x86/realmode/rm/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
pasyms.h
realmode.lds
realmode.relocs
63 changes: 63 additions & 0 deletions arch/x86/realmode/rm/Makefile
Original file line number Diff line number Diff line change
@@ -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 changes: 16 additions & 0 deletions arch/x86/realmode/rm/header.S
Original file line number Diff line number Diff line change
@@ -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 changes: 68 additions & 0 deletions arch/x86/realmode/rm/realmode.lds.S
Original file line number Diff line number Diff line change
@@ -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 changes: 18 additions & 0 deletions arch/x86/realmode/rmpiggy.S
Original file line number Diff line number Diff line change
@@ -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)

0 comments on commit b3266bd

Please sign in to comment.