* [PATCH] kexec x86_64: Make purgatory relocatable anywhere in the 64bit address space.
@ 2012-11-19 16:56 Eric W. Biederman
2012-11-21 0:16 ` Simon Horman
2012-12-03 20:34 ` Yinghai Lu
0 siblings, 2 replies; 9+ messages in thread
From: Eric W. Biederman @ 2012-11-19 16:56 UTC (permalink / raw)
To: Simon Horman; +Cc: Yinghai Lu, Kexec Mailing List
Remove kexec/arch/i386/compat_x6_64.S
purgatory/arch/i386/linux-entry16.S and purgatory/arch/i386/entry16.S
Those were early attempts at entry32-16.S that should have been
deleted long ago.
Strip the purgatory code of debug symbols. There is no need to carry
debug symbols we will never use around in /sbin/kexec.
On x86_64 use -mcmodel=large so that the code is built without
any 32bit assumptions. -mcmodel=medium and -mcmodel=small
result int code that has 32bit relocations against variables
that can live anywhere in the address space
Modify the assembly in entry64.S and setup-x86_64.S to use %rip
relative addressing of variables so no relocates are emitted.
Modify entry64-32.S so that it does not have any relocations that can
not be processed when purgatory is loaded above 4G. entry64-32.S
jumps to a 32bit entry point and can not itself be used above 4G so
these changes merely prevent it from being a problem in the other case.
eip is modifed to be a 64bit value of which only the low 32bits are
exported outside of entry64-32.S
The long mode exit code is modified to run with a %cs value whose
base address is the address of the symbol entry32. From there
all of the 32bit code in entry64-32.S can read variables by reading
them through %cs. Until the final jump to the the target address
which is made a far jump reloading %cs and the intstruction pointer.
Modify entry32-16.S and entry32-16-debug.S to be position independent
32bit code. At their start make a short call to push the current value
of %eip on the stack and pop it off. Allowing the calculation of the
address of entry16 which the code has always kept in %ebx.
Update the pointer to the gdt in the gdt so that lgdt will work.
Modify the instructions in entry32-16.S and entry32-16-debug.S so
that the 32bit code uses offsets from %ebx which points at entry16.
Tested-by: Yinghai Lu <yinghai@kernel.org>
Signed-off-by: "Eric W. Biederman" <ebiederm@xmission.com>
---
kexec/arch/i386/compat_x86_64.S | 131 -------
purgatory/Makefile | 1 +
purgatory/arch/i386/entry16.S | 160 --------
purgatory/arch/i386/entry32-16-debug.S | 25 +-
purgatory/arch/i386/entry32-16.S | 25 +-
purgatory/arch/i386/linux-entry16.S | 623 --------------------------------
purgatory/arch/x86_64/Makefile | 4 +-
purgatory/arch/x86_64/entry64-32.S | 68 +++-
purgatory/arch/x86_64/entry64.S | 5 +-
purgatory/arch/x86_64/setup-x86_64.S | 4 +-
10 files changed, 88 insertions(+), 958 deletions(-)
delete mode 100644 kexec/arch/i386/compat_x86_64.S
delete mode 100644 purgatory/arch/i386/entry16.S
delete mode 100644 purgatory/arch/i386/linux-entry16.S
diff --git a/kexec/arch/i386/compat_x86_64.S b/kexec/arch/i386/compat_x86_64.S
deleted file mode 100644
index f8a04e9..0000000
--- a/kexec/arch/i386/compat_x86_64.S
+++ /dev/null
@@ -1,131 +0,0 @@
-/*
- * kexec: Linux boots Linux
- *
- * Copyright (C) 2003,2004,2005 Eric Biederman (ebiederm@xmission.com)
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation (version 2 of the License).
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- */
-
-#define USE_LRET 0
-
-.data
- .equ MSR_K6_EFER, 0xC0000080
- .equ EFER_LME, 0x00000100
- .equ X86_CR4_PAE, 0x00000020
- .equ CR0_PG, 0x80000000
-
- .globl compat_x86_64, compat_x86_64_size, compat_x86_64_entry32
- .code64
- .balign 16
-compat_x86_64:
- /* Compute where I am running at */
- leaq compat_x86_64(%rip), %rbx
-
- /* Relocate the code */
- addq %rbx, gdt_addr(%rip)
-#if !USE_LRET
- addl %ebx, lm_exit_addr(%rip)
-#endif
-
- /* Lookup the 32bit start address */
- movl compat_x86_64_entry32(%rip), %ebx
- pushq %rbx
-
-#if USE_LRET
- /* Push the 64bit start address */
- pushq $0x10
- pushq lm_exit(%rip)
-#endif
-
- /* This also acts as a serializing instruction ensuring
- * my self modifying code works.
- */
- lgdt gdt(%rip)
-
-#if USE_LRET
- lret
-#else
- /* Switch to 32bit compatiblity mode */
- ljmp *lm_exit_addr(%rip)
-#endif
-lm_exit:
- .code32
-
- /* Disable paging */
- movl %cr0, %eax
- andl $~CR0_PG, %eax
- movl %eax, %cr0
-
- /* Disable long mode */
- movl $MSR_K6_EFER, %ecx
- rdmsr
- andl $~EFER_LME, %eax
- wrmsr
-
- /* Disable PAE */
- xorl %eax, %eax
- movl %eax, %cr4
-
- /* load the data segments */
- movl $0x18, %eax /* data segment */
- movl %eax, %ds
- movl %eax, %es
- movl %eax, %ss
- movl %eax, %fs
- movl %eax, %gs
-
- /* Remove the 32 bits of the 64 bit start address */
- popl %eax
-
- /* set all of the registers to known values */
- /* leave %esp alone */
-
- xorl %eax, %eax
- xorl %ebx, %ebx
- xorl %ecx, %ecx
- xorl %edx, %edx
- xorl %esi, %esi
- xorl %edi, %edi
- xorl %ebp, %ebp
-
- ret
-
- .balign 16
-gdt: /* 0x00 unusable segment
- * 0x08 unused
- * so use them as the gdt ptr
- */
- .word gdt_end - gdt - 1
-gdt_addr:
- .quad gdt - compat_x86_64
- .word 0, 0, 0
-
- /* 0x10 4GB flat code segment */
- .word 0xFFFF, 0x0000, 0x9A00, 0x00CF
- /* 0x18 4GB flat data segment */
- .word 0xFFFF, 0x0000, 0x9200, 0x00CF
-gdt_end:
-
-#if !USE_LRET
-lm_exit_addr:
- .long lm_exit - compat_x86_64
- .long 0x10
-#endif
-
-compat_x86_64_entry32:
- .long 0
-
-compat_x86_64_end:
-compat_x86_64_size:
- .long compat_x86_64_end - compat_x86_64
diff --git a/purgatory/Makefile b/purgatory/Makefile
index ee1679c..e39adec 100644
--- a/purgatory/Makefile
+++ b/purgatory/Makefile
@@ -64,6 +64,7 @@ $(PURGATORY): $(PURGATORY_OBJS)
$(CC) $(CFLAGS) $(LDFLAGS) -o $@ $^
# $(LD) $(LDFLAGS) $(EXTRA_LDFLAGS) --no-undefined -e purgatory_start -r -o $@ $(PURGATORY_OBJS) $(UTIL_LIB)
+ $(STRIP) --strip-debug $@
echo::
@echo "PURGATORY_SRCS $(PURGATORY_SRCS)"
diff --git a/purgatory/arch/i386/entry16.S b/purgatory/arch/i386/entry16.S
deleted file mode 100644
index c4a3dad..0000000
--- a/purgatory/arch/i386/entry16.S
+++ /dev/null
@@ -1,160 +0,0 @@
-/*
- * kexec: Linux boots Linux
- *
- * Copyright (C) 2003,2004 Eric Biederman (ebiederm@xmission.com)
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation (version 2 of the License).
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- */
-
-#undef i386
- .text
- .globl entry16, entry16_regs
- .arch i386
- .balign 16
-entry16:
- .code32
- /* Compute where I am running at */
- movl $entry16, %ebx
-
- /* Fixup my real mode segment */
- movl %ebx, %eax
- shrl $4, %eax
- movw %ax, 2 + realptr
-
- /* Fixup the gdt */
- movl %ebx, %eax
- shll $16, %eax
-
- movl %ebx, %ecx
- shrl $16, %ecx
- andl $0xff, %ecx
-
- movl %ebx, %edx
- andl $0xff000000, %edx
- orl %edx, %ecx
-
- orl %eax, 0x08 + gdt
- orl %ecx, 0x0c + gdt
- orl %eax, 0x10 + gdt
- orl %ecx, 0x14 + gdt
-
-
- /* Setup the classic BIOS interrupt table at 0x0 */
- lidt idtptr
-
- /* Provide us with 16bit segments that we can use */
- lgdt gdt
-
- /* Note we don't disable the a20 line, (this shouldn't be required)
- * The code to do it is in kexec_test and it is a real pain.
- * I will worry about that when I need it.
- */
-
- /* Load 16bit data segments, to ensure the segment limits are set */
- movl $0x10, %eax
- movl %eax, %ds
- movl %eax, %es
- movl %eax, %ss
- movl %eax, %fs
- movl %eax, %gs
-
- /* switch to 16bit mode */
- ljmp $0x08, $1f - entry16
-1:
- .code16
- /* Disable Paging and protected mode */
- /* clear the PG & PE bits of CR0 */
- movl %cr0,%eax
- andl $~((1 << 31)|(1<<0)),%eax
- movl %eax,%cr0
-
- /* make intersegment jmp to flush the processor pipeline
- * and reload %cs:%eip (to clear upper 16 bits of %eip).
- */
- ljmp *(realptr - entry16)
-3:
- /* we are in real mode now
- * set up the real mode segment registers : %ds, $ss, %es
- */
- /* Setup the data segment */
- movw %cs, %ax
- movw %ax, %ds
-
- /* Load the registers */
- movl eax - entry16, %eax
- movl ebx - entry16, %ebx
- movl ecx - entry16, %ecx
- movl edx - entry16, %edx
- movl esi - entry16, %esi
- movl edi - entry16, %esi
- movl esp - entry16, %esp
- movl ebp - entry16, %ebp
- movw es - entry16, %es
- movw ss - entry16, %ss
- movw fs - entry16, %fs
- movw gs - entry16, %gs
- movw ds - entry16, %ds
-
- /* Jump to the kernel entrypoint */
- ljmp %cs:*(realdest - entry16)
-
- .balign 4
-entry16_regs:
-eax: .long 0x00000000
-ebx: .long 0x00000000
-ecx: .long 0x00000000
-edx: .long 0x00000000
-esi: .long 0x00000000
-edi: .long 0x00000000
-esp: .long 0x00000000
-ebp: .long 0x00000000
-ds: .word 0x0000
-es: .word 0x0000
-ss: .word 0x0000
-fs: .word 0x0000
-gs: .word 0x0000
-realdest:
-ip: .word 0x0000
-cs: .word 0x0000
-pad: .word 0x0000
- .size entry16_regs, . - entry16_regs
-
- .balign 16
-realptr:
- .word 3b - entry16
- .word 0x0000
-
- .data
- .balign 16
-
-idtptr:
- /* 256 entry idt at 0 */
- .word 0x400 - 1
- .word 0, 0
-
- .balign 16
-gdt:
- /* 0x00 unusable segment so used as the gdt ptr */
- .word gdt_end - gdt - 1
- .long gdt
- .word 0
-
- /* 0x08 16 bit real mode code segment */
- .word 0xffff, 0x0000
- .byte 0x00, 0x9b, 0x00, 0x00
-
- /* 0x10 16 bit real mode data segment */
- .word 0xffff, 0x0000
- .byte 0x00, 0x93, 0x00, 0x00
-gdt_end:
diff --git a/purgatory/arch/i386/entry32-16-debug.S b/purgatory/arch/i386/entry32-16-debug.S
index 82b58ca..5167944 100644
--- a/purgatory/arch/i386/entry32-16-debug.S
+++ b/purgatory/arch/i386/entry32-16-debug.S
@@ -29,15 +29,20 @@
.balign 16
entry16_debug:
.code32
- /* Compute where I am running at */
- movl $entry16_debug, %ebx
+ /* Compute where I am running at (assumes esp valid) */
+ call 1f
+1: popl %ebx
+ subl $(1b - entry16_debug), %ebx
/* Fixup my real mode segment */
movl %ebx, %eax
shrl $4, %eax
- movw %ax, 2 + realptr
+ movw %ax, (2 + realptr - entry16_debug)(%ebx)
/* Fixup the gdt */
+ leal (gdt - entry16_debug)(%ebx), %eax
+ movl %eax, (0x02 + gdt - entry16_debug)(%ebx)
+
movl %ebx, %eax
shll $16, %eax
@@ -49,19 +54,19 @@ entry16_debug:
andl $0xff000000, %edx
orl %edx, %ecx
- orl %eax, 0x08 + gdt
- orl %ecx, 0x0c + gdt
- orl %eax, 0x10 + gdt
- orl %ecx, 0x14 + gdt
+ orl %eax, (0x08 + gdt - entry16_debug)(%ebx)
+ orl %ecx, (0x0c + gdt - entry16_debug)(%ebx)
+ orl %eax, (0x10 + gdt - entry16_debug)(%ebx)
+ orl %ecx, (0x14 + gdt - entry16_debug)(%ebx)
DEBUG_CHAR('a')
/* Setup the classic BIOS interrupt table at 0x0 */
- lidt idtptr
+ lidt (idtptr - entry16_debug)(%ebx)
DEBUG_CHAR('b')
/* Provide us with 16bit segments that we can use */
- lgdt gdt
+ lgdt (gdt - entry16_debug)(%ebx)
DEBUG_CHAR('c')
/* Note we don't disable the a20 line, (this shouldn't be required)
@@ -160,7 +165,7 @@ idtptr:
gdt:
/* 0x00 unusable segment so used as the gdt ptr */
.word gdt_end - gdt - 1
- .long gdt
+ .long 0 /* gdt */
.word 0
/* 0x08 16 bit real mode code segment */
diff --git a/purgatory/arch/i386/entry32-16.S b/purgatory/arch/i386/entry32-16.S
index aaf1273..c051aab 100644
--- a/purgatory/arch/i386/entry32-16.S
+++ b/purgatory/arch/i386/entry32-16.S
@@ -24,15 +24,20 @@
.balign 16
entry16:
.code32
- /* Compute where I am running at */
- movl $entry16, %ebx
+ /* Compute where I am running at (assumes esp valid) */
+ call 1f
+1: popl %ebx
+ subl $(1b - entry16), %ebx
/* Fixup my real mode segment */
movl %ebx, %eax
shrl $4, %eax
- movw %ax, 2 + realptr
+ movw %ax, (2 + realptr - entry16)(%ebx)
/* Fixup the gdt */
+ leal (gdt - entry16)(%ebx), %eax
+ movl %eax, (0x02 + gdt - entry16)(%ebx)
+
movl %ebx, %eax
shll $16, %eax
@@ -44,17 +49,17 @@ entry16:
andl $0xff000000, %edx
orl %edx, %ecx
- orl %eax, 0x08 + gdt
- orl %ecx, 0x0c + gdt
- orl %eax, 0x10 + gdt
- orl %ecx, 0x14 + gdt
+ orl %eax, (0x08 + gdt - entry16)(%ebx)
+ orl %ecx, (0x0c + gdt - entry16)(%ebx)
+ orl %eax, (0x10 + gdt - entry16)(%ebx)
+ orl %ecx, (0x14 + gdt - entry16)(%ebx)
/* Setup the classic BIOS interrupt table at 0x0 */
- lidt idtptr
+ lidt (idtptr - entry16)(%ebx)
/* Provide us with 16bit segments that we can use */
- lgdt gdt
+ lgdt (gdt - entry16)(%ebx)
/* Note we don't disable the a20 line, (this shouldn't be required)
* The code to do it is in kexec_test and it is a real pain.
@@ -147,7 +152,7 @@ idtptr:
gdt:
/* 0x00 unusable segment so used as the gdt ptr */
.word gdt_end - gdt - 1
- .long gdt
+ .long 0 /* gdt */
.word 0
/* 0x08 16 bit real mode code segment */
diff --git a/purgatory/arch/i386/linux-entry16.S b/purgatory/arch/i386/linux-entry16.S
deleted file mode 100644
index 7ab0b2a..0000000
--- a/purgatory/arch/i386/linux-entry16.S
+++ /dev/null
@@ -1,623 +0,0 @@
-/*
- * kexec: Linux boots Linux
- *
- * Copyright (C) 2003,2004 Eric Biederman (ebiederm@xmission.com)
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation (version 2 of the License).
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- */
-
-#if 1
-#define TTYS0_BASE 0x3f8
-#define TTYS0_RBR (TTYS0_BASE+0x00)
-#define TTYS0_TBR TTYS0_RBR
-#define TTYS0_LSR (TTYS0_BASE+0x05)
-
-
- /* uses: ax, dx */
-#define TTYS0_TX_AL \
- mov %al, %ah ; \
-9: mov $TTYS0_LSR, %dx ; \
- inb %dx, %al ; \
- test $0x20, %al ; \
- je 9b ; \
- mov $TTYS0_TBR, %dx ; \
- mov %ah, %al ; \
- outb %al, %dx ; \
-9: mov $TTYS0_LSR, %dx ; \
- inb %dx, %al ; \
- test $0x40, %al ; \
- jz 9b
-
-
-
- /* uses: ax, dx */
-#define TTYS0_TX_CHAR(byte) \
- mov byte, %al ; \
- TTYS0_TX_AL
-
- /* uses: ax, dx */
-#define TTYS0_TX_HEX32(lword) \
- mov lword, %eax ; \
- shr $28, %eax ; \
- add $'0', %al ; \
- cmp $'9', %al ; \
- jle 9f ; \
- add $39, %al ; \
-9: ; \
- TTYS0_TX_AL ; \
- ; \
- mov lword, %eax ; \
- shr $24, %eax ; \
- and $0x0f, %al ; \
- add $'0', %al ; \
- cmp $'9', %al ; \
- jle 9f ; \
- add $39, %al ; \
-9: ; \
- TTYS0_TX_AL ; \
- ; \
- mov lword, %eax ; \
- shr $20, %eax ; \
- and $0x0f, %al ; \
- add $'0', %al ; \
- cmp $'9', %al ; \
- jle 9f ; \
- add $39, %al ; \
-9: ; \
- TTYS0_TX_AL ; \
- ; \
- mov lword, %eax ; \
- shr $16, %eax ; \
- and $0x0f, %al ; \
- add $'0', %al ; \
- cmp $'9', %al ; \
- jle 9f ; \
- add $39, %al ; \
-9: ; \
- TTYS0_TX_AL ; \
- ; \
- mov lword, %eax ; \
- shr $12, %eax ; \
- and $0x0f, %al ; \
- add $'0', %al ; \
- cmp $'9', %al ; \
- jle 9f ; \
- add $39, %al ; \
-9: ; \
- TTYS0_TX_AL ; \
- ; \
- mov lword, %eax ; \
- shr $8, %eax ; \
- and $0x0f, %al ; \
- add $'0', %al ; \
- cmp $'9', %al ; \
- jle 9f ; \
- add $39, %al ; \
-9: ; \
- TTYS0_TX_AL ; \
- ; \
- mov lword, %eax ; \
- shr $4, %eax ; \
- and $0x0f, %al ; \
- add $'0', %al ; \
- cmp $'9', %al ; \
- jle 9f ; \
- add $39, %al ; \
-9: ; \
- TTYS0_TX_AL ; \
- ; \
- mov lword, %eax ; \
- and $0x0f, %al ; \
- add $'0', %al ; \
- cmp $'9', %al ; \
- jle 9f ; \
- add $39, %al ; \
-9: ; \
- TTYS0_TX_AL
-
-
-#define DEBUG_CHAR(x) TTYS0_TX_CHAR($x) ; TTYS0_TX_CHAR($'\r') ; TTYS0_TX_CHAR($'\n')
-#define DEBUG_TX_HEX32(x) TTYS0_TX_HEX32(x) ; TTYS0_TX_CHAR($'\r') ; TTYS0_TX_CHAR($'\n')
-#else
-#define DEBUG_CHAR(x)
-#define DEBUG_TX_HEX32(x)
-#endif
-
-#undef i386
- .text
- .globl entry16, entry16_regs
- .arch i386
- .balign 16
-entry16:
- .code32
-
-DEBUG_CHAR('a')
- /* Setup the classic BIOS interrupt table at 0x0 */
- lidt idtptr
-
-DEBUG_CHAR('b')
- /* Provide us with 16bit segments that we can use */
- lgdt gdt
-
-DEBUG_CHAR('c')
- /* Note we don't disable the a20 line, (this shouldn't be required)
- * The code to do it is in kexec_test and it is a real pain.
- * I will worry about that when I need it.
- */
-
- /* Load 16bit data segments, to ensure the segment limits are set */
- movl $0x10, %eax
- movl %eax, %ds
- movl %eax, %es
- movl %eax, %ss
- movl %eax, %fs
- movl %eax, %gs
-
-DEBUG_CHAR('d')
-
- /* switch to 16bit mode */
- ljmp $0x08, $1f - entry16
-1:
- .code16
-DEBUG_CHAR('e')
- /* Disable Paging and protected mode */
- /* clear the PG & PE bits of CR0 */
- movl %cr0,%eax
- andl $~((1 << 31)|(1<<0)),%eax
- movl %eax,%cr0
-
-DEBUG_CHAR('f')
- /* make intersegment jmp to flush the processor pipeline
- * and reload %cs:%eip (to clear upper 16 bits of %eip).
- */
- ljmp *(realptr - entry16)
-3:
-DEBUG_CHAR('g')
- /* we are in real mode now
- * set up the real mode segment registers : %ds, $ss, %es
- */
- /* Setup the data segment */
- movw %cs, %ax
- movw %ax, %ds
-
-DEBUG_CHAR('h')
- /* Load the registers */
- movl eax - entry16, %eax
- movl ebx - entry16, %ebx
- movl ecx - entry16, %ecx
- movl edx - entry16, %edx
- movl esi - entry16, %esi
- movl edi - entry16, %esi
- movl esp - entry16, %esp
- movl ebp - entry16, %ebp
- movw es - entry16, %es
- movw ss - entry16, %ss
- movw fs - entry16, %fs
- movw gs - entry16, %gs
- movw ds - entry16, %ds
-
- /* Jump to the kernel entrypoint */
- ljmp %cs:*(realdest - entry16)
-
- .balign 4
-entry16_regs:
-eax: .long 0x00000000
-ebx: .long 0x00000000
-ecx: .long 0x00000000
-edx: .long 0x00000000
-esi: .long 0x00000000
-edi: .long 0x00000000
-esp: .long 0x00000000
-ebp: .long 0x00000000
-ds: .word 0x0000
-es: .word 0x0000
-ss: .word 0x0000
-fs: .word 0x0000
-gs: .word 0x0000
-realdest:
-ip: .word 0x0000
-cs: .word 0x0000
- .size entry16_regs, . - entry16_regs
-
- .balign 16
-realptr:
- .word 3b - entry16
- .word 0x0000
-
- .data
- .balign 4
-
-idtptr:
- /* 256 entry idt at 0 */
- .word 0x400 - 1
- .word 0, 0
-
-gdt:
- /* 0x00 unusable segment so used as the gdt ptr */
- .word gdt_end - gdt - 1
- .long gdt
- .word 0
-
- /* 0x08 16 bit real mode code segment */
- .word 0xffff, 0x0000
- .byte 0x00, 0x9b, 0x00, 0x00
-
- /* 0x10 16 bit real mode data segment */
- .word 0xffff, 0x0000
- .byte 0x00, 0x93, 0x00, 0x00
-gdt_end:
-/*
- * kexec: Linux boots Linux
- *
- * Copyright (C) 2003,2004 Eric Biederman (ebiederm@xmission.com)
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation (version 2 of the License).
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- */
-
-#if 1
-#define TTYS0_BASE 0x3f8
-#define TTYS0_RBR (TTYS0_BASE+0x00)
-#define TTYS0_TBR TTYS0_RBR
-#define TTYS0_LSR (TTYS0_BASE+0x05)
-
-
- /* uses: ax, dx */
-#define TTYS0_TX_AL \
- mov %al, %ah ; \
-9: mov $TTYS0_LSR, %dx ; \
- inb %dx, %al ; \
- test $0x20, %al ; \
- je 9b ; \
- mov $TTYS0_TBR, %dx ; \
- mov %ah, %al ; \
- outb %al, %dx ; \
-9: mov $TTYS0_LSR, %dx ; \
- inb %dx, %al ; \
- test $0x40, %al ; \
- jz 9b
-
-
-
- /* uses: ax, dx */
-#define TTYS0_TX_CHAR(byte) \
- mov byte, %al ; \
- TTYS0_TX_AL
-
- /* uses: ax, dx */
-#define TTYS0_TX_HEX32(lword) \
- mov lword, %eax ; \
- shr $28, %eax ; \
- add $'0', %al ; \
- cmp $'9', %al ; \
- jle 9f ; \
- add $39, %al ; \
-9: ; \
- TTYS0_TX_AL ; \
- ; \
- mov lword, %eax ; \
- shr $24, %eax ; \
- and $0x0f, %al ; \
- add $'0', %al ; \
- cmp $'9', %al ; \
- jle 9f ; \
- add $39, %al ; \
-9: ; \
- TTYS0_TX_AL ; \
- ; \
- mov lword, %eax ; \
- shr $20, %eax ; \
- and $0x0f, %al ; \
- add $'0', %al ; \
- cmp $'9', %al ; \
- jle 9f ; \
- add $39, %al ; \
-9: ; \
- TTYS0_TX_AL ; \
- ; \
- mov lword, %eax ; \
- shr $16, %eax ; \
- and $0x0f, %al ; \
- add $'0', %al ; \
- cmp $'9', %al ; \
- jle 9f ; \
- add $39, %al ; \
-9: ; \
- TTYS0_TX_AL ; \
- ; \
- mov lword, %eax ; \
- shr $12, %eax ; \
- and $0x0f, %al ; \
- add $'0', %al ; \
- cmp $'9', %al ; \
- jle 9f ; \
- add $39, %al ; \
-9: ; \
- TTYS0_TX_AL ; \
- ; \
- mov lword, %eax ; \
- shr $8, %eax ; \
- and $0x0f, %al ; \
- add $'0', %al ; \
- cmp $'9', %al ; \
- jle 9f ; \
- add $39, %al ; \
-9: ; \
- TTYS0_TX_AL ; \
- ; \
- mov lword, %eax ; \
- shr $4, %eax ; \
- and $0x0f, %al ; \
- add $'0', %al ; \
- cmp $'9', %al ; \
- jle 9f ; \
- add $39, %al ; \
-9: ; \
- TTYS0_TX_AL ; \
- ; \
- mov lword, %eax ; \
- and $0x0f, %al ; \
- add $'0', %al ; \
- cmp $'9', %al ; \
- jle 9f ; \
- add $39, %al ; \
-9: ; \
- TTYS0_TX_AL
-
-
-#define DEBUG_CHAR(x) TTYS0_TX_CHAR($x) ; TTYS0_TX_CHAR($'\r') ; TTYS0_TX_CHAR($'\n')
-#define DEBUG_TX_HEX32(x) TTYS0_TX_HEX32(x) ; TTYS0_TX_CHAR($'\r') ; TTYS0_TX_CHAR($'\n')
-#else
-#define DEBUG_CHAR(x)
-#define DEBUG_TX_HEX32(x)
-#endif
-
-.data
- .globl setup16_debug_start, setup16_debug_end, setup16_debug_size, setup16_debug_align
- .globl setup16_debug_regs
- .globl setup16_debug_kernel_pre_protected
- .globl setup16_debug_first_code32
- .globl setup16_debug_old_code32
-setup16_debug_start:
-_reloc = .
- .balign 16
- .code32
-DEBUG_CHAR('a')
- /* Compute where I am running at */
- call 1f
-1: popl %ebx
- subl $(1b - _reloc), %ebx
-
- /* Remember where I am running at */
- movl %ebx, location - _reloc(%ebx)
-
-DEBUG_CHAR('b')
- /* Fixup my real mode segment */
- movl %ebx, %eax
- shrl $4, %eax
- movw %ax, 2 + realptr - _reloc(%ebx)
-
-DEBUG_CHAR('c')
- /* Fixup the gdt */
- movl %ebx, %eax
- shll $16, %eax
-
- movl %ebx, %ecx
- shrl $16, %ecx
- andl $0xff, %ecx
-
- movl %ebx, %edx
- andl $0xff000000, %edx
- orl %edx, %ecx
-
- addl %ebx, gdtaddr - _reloc(%ebx)
- addl %ebx, debug_gdtaddr - _reloc(%ebx)
- orl %eax, 0x08 + gdt - _reloc(%ebx)
- orl %ecx, 0x0c + gdt - _reloc(%ebx)
- orl %eax, 0x10 + gdt - _reloc(%ebx)
- orl %ecx, 0x14 + gdt - _reloc(%ebx)
-
-
-
-DEBUG_CHAR('d')
- /* Setup the classic BIOS interrupt table at 0x0 */
- lidt idtptr - _reloc(%ebx)
-
- /* Provide us with 16bit segments that we can use */
- lgdt gdtptr - _reloc(%ebx)
-
- /* Note we don't disable the a20 line, (this shouldn't be required)
- * The code to do it is in kexec_test and it is a real pain.
- * I will worry about that when I need it.
- */
-
- /* Load 16bit data segments, to ensure the segment limits are set */
- movl $0x10, %eax
- movl %eax, %ds
- movl %eax, %es
- movl %eax, %ss
- movl %eax, %fs
- movl %eax, %gs
-
- /* switch to 16bit mode */
-
- ljmp $0x08, $2f - _reloc
-2:
- .code16
-DEBUG_CHAR('e')
- /* Disable Paging and protected mode */
- /* clear the PG & PE bits of CR0 */
- movl %cr0,%eax
- andl $~((1 << 31)|(1<<0)),%eax
- movl %eax,%cr0
-
-DEBUG_CHAR('f')
- /* make intersegment jmp to flush the processor pipeline
- * and reload %cs:%eip (to clear upper 16 bits of %eip).
- */
- ljmp *(realptr - _reloc)
-3:
-DEBUG_CHAR('g')
- /* we are in real mode now
- * set up the real mode segment registers : %ds, $ss, %es
- */
- /* Setup the data segment */
- movw %cs, %ax
- movw %ax, %ds
-
-DEBUG_CHAR('h')
- /* Load the registers */
- movl eax - _reloc, %eax
- movl ebx - _reloc, %ebx
- movl ecx - _reloc, %ecx
- movl edx - _reloc, %edx
- movl esi - _reloc, %esi
- movl edi - _reloc, %esi
- movl esp - _reloc, %esp
- movl ebp - _reloc, %ebp
- movw es - _reloc, %es
- movw ss - _reloc, %ss
- movw fs - _reloc, %fs
- movw gs - _reloc, %gs
- movw ds - _reloc, %ds
-
- /* Jump to the kernel entrypoint */
- ljmp %cs:*(realdest - _reloc)
-
-setup16_debug_regs:
-eax: .long 0x00000000
-ebx: .long 0x00000000
-ecx: .long 0x00000000
-edx: .long 0x00000000
-esi: .long 0x00000000
-edi: .long 0x00000000
-esp: .long 0x00000000
-ebp: .long 0x00000000
-ds: .word 0x0000
-es: .word 0x0000
-ss: .word 0x0000
-fs: .word 0x0000
-gs: .word 0x0000
-realdest:
-ip: .word 0x0000
-cs: .word 0x0000
-
- .balign 16
-realptr:
- .word 3b - _reloc
- .word 0x0000
-
-idtptr:
- /* 256 entry idt at 0 */
- .word 0x400 - 1
- .word 0, 0
-
-gdtptr:
- .word gdt_end - gdt - 1
-gdtaddr:
- .long gdt - _reloc
-
-gdt:
- /* dummy */
- .word 0, 0, 0, 0
-
- /* 16 bit real mode code segment */
- .word 0xffff, 0x0000
- .byte 0x00, 0x9b, 0x00, 0x00
-
- /* 16 bit real mode data segment */
- .word 0xffff, 0x0000
- .byte 0x00, 0x93, 0x00, 0x00
-gdt_end:
-
-debug_gdt:
- /* 0x00 */
- .word debug_gdt_end - debug_gdt - 1
-debug_gdtaddr:
- .long debug_gdt - _reloc
- .word 0
-
- /* 0x08 */
- .word 0, 0, 0, 0 /* Nothing in the first gdt entry */
-
- /* 0x10 4Gb - (0x100000*0x1000 = 4Gb), base address = 0, code read/exec, granularity = 4096, 386 */
- .word 0xFFFF, 0x00, 0x9A00, 0x00CF
- /* 0x18 4Gb - (0x100000*0x1000 = 4Gb*), base address = 0, data read/write, granularity = 4096, 386 */
- .word 0xFFFF, 0x0000, 0x9200, 0x00CF
-
-
- /* 0x20 4Gb - (0x100000*0x1000 = 4Gb), base address = 0, code read/exec, granularity = 4096, 386 */
- .word 0xFFFF, 0x00, 0x9A00, 0x00CF
- /* 0x28 4Gb - (0x100000*0x1000 = 4Gb*), base address = 0, data read/write, granularity = 4096, 386 */
- .word 0xFFFF, 0x0000, 0x9200, 0x00CF
-
-
- /* 0x30 4Gb - (0x100000*0x1000 = 4Gb), base address = 0, code read/exec, granularity = 4096, 386 */
- .word 0xFFFF, 0x00, 0x9A00, 0x00CF
- /* 0x38 4Gb - (0x100000*0x1000 = 4Gb*), base address = 0, data read/write, granularity = 4096, 386 */
- .word 0xFFFF, 0x0000, 0x9200, 0x00CF
-
-
- /* 0x40 4Gb - (0x100000*0x1000 = 4Gb), base address = 0, code read/exec, granularity = 4096, 386 */
- .word 0xFFFF, 0x00, 0x9A00, 0x00CF
- /* 0x48 4Gb - (0x100000*0x1000 = 4Gb*), base address = 0, data read/write, granularity = 4096, 386 */
- .word 0xFFFF, 0x0000, 0x9200, 0x00CF
-
-
- /* 0x50 4Gb - (0x100000*0x1000 = 4Gb), base address = 0, code read/exec, granularity = 4096, 386 */
- .word 0xFFFF, 0x00, 0x9A00, 0x00CF
- /* 0x58 4Gb - (0x100000*0x1000 = 4Gb*), base address = 0, data read/write, granularity = 4096, 386 */
- .word 0xFFFF, 0x0000, 0x9200, 0x00CF
-
-
- /* 0x60 4Gb - (0x100000*0x1000 = 4Gb), base address = 0, code read/exec, granularity = 4096, 386 */
- .word 0xFFFF, 0x00, 0x9A00, 0x00CF
- /* 0x68 4Gb - (0x100000*0x1000 = 4Gb*), base address = 0, data read/write, granularity = 4096, 386 */
- .word 0xFFFF, 0x0000, 0x9200, 0x00CF
-debug_gdt_end:
-
-
-setup16_debug_kernel_pre_protected:
- .code16
- DEBUG_CHAR('i')
- cli # no interrupts allowed !
- movb $0x80, %al # disable NMI for bootup
- # sequence
- outb %al, $0x70
- lret
-setup16_debug_first_code32:
- .code32
- .byte 0xbf /* movl $0x12345678, %edi */
-location:
- .long 0x12345678
- DEBUG_CHAR('j')
- .byte 0xb8 /* movl $0x10000, %eax */
-setup16_debug_old_code32:
- .long 0x10000
- jmp %eax
-setup16_debug_end:
-setup16_debug_size:
- .long setup16_debug_end - setup16_debug_start
-setup16_debug_align:
- .long 16
diff --git a/purgatory/arch/x86_64/Makefile b/purgatory/arch/x86_64/Makefile
index 22b4228..7300937 100644
--- a/purgatory/arch/x86_64/Makefile
+++ b/purgatory/arch/x86_64/Makefile
@@ -16,9 +16,11 @@ dist += purgatory/arch/x86_64/Makefile $(x86_64_PURGATORY_SRCS_native) \
purgatory/arch/x86_64/purgatory-x86_64.h
# Don't add sources in i386/ to dist, as i386/Makefile adds them
-x86_64_PURGATORY_SRCS += purgatory/arch/i386/entry32-16.S
+x86_64_PURGATORY_SRCS += purgatory/arch/i386/entry32-16.S
x86_64_PURGATORY_SRCS += purgatory/arch/i386/entry32-16-debug.S
x86_64_PURGATORY_SRCS += purgatory/arch/i386/crashdump_backup.c
x86_64_PURGATORY_SRCS += purgatory/arch/i386/console-x86.c
x86_64_PURGATORY_SRCS += purgatory/arch/i386/vga.c
x86_64_PURGATORY_SRCS += purgatory/arch/i386/pic.c
+
+x86_64_PURGATORY_EXTRA_CFLAGS = -mcmodel=large
diff --git a/purgatory/arch/x86_64/entry64-32.S b/purgatory/arch/x86_64/entry64-32.S
index 66f8a85..f2b6377 100644
--- a/purgatory/arch/x86_64/entry64-32.S
+++ b/purgatory/arch/x86_64/entry64-32.S
@@ -24,13 +24,34 @@
.equ CR0_PG, 0x80000000
.text
+ .balign 16
.globl entry32, entry32_regs
entry32:
.code64
- /* Setup a gdt that should that is generally usefully */
+ /* Setup the 4G offset of entry32 lm_exit code segment */
+ movq $0x00CF9A000000ffff, %rax
+
+ leaq entry32(%rip), %rbx /* Low 24 bits */
+ andq $0xffffff, %rbx
+ shlq $16, %rbx
+ orq %rbx, %rax
+
+ leaq entry32(%rip), %rbx /* High 8 bits */
+ movq $0xff000000, %rdx
+ andq %rdx, %rbx
+ shlq $32, %rbx
+ orq %rbx, %rax
+
+ movq %rax, (gdt + 0x20)(%rip)
+
+ /* Setup a gdt that is generally usefully */
lgdt gdt(%rip)
-
+
+ /* Setup the far pointer to the entry point */
+ movl eip(%rip), %eax
+ movl %eax, entry32_addr(%rip)
+
/* Switch to 32bit compatiblity mode */
ljmp *lm_exit_addr(%rip)
lm_exit:
@@ -60,19 +81,19 @@ lm_exit:
movl %eax, %gs
/* Load the registers */
- movl eax, %eax
- movl ecx, %ecx
- movl edx, %edx
- movl esi, %esi
- movl edi, %edi
- movl esp, %esp
- movl ebp, %ebp
- movl ebx, %ebx
+ movl %cs:eax - entry32, %eax
+ movl %cs:ecx - entry32, %ecx
+ movl %cs:edx - entry32, %edx
+ movl %cs:esi - entry32, %esi
+ movl %cs:edi - entry32, %edi
+ movl %cs:esp - entry32, %esp
+ movl %cs:ebp - entry32, %ebp
+ movl %cs:ebx - entry32, %ebx
/* Jump to the loaded image */
- jmpl *(eip)
+ ljmp *%cs:entry32_addr - entry32
- .section ".rodata"
+ .section ".data"
.balign 16
gdt: /* 0x00 unusable segment
* 0x08 unused
@@ -88,8 +109,8 @@ gdt: /* 0x00 unusable segment
/* 0x18 4GB flat data segment */
.word 0xFFFF, 0x0000, 0x9200, 0x00CF
- /* 0x20 dummy */
- .word 0x0000, 0x0000, 0x0000, 0x000
+ /* 0x20 4GB flat code segment base at entry32 */
+ .word 0xFFFF, 0x0000, 0x9A00, 0x0CF
/* 0x28 dummy */
.word 0x0000, 0x0000, 0x0000, 0x000
/* 0x30 dummy */
@@ -115,9 +136,15 @@ gdt_end:
.section ".rodata"
.balign 4
lm_exit_addr:
- .long lm_exit
- .long 0x10
-
+ .long lm_exit - entry32
+ .long 0x20
+
+ .section ".data"
+ .balign 4
+entry32_addr:
+ .long 0x00000000
+ .long 0x10
+
.section ".rodata"
.balign 4
entry32_regs:
@@ -129,6 +156,9 @@ esi: .long 0x00000000
edi: .long 0x00000000
esp: .long 0x00000000
ebp: .long 0x00000000
-eip: .long entry16
- .size entry32_regs, . - entry32_regs
+eip: .quad entry16 /* low 32 bits address
+ * high 32bits zeros
+ * uses 64bit reloc
+ */
+ .size entry32_regs, (. - 4) - entry32_regs
diff --git a/purgatory/arch/x86_64/entry64.S b/purgatory/arch/x86_64/entry64.S
index 666023c..e3223b7 100644
--- a/purgatory/arch/x86_64/entry64.S
+++ b/purgatory/arch/x86_64/entry64.S
@@ -37,9 +37,10 @@ entry64:
movl %eax, %fs
movl %eax, %gs
- movq $stack_init, %rsp
+ leaq stack_init(%rip), %rsp
pushq $0x10 /* CS */
- pushq $new_cs_exit
+ leaq new_cs_exit(%rip), %rax
+ pushq %rax
lretq
new_cs_exit:
diff --git a/purgatory/arch/x86_64/setup-x86_64.S b/purgatory/arch/x86_64/setup-x86_64.S
index 74997fa..95572d8 100644
--- a/purgatory/arch/x86_64/setup-x86_64.S
+++ b/purgatory/arch/x86_64/setup-x86_64.S
@@ -42,10 +42,10 @@ purgatory_start:
/* In 64bit mode the code segment is meaningless */
movq 0(%rsp), %rax
- movq %rax, jump_back_entry
+ movq %rax, jump_back_entry(%rip)
/* Setup a stack */
- movq $lstack_end, %rsp
+ leaq lstack_end(%rip), %rsp
/* Call the C code */
call purgatory
--
1.7.5.4
_______________________________________________
kexec mailing list
kexec@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/kexec
^ permalink raw reply related [flat|nested] 9+ messages in thread* Re: [PATCH] kexec x86_64: Make purgatory relocatable anywhere in the 64bit address space.
2012-11-19 16:56 [PATCH] kexec x86_64: Make purgatory relocatable anywhere in the 64bit address space Eric W. Biederman
@ 2012-11-21 0:16 ` Simon Horman
2012-12-03 20:34 ` Yinghai Lu
1 sibling, 0 replies; 9+ messages in thread
From: Simon Horman @ 2012-11-21 0:16 UTC (permalink / raw)
To: Eric W. Biederman; +Cc: Yinghai Lu, Kexec Mailing List
On Mon, Nov 19, 2012 at 08:56:22AM -0800, Eric W. Biederman wrote:
>
> Remove kexec/arch/i386/compat_x6_64.S
> purgatory/arch/i386/linux-entry16.S and purgatory/arch/i386/entry16.S
> Those were early attempts at entry32-16.S that should have been
> deleted long ago.
>
> Strip the purgatory code of debug symbols. There is no need to carry
> debug symbols we will never use around in /sbin/kexec.
>
> On x86_64 use -mcmodel=large so that the code is built without
> any 32bit assumptions. -mcmodel=medium and -mcmodel=small
> result int code that has 32bit relocations against variables
> that can live anywhere in the address space
>
> Modify the assembly in entry64.S and setup-x86_64.S to use %rip
> relative addressing of variables so no relocates are emitted.
>
> Modify entry64-32.S so that it does not have any relocations that can
> not be processed when purgatory is loaded above 4G. entry64-32.S
> jumps to a 32bit entry point and can not itself be used above 4G so
> these changes merely prevent it from being a problem in the other case.
>
> eip is modifed to be a 64bit value of which only the low 32bits are
> exported outside of entry64-32.S
>
> The long mode exit code is modified to run with a %cs value whose
> base address is the address of the symbol entry32. From there
> all of the 32bit code in entry64-32.S can read variables by reading
> them through %cs. Until the final jump to the the target address
> which is made a far jump reloading %cs and the intstruction pointer.
>
> Modify entry32-16.S and entry32-16-debug.S to be position independent
> 32bit code. At their start make a short call to push the current value
> of %eip on the stack and pop it off. Allowing the calculation of the
> address of entry16 which the code has always kept in %ebx.
>
> Update the pointer to the gdt in the gdt so that lgdt will work.
>
> Modify the instructions in entry32-16.S and entry32-16-debug.S so
> that the 32bit code uses offsets from %ebx which points at entry16.
>
> Tested-by: Yinghai Lu <yinghai@kernel.org>
> Signed-off-by: "Eric W. Biederman" <ebiederm@xmission.com>
Thanks, applied.
_______________________________________________
kexec mailing list
kexec@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/kexec
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH] kexec x86_64: Make purgatory relocatable anywhere in the 64bit address space.
2012-11-19 16:56 [PATCH] kexec x86_64: Make purgatory relocatable anywhere in the 64bit address space Eric W. Biederman
2012-11-21 0:16 ` Simon Horman
@ 2012-12-03 20:34 ` Yinghai Lu
2012-12-03 22:25 ` [PATCH] kexec: Teach configure to find the strip binary Eric W. Biederman
1 sibling, 1 reply; 9+ messages in thread
From: Yinghai Lu @ 2012-12-03 20:34 UTC (permalink / raw)
To: Eric W. Biederman; +Cc: Simon Horman, Kexec Mailing List
On Mon, Nov 19, 2012 at 8:56 AM, Eric W. Biederman
<ebiederm@xmission.com> wrote:
> diff --git a/purgatory/Makefile b/purgatory/Makefile
> index ee1679c..e39adec 100644
> --- a/purgatory/Makefile
> +++ b/purgatory/Makefile
> @@ -64,6 +64,7 @@ $(PURGATORY): $(PURGATORY_OBJS)
> $(CC) $(CFLAGS) $(LDFLAGS) -o $@ $^
>
> # $(LD) $(LDFLAGS) $(EXTRA_LDFLAGS) --no-undefined -e purgatory_start -r -o $@ $(PURGATORY_OBJS) $(UTIL_LIB)
> + $(STRIP) --strip-debug $@
>
> echo::
> @echo "PURGATORY_SRCS $(PURGATORY_SRCS)"
looks like configure does not set
STRIP in top Makefile
_______________________________________________
kexec mailing list
kexec@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/kexec
^ permalink raw reply [flat|nested] 9+ messages in thread
* [PATCH] kexec: Teach configure to find the strip binary.
2012-12-03 20:34 ` Yinghai Lu
@ 2012-12-03 22:25 ` Eric W. Biederman
2012-12-04 0:09 ` Simon Horman
0 siblings, 1 reply; 9+ messages in thread
From: Eric W. Biederman @ 2012-12-03 22:25 UTC (permalink / raw)
To: Yinghai Lu; +Cc: Simon Horman, Kexec Mailing List
For some reason my version of the Makefile generated by configure
included the line STRIP=strp. Rerunning configure from a fresh slate
did not regenerate that line so I don't know how it got there. So add
the code to Makefile.in and configure.ac to autodetect the strip binary.
This is needed so that we can remove from purgatory all of the
relocations to sections that are not needed at runtime, by stripping
out those sections.
Signed-off-by: "Eric W. Biederman" <ebiederm@xmission.com>
---
Makefile.in | 1 +
configure.ac | 2 ++
purgatory/arch/x86_64/Makefile | 2 +-
3 files changed, 4 insertions(+), 1 deletions(-)
diff --git a/Makefile.in b/Makefile.in
index ba2e638..7a50200 100644
--- a/Makefile.in
+++ b/Makefile.in
@@ -64,6 +64,7 @@ SED = @SED@
FIND = @FIND@
XARGS = @XARGS@
DIRNAME = @DIRNAME@
+STRIP = @STRIP@
pkgdatadir = $(datadir)/$(PACKAGE_NAME)
diff --git a/configure.ac b/configure.ac
index 401b11e..b7e4f2e 100644
--- a/configure.ac
+++ b/configure.ac
@@ -142,6 +142,7 @@ AC_CHECK_PROG([SED], sed, sed, "no", [$PATH])
AC_CHECK_PROG([FIND], find, find, "no", [$PATH])
AC_CHECK_PROG([XARGS], xargs, xargs, "no", [$PATH])
AC_CHECK_PROG([DIRNAME], dirname, dirname, "no", [$PATH])
+AC_CHECK_PROG([STRIP], strip, strip, "no", [$PATH])
dnl See if I have a usable copy of zlib available
if test "$with_zlib" = yes ; then
@@ -185,6 +186,7 @@ if test "$SED" = "no"; then AC_MSG_ERROR([ sed not found]); fi
if test "$FIND" = "no"; then AC_MSG_ERROR([ find not found]); fi
if test "$XARGS" = "no"; then AC_MSG_ERROR([ xargs not found]); fi
if test "$DIRNAME" = "no"; then AC_MSG_ERROR([ dirname not found]); fi
+if test "$STRIP" = "no"; then AC_MSG_ERROR([ strip not found]); fi
dnl ---Output variables...
AC_SUBST([BUILD_CC])
diff --git a/purgatory/arch/x86_64/Makefile b/purgatory/arch/x86_64/Makefile
index 7300937..bfc7b24 100644
--- a/purgatory/arch/x86_64/Makefile
+++ b/purgatory/arch/x86_64/Makefile
@@ -16,7 +16,7 @@ dist += purgatory/arch/x86_64/Makefile $(x86_64_PURGATORY_SRCS_native) \
purgatory/arch/x86_64/purgatory-x86_64.h
# Don't add sources in i386/ to dist, as i386/Makefile adds them
-x86_64_PURGATORY_SRCS += purgatory/arch/i386/entry32-16.S
+x86_64_PURGATORY_SRCS += purgatory/arch/i386/entry32-16.S
x86_64_PURGATORY_SRCS += purgatory/arch/i386/entry32-16-debug.S
x86_64_PURGATORY_SRCS += purgatory/arch/i386/crashdump_backup.c
x86_64_PURGATORY_SRCS += purgatory/arch/i386/console-x86.c
--
1.7.5.4
_______________________________________________
kexec mailing list
kexec@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/kexec
^ permalink raw reply related [flat|nested] 9+ messages in thread
* Re: [PATCH] kexec: Teach configure to find the strip binary.
2012-12-03 22:25 ` [PATCH] kexec: Teach configure to find the strip binary Eric W. Biederman
@ 2012-12-04 0:09 ` Simon Horman
2012-12-04 1:11 ` Eric W. Biederman
0 siblings, 1 reply; 9+ messages in thread
From: Simon Horman @ 2012-12-04 0:09 UTC (permalink / raw)
To: Eric W. Biederman; +Cc: Kexec Mailing List, Yinghai Lu
On Mon, Dec 03, 2012 at 02:25:25PM -0800, Eric W. Biederman wrote:
>
> For some reason my version of the Makefile generated by configure
> included the line STRIP=strp. Rerunning configure from a fresh slate
> did not regenerate that line so I don't know how it got there. So add
> the code to Makefile.in and configure.ac to autodetect the strip binary.
>
> This is needed so that we can remove from purgatory all of the
> relocations to sections that are not needed at runtime, by stripping
> out those sections.
>
> Signed-off-by: "Eric W. Biederman" <ebiederm@xmission.com>
Thanks, I removed the last hunk, which seems to be a white-space only
change to purgatory/arch/x86_64/Makefile, and applied the rest.
> ---
> Makefile.in | 1 +
> configure.ac | 2 ++
> purgatory/arch/x86_64/Makefile | 2 +-
> 3 files changed, 4 insertions(+), 1 deletions(-)
>
> diff --git a/Makefile.in b/Makefile.in
> index ba2e638..7a50200 100644
> --- a/Makefile.in
> +++ b/Makefile.in
> @@ -64,6 +64,7 @@ SED = @SED@
> FIND = @FIND@
> XARGS = @XARGS@
> DIRNAME = @DIRNAME@
> +STRIP = @STRIP@
>
>
> pkgdatadir = $(datadir)/$(PACKAGE_NAME)
> diff --git a/configure.ac b/configure.ac
> index 401b11e..b7e4f2e 100644
> --- a/configure.ac
> +++ b/configure.ac
> @@ -142,6 +142,7 @@ AC_CHECK_PROG([SED], sed, sed, "no", [$PATH])
> AC_CHECK_PROG([FIND], find, find, "no", [$PATH])
> AC_CHECK_PROG([XARGS], xargs, xargs, "no", [$PATH])
> AC_CHECK_PROG([DIRNAME], dirname, dirname, "no", [$PATH])
> +AC_CHECK_PROG([STRIP], strip, strip, "no", [$PATH])
>
> dnl See if I have a usable copy of zlib available
> if test "$with_zlib" = yes ; then
> @@ -185,6 +186,7 @@ if test "$SED" = "no"; then AC_MSG_ERROR([ sed not found]); fi
> if test "$FIND" = "no"; then AC_MSG_ERROR([ find not found]); fi
> if test "$XARGS" = "no"; then AC_MSG_ERROR([ xargs not found]); fi
> if test "$DIRNAME" = "no"; then AC_MSG_ERROR([ dirname not found]); fi
> +if test "$STRIP" = "no"; then AC_MSG_ERROR([ strip not found]); fi
>
> dnl ---Output variables...
> AC_SUBST([BUILD_CC])
> diff --git a/purgatory/arch/x86_64/Makefile b/purgatory/arch/x86_64/Makefile
> index 7300937..bfc7b24 100644
> --- a/purgatory/arch/x86_64/Makefile
> +++ b/purgatory/arch/x86_64/Makefile
> @@ -16,7 +16,7 @@ dist += purgatory/arch/x86_64/Makefile $(x86_64_PURGATORY_SRCS_native) \
> purgatory/arch/x86_64/purgatory-x86_64.h
>
> # Don't add sources in i386/ to dist, as i386/Makefile adds them
> -x86_64_PURGATORY_SRCS += purgatory/arch/i386/entry32-16.S
> +x86_64_PURGATORY_SRCS += purgatory/arch/i386/entry32-16.S
> x86_64_PURGATORY_SRCS += purgatory/arch/i386/entry32-16-debug.S
> x86_64_PURGATORY_SRCS += purgatory/arch/i386/crashdump_backup.c
> x86_64_PURGATORY_SRCS += purgatory/arch/i386/console-x86.c
> --
> 1.7.5.4
>
_______________________________________________
kexec mailing list
kexec@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/kexec
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH] kexec: Teach configure to find the strip binary.
2012-12-04 0:09 ` Simon Horman
@ 2012-12-04 1:11 ` Eric W. Biederman
2012-12-04 1:18 ` Yinghai Lu
0 siblings, 1 reply; 9+ messages in thread
From: Eric W. Biederman @ 2012-12-04 1:11 UTC (permalink / raw)
To: Simon Horman; +Cc: Kexec Mailing List, Yinghai Lu
Simon Horman <horms@verge.net.au> writes:
> On Mon, Dec 03, 2012 at 02:25:25PM -0800, Eric W. Biederman wrote:
>>
>> For some reason my version of the Makefile generated by configure
>> included the line STRIP=strp. Rerunning configure from a fresh slate
>> did not regenerate that line so I don't know how it got there. So add
>> the code to Makefile.in and configure.ac to autodetect the strip binary.
>>
>> This is needed so that we can remove from purgatory all of the
>> relocations to sections that are not needed at runtime, by stripping
>> out those sections.
>>
>> Signed-off-by: "Eric W. Biederman" <ebiederm@xmission.com>
>
> Thanks, I removed the last hunk, which seems to be a white-space only
> change to purgatory/arch/x86_64/Makefile, and applied the rest.
Oops. Thanks for cacthing that. I didn't realize I had that change
sitting in my tree.
>> # Don't add sources in i386/ to dist, as i386/Makefile adds them
>> -x86_64_PURGATORY_SRCS += purgatory/arch/i386/entry32-16.S
>> +x86_64_PURGATORY_SRCS += purgatory/arch/i386/entry32-16.S
>> x86_64_PURGATORY_SRCS += purgatory/arch/i386/entry32-16-debug.S
>> x86_64_PURGATORY_SRCS += purgatory/arch/i386/crashdump_backup.c
>> x86_64_PURGATORY_SRCS += purgatory/arch/i386/console-x86.c
Eric
_______________________________________________
kexec mailing list
kexec@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/kexec
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH] kexec: Teach configure to find the strip binary.
2012-12-04 1:11 ` Eric W. Biederman
@ 2012-12-04 1:18 ` Yinghai Lu
2012-12-04 1:26 ` Eric W. Biederman
0 siblings, 1 reply; 9+ messages in thread
From: Yinghai Lu @ 2012-12-04 1:18 UTC (permalink / raw)
To: Eric W. Biederman; +Cc: Simon Horman, Kexec Mailing List
On Mon, Dec 3, 2012 at 5:11 PM, Eric W. Biederman <ebiederm@xmission.com> wrote:
> Simon Horman <horms@verge.net.au> writes:
>
>> On Mon, Dec 03, 2012 at 02:25:25PM -0800, Eric W. Biederman wrote:
>>>
>>> For some reason my version of the Makefile generated by configure
>>> included the line STRIP=strp. Rerunning configure from a fresh slate
>>> did not regenerate that line so I don't know how it got there. So add
>>> the code to Makefile.in and configure.ac to autodetect the strip binary.
>>>
>>> This is needed so that we can remove from purgatory all of the
>>> relocations to sections that are not needed at runtime, by stripping
>>> out those sections.
>>>
>>> Signed-off-by: "Eric W. Biederman" <ebiederm@xmission.com>
>>
>> Thanks, I removed the last hunk, which seems to be a white-space only
>> change to purgatory/arch/x86_64/Makefile, and applied the rest.
>
> Oops. Thanks for cacthing that. I didn't realize I had that change
> sitting in my tree.
after re config it. got
DIRNAME = dirname
STRIP = @STRIP@
instead of
STRIP = strip
_______________________________________________
kexec mailing list
kexec@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/kexec
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH] kexec: Teach configure to find the strip binary.
2012-12-04 1:18 ` Yinghai Lu
@ 2012-12-04 1:26 ` Eric W. Biederman
2012-12-04 1:29 ` Yinghai Lu
0 siblings, 1 reply; 9+ messages in thread
From: Eric W. Biederman @ 2012-12-04 1:26 UTC (permalink / raw)
To: Yinghai Lu; +Cc: Simon Horman, Kexec Mailing List
Yinghai Lu <yinghai@kernel.org> writes:
> On Mon, Dec 3, 2012 at 5:11 PM, Eric W. Biederman <ebiederm@xmission.com> wrote:
>> Simon Horman <horms@verge.net.au> writes:
>>
>>> On Mon, Dec 03, 2012 at 02:25:25PM -0800, Eric W. Biederman wrote:
>>>>
>>>> For some reason my version of the Makefile generated by configure
>>>> included the line STRIP=strp. Rerunning configure from a fresh slate
>>>> did not regenerate that line so I don't know how it got there. So add
>>>> the code to Makefile.in and configure.ac to autodetect the strip binary.
>>>>
>>>> This is needed so that we can remove from purgatory all of the
>>>> relocations to sections that are not needed at runtime, by stripping
>>>> out those sections.
>>>>
>>>> Signed-off-by: "Eric W. Biederman" <ebiederm@xmission.com>
>>>
>>> Thanks, I removed the last hunk, which seems to be a white-space only
>>> change to purgatory/arch/x86_64/Makefile, and applied the rest.
>>
>> Oops. Thanks for cacthing that. I didn't realize I had that change
>> sitting in my tree.
>
> after re config it. got
>
> DIRNAME = dirname
> STRIP = @STRIP@
>
>
> instead of
>
> STRIP = strip
Run bootstrap. At the very least it looks like you haven't regeneratged
configure by running autoconf.
Eric
_______________________________________________
kexec mailing list
kexec@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/kexec
^ permalink raw reply [flat|nested] 9+ messages in thread
end of thread, other threads:[~2012-12-04 1:29 UTC | newest]
Thread overview: 9+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2012-11-19 16:56 [PATCH] kexec x86_64: Make purgatory relocatable anywhere in the 64bit address space Eric W. Biederman
2012-11-21 0:16 ` Simon Horman
2012-12-03 20:34 ` Yinghai Lu
2012-12-03 22:25 ` [PATCH] kexec: Teach configure to find the strip binary Eric W. Biederman
2012-12-04 0:09 ` Simon Horman
2012-12-04 1:11 ` Eric W. Biederman
2012-12-04 1:18 ` Yinghai Lu
2012-12-04 1:26 ` Eric W. Biederman
2012-12-04 1:29 ` Yinghai Lu
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox