From 80fc88f22dba0b213c208202807ee7311f6d7e9a Mon Sep 17 00:00:00 2001 From: robertmh Date: Sat, 22 Nov 2008 15:00:39 +0000 Subject: [PATCH] * kern/i386/loader.S (grub_multiboot_backward_relocator): Improve comments. Avoid copiing one more byte than necessary (just in case). --- ChangeLog | 3 +++ kern/i386/loader.S | 20 ++++++++++++++------ 2 files changed, 17 insertions(+), 6 deletions(-) diff --git a/ChangeLog b/ChangeLog index 755112460..5a6d71773 100644 --- a/ChangeLog +++ b/ChangeLog @@ -5,6 +5,9 @@ (grub_vga_text_term): Use grub_vga_text_init_fini() instead of grub_vga_text_cls(). + * kern/i386/loader.S (grub_multiboot_backward_relocator): Improve + comments. Avoid copiing one more byte than necessary (just in case). + 2008-11-20 Robert Millan * kern/i386/coreboot/init.c (grub_time_tics): Remove variable. diff --git a/kern/i386/loader.S b/kern/i386/loader.S index 8f146d92e..cacbbea73 100644 --- a/kern/i386/loader.S +++ b/kern/i386/loader.S @@ -141,24 +141,32 @@ VARIABLE(grub_multiboot_payload_entry_offset) * edx: Offset of the entry point (relative to the beginning of the block). */ VARIABLE(grub_multiboot_forward_relocator) - cld + /* Add entry offset. */ addl %edi, %edx + + /* Forward copy. */ + cld rep movsb + jmp *%edx VARIABLE(grub_multiboot_forward_relocator_end) VARIABLE(grub_multiboot_backward_relocator) + /* Add entry offset (before %edi is mangled). */ + addl %edi, %edx + + /* Backward movsb is implicitly off-by-one. compensate that. */ + decl %esi + decl %edi + + /* Backward copy. */ std addl %ecx, %esi addl %ecx, %edi - /* backward movsb is implicitly off-by-one. compensate that. */ - incl %ecx rep movsb - /* same problem again. */ - incl %edi - addl %edi, %edx + jmp *%edx VARIABLE(grub_multiboot_backward_relocator_end)