aboutsummaryrefslogtreecommitdiffstats
path: root/arch
diff options
context:
space:
mode:
Diffstat (limited to 'arch')
-rw-r--r--arch/x86/Kbuild2
-rw-r--r--arch/x86/realmode/Makefile20
-rw-r--r--arch/x86/realmode/rm/.gitignore3
-rw-r--r--arch/x86/realmode/rm/Makefile63
-rw-r--r--arch/x86/realmode/rm/header.S16
-rw-r--r--arch/x86/realmode/rm/realmode.lds.S68
-rw-r--r--arch/x86/realmode/rmpiggy.S18
7 files changed, 189 insertions, 1 deletions
diff --git a/arch/x86/Kbuild b/arch/x86/Kbuild
index 0e9dec6cadd..e5287d8517a 100644
--- a/arch/x86/Kbuild
+++ b/arch/x86/Kbuild
@@ -1,4 +1,3 @@
1
2obj-$(CONFIG_KVM) += kvm/ 1obj-$(CONFIG_KVM) += kvm/
3 2
4# Xen paravirtualization support 3# Xen paravirtualization support
@@ -7,6 +6,7 @@ obj-$(CONFIG_XEN) += xen/
7# lguest paravirtualization support 6# lguest paravirtualization support
8obj-$(CONFIG_LGUEST_GUEST) += lguest/ 7obj-$(CONFIG_LGUEST_GUEST) += lguest/
9 8
9obj-y += realmode/
10obj-y += kernel/ 10obj-y += kernel/
11obj-y += mm/ 11obj-y += mm/
12 12
diff --git a/arch/x86/realmode/Makefile b/arch/x86/realmode/Makefile
new file mode 100644
index 00000000000..f22a4f8d99d
--- /dev/null
+++ b/arch/x86/realmode/Makefile
@@ -0,0 +1,20 @@
1#
2# arch/x86/realmode/Makefile
3#
4# This file is subject to the terms and conditions of the GNU General Public
5# License. See the file "COPYING" in the main directory of this archive
6# for more details.
7#
8#
9
10subdir- := rm
11
12obj-y += rmpiggy.o
13
14$(obj)/rmpiggy.o: $(obj)/rm/realmode.relocs $(obj)/rm/realmode.bin
15
16$(obj)/rm/realmode.bin: FORCE
17 $(Q)$(MAKE) $(build)=$(obj)/rm $@
18
19$(obj)/rm/realmode.relocs: FORCE
20 $(Q)$(MAKE) $(build)=$(obj)/rm $@
diff --git a/arch/x86/realmode/rm/.gitignore b/arch/x86/realmode/rm/.gitignore
new file mode 100644
index 00000000000..b6ed3a2555c
--- /dev/null
+++ b/arch/x86/realmode/rm/.gitignore
@@ -0,0 +1,3 @@
1pasyms.h
2realmode.lds
3realmode.relocs
diff --git a/arch/x86/realmode/rm/Makefile b/arch/x86/realmode/rm/Makefile
new file mode 100644
index 00000000000..7c3f202cbcc
--- /dev/null
+++ b/arch/x86/realmode/rm/Makefile
@@ -0,0 +1,63 @@
1#
2# arch/x86/realmode/Makefile
3#
4# This file is subject to the terms and conditions of the GNU General Public
5# License. See the file "COPYING" in the main directory of this archive
6# for more details.
7#
8#
9
10subdir- := wakeup
11
12always := realmode.bin
13
14realmode-y += header.o
15
16targets += $(realmode-y)
17
18REALMODE_OBJS = $(addprefix $(obj)/,$(realmode-y))
19
20sed-pasyms := -n -r -e 's/^([0-9a-fA-F]+) [ABCDGRSTVW] (.+)$$/pa_\2 = \2;/p'
21
22quiet_cmd_pasyms = PASYMS $@
23 cmd_pasyms = $(NM) $(filter-out FORCE,$^) | \
24 sed $(sed-pasyms) | sort | uniq > $@
25
26$(obj)/pasyms.h: $(REALMODE_OBJS) FORCE
27 $(call if_changed,pasyms)
28
29$(obj)/realmode.lds: $(obj)/pasyms.h
30
31LDFLAGS_realmode.elf := --emit-relocs -T
32CPPFLAGS_realmode.lds += -P -C -I$(obj)
33
34$(obj)/realmode.elf: $(obj)/realmode.lds $(REALMODE_OBJS) FORCE
35 $(call if_changed,ld)
36
37OBJCOPYFLAGS_realmode.bin := -O binary
38
39$(obj)/realmode.bin: $(obj)/realmode.elf
40 $(call if_changed,objcopy)
41
42quiet_cmd_relocs = RELOCS $@
43 cmd_relocs = scripts/x86-relocs --realmode $< > $@
44$(obj)/realmode.relocs: $(obj)/realmode.elf FORCE
45 $(call if_changed,relocs)
46
47# ---------------------------------------------------------------------------
48
49# How to compile the 16-bit code. Note we always compile for -march=i386,
50# that way we can complain to the user if the CPU is insufficient.
51KBUILD_CFLAGS := $(LINUXINCLUDE) -m32 -g -Os -D_SETUP -D__KERNEL__ \
52 -DDISABLE_BRANCH_PROFILING \
53 -Wall -Wstrict-prototypes \
54 -march=i386 -mregparm=3 \
55 -include $(srctree)/$(src)/../../boot/code16gcc.h \
56 -fno-strict-aliasing -fomit-frame-pointer \
57 $(call cc-option, -ffreestanding) \
58 $(call cc-option, -fno-toplevel-reorder,\
59 $(call cc-option, -fno-unit-at-a-time)) \
60 $(call cc-option, -fno-stack-protector) \
61 $(call cc-option, -mpreferred-stack-boundary=2)
62KBUILD_AFLAGS := $(KBUILD_CFLAGS) -D__ASSEMBLY__
63GCOV_PROFILE := n
diff --git a/arch/x86/realmode/rm/header.S b/arch/x86/realmode/rm/header.S
new file mode 100644
index 00000000000..7be17f2c65a
--- /dev/null
+++ b/arch/x86/realmode/rm/header.S
@@ -0,0 +1,16 @@
1/*
2 * Real-mode blob header; this should match realmode.h and be
3 * readonly; for mutable data instead add pointers into the .data
4 * or .bss sections as appropriate.
5 */
6
7#include <linux/linkage.h>
8#include <asm/page_types.h>
9
10 .section ".header", "a"
11
12ENTRY(real_mode_header)
13 .long pa_text_start
14 .long pa_ro_end
15 .long pa_end
16END(real_mode_header)
diff --git a/arch/x86/realmode/rm/realmode.lds.S b/arch/x86/realmode/rm/realmode.lds.S
new file mode 100644
index 00000000000..c5b8a4f31ba
--- /dev/null
+++ b/arch/x86/realmode/rm/realmode.lds.S
@@ -0,0 +1,68 @@
1/*
2 * realmode.lds.S
3 *
4 * Linker script for the real-mode code
5 */
6
7#include <asm/page_types.h>
8
9#undef i386
10
11OUTPUT_FORMAT("elf32-i386", "elf32-i386", "elf32-i386")
12OUTPUT_ARCH(i386)
13
14SECTIONS
15{
16 real_mode_seg = 0;
17
18 . = 0;
19 .header : {
20 pa_real_mode_base = .;
21 *(.header)
22 }
23
24 . = ALIGN(4);
25 .rodata : {
26 *(.rodata)
27 *(.rodata.*)
28 }
29
30 . = ALIGN(PAGE_SIZE);
31 .text : {
32 pa_text_start = .;
33 *(.text)
34 *(.text.*)
35 }
36
37 .text32 : {
38 *(.text32)
39 *(.text32.*)
40 pa_ro_end = .;
41 }
42
43 . = ALIGN(PAGE_SIZE);
44 .data : {
45 *(.data)
46 *(.data.*)
47 }
48
49 . = ALIGN(128);
50 .bss : {
51 *(.bss*)
52 }
53
54 /* End signature for integrity checking */
55 . = ALIGN(4);
56 .signature : {
57 *(.signature)
58 pa_end = .;
59 }
60
61 /DISCARD/ : {
62 *(.note*)
63 *(.debug*)
64 *(.eh_frame*)
65 }
66
67#include "pasyms.h"
68}
diff --git a/arch/x86/realmode/rmpiggy.S b/arch/x86/realmode/rmpiggy.S
new file mode 100644
index 00000000000..6047d7f604c
--- /dev/null
+++ b/arch/x86/realmode/rmpiggy.S
@@ -0,0 +1,18 @@
1/*
2 * Wrapper script for the realmode binary as a transport object
3 * before copying to low memory.
4 */
5#include <linux/linkage.h>
6#include <asm/page_types.h>
7
8 .section ".init.data","aw"
9
10 .balign PAGE_SIZE
11
12ENTRY(real_mode_blob)
13 .incbin "arch/x86/realmode/rm/realmode.bin"
14END(real_mode_blob)
15
16ENTRY(real_mode_relocs)
17 .incbin "arch/x86/realmode/rm/realmode.relocs"
18END(real_mode_relocs)