[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH] x86 boot: simplify reloc.c
This patch simplify reloc.c with: 1): no need separate make reloc.c -> reloc.o -> reloc.lnk -> reloc.bin -> reloc.S, and static embed reloc.S into head.S 2): reuse memcpy() in string lib 3): remove assemble code in the head of reloc.c [ It is just a cleanup patch and not change the code's logic, and it work well on x86. Not have x86_64 machine in my hand, thanks very much if someone can test it on x86_64 ] Signed-off-by: Xiao Guangrong <ericxiao.gr@xxxxxxxxx> diff -Nur a/xen/arch/x86/boot/build32.mk b/xen/arch/x86/boot/build32.mk --- a/xen/arch/x86/boot/build32.mk 2009-08-06 21:57:27.000000000 +0800 +++ b/xen/arch/x86/boot/build32.mk 1970-01-01 08:00:00.000000000 +0800 @@ -1,25 +0,0 @@ -XEN_ROOT=../../../.. -override XEN_TARGET_ARCH=x86_32 -CFLAGS = -include $(XEN_ROOT)/Config.mk - -# Disable PIE/SSP if GCC supports them. They can break us. -$(call cc-option-add,CFLAGS,CC,-nopie) -$(call cc-option-add,CFLAGS,CC,-fno-stack-protector) -$(call cc-option-add,CFLAGS,CC,-fno-stack-protector-all) - -CFLAGS += -Werror -fno-builtin -msoft-float - -# NB. awk invocation is a portable alternative to 'head -n -1' -%.S: %.bin - (od -v -t x $< | awk 'NR > 1 {print s} {s=$$0}' | \ - sed 's/ /,0x/g' | sed 's/^[0-9]*,/ .long /') >$@ - -%.bin: %.lnk - $(OBJCOPY) -O binary $< $@ - -%.lnk: %.o - $(LD) $(LDFLAGS_DIRECT) -N -Ttext 0x8c000 -o $@ $< - -%.o: %.c - $(CC) $(CFLAGS) -c $< -o $@ diff -Nur a/xen/arch/x86/boot/head.S b/xen/arch/x86/boot/head.S --- a/xen/arch/x86/boot/head.S 2009-08-06 21:57:27.000000000 +0800 +++ b/xen/arch/x86/boot/head.S 2009-10-25 10:47:26.789003416 +0800 @@ -195,9 +195,6 @@ #include "cmdline.S" -reloc: -#include "reloc.S" - .align 16 .globl trampoline_start, trampoline_end trampoline_start: diff -Nur a/xen/arch/x86/boot/Makefile b/xen/arch/x86/boot/Makefile --- a/xen/arch/x86/boot/Makefile 2009-08-06 21:57:27.000000000 +0800 +++ b/xen/arch/x86/boot/Makefile 2009-10-25 10:49:50.029001088 +0800 @@ -1,7 +1,2 @@ obj-y += head.o - -head.o: reloc.S - -# NB. BOOT_TRAMPOLINE == 0x8c000 -%.S: %.c - RELOC=0x8c000 $(MAKE) -f build32.mk $@ +obj-y += reloc.o diff -Nur a/xen/arch/x86/boot/reloc.c b/xen/arch/x86/boot/reloc.c --- a/xen/arch/x86/boot/reloc.c 2009-08-06 21:57:27.000000000 +0800 +++ b/xen/arch/x86/boot/reloc.c 2009-10-25 11:22:26.233684714 +0800 @@ -9,43 +9,21 @@ * Authors: * Keir Fraser <keir.fraser@xxxxxxxxxx> */ - -asm ( - " .text \n" - " .globl _start \n" - "_start: \n" - " mov $_start,%edi \n" - " call 1f \n" - "1: pop %esi \n" - " sub $1b-_start,%esi \n" - " mov $__bss_start-_start,%ecx \n" - " rep movsb \n" - " xor %eax,%eax \n" - " mov $_end,%ecx \n" - " sub %edi,%ecx \n" - " rep stosb \n" - " mov $reloc,%eax \n" - " jmp *%eax \n" - ); - -typedef unsigned int u32; +#include <asm/types.h> +#include <xen/string.h> +#include <asm/page.h> #include "../../../include/xen/multiboot.h" -extern char _start[]; +#define sym_phys(sym) (unsigned long *)((unsigned long)(sym) - __XEN_VIRT_START) -static void *memcpy(void *dest, const void *src, unsigned int n) -{ - char *s = (char *)src, *d = dest; - while ( n-- ) - *d++ = *s++; - return dest; -} +static void *start = (void *)0x8c000; static void *reloc_mbi_struct(void *old, unsigned int bytes) { - static void *alloc = &_start; - alloc = (void *)(((unsigned long)alloc - bytes) & ~15ul); - return memcpy(alloc, old, bytes); + unsigned long alloc = *sym_phys(&start); + alloc = ((unsigned long)alloc - bytes) & ~15ul; + *sym_phys(&start) = alloc; + return memcpy((void *)alloc, old, bytes); } static char *reloc_mbi_string(char *old) _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxxxxxxxx http://lists.xensource.com/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |