From 7c8f178d02c533be018a83db48429a08d4952a3a Mon Sep 17 00:00:00 2001 From: Vladimir 'phcoder' Serbinenko Date: Mon, 3 Aug 2009 14:30:51 +0200 Subject: [PATCH] realloc --- include/grub/i386/relocator.h | 15 ++++++++------- lib/i386/relocator.c | 19 +++++++++++++++++++ 2 files changed, 27 insertions(+), 7 deletions(-) diff --git a/include/grub/i386/relocator.h b/include/grub/i386/relocator.h index cbc75ed0a..ef7fe23aa 100644 --- a/include/grub/i386/relocator.h +++ b/include/grub/i386/relocator.h @@ -19,6 +19,9 @@ #ifndef GRUB_RELOCATOR_CPU_HEADER #define GRUB_RELOCATOR_CPU_HEADER 1 +#include +#include + struct grub_relocator32_state { grub_uint32_t esp; @@ -29,12 +32,10 @@ struct grub_relocator32_state grub_uint32_t eip; }; -void * -grub_relocator32_alloc (grub_size_t size); -grub_err_t -grub_relocator32_boot (void *relocator, grub_uint32_t dest, - struct grub_relocator32_state state); -void -grub_relocator32_free (void *relocator); +void *grub_relocator32_alloc (grub_size_t size); +grub_err_t grub_relocator32_boot (void *relocator, grub_uint32_t dest, + struct grub_relocator32_state state); +void *grub_relocator32_realloc (void *relocator, grub_size_t size); +void grub_relocator32_free (void *relocator); #endif /* ! GRUB_RELOCATOR_CPU_HEADER */ diff --git a/lib/i386/relocator.c b/lib/i386/relocator.c index 6a9b3ce1b..0205d8ef4 100644 --- a/lib/i386/relocator.c +++ b/lib/i386/relocator.c @@ -80,6 +80,25 @@ grub_relocator32_alloc (grub_size_t size) return playground + RELOCATOR_SIZEOF (forward); } +void * +grub_relocator32_realloc (void *relocator, grub_size_t size) +{ + char *playground; + + playground = (char *) relocator - RELOCATOR_SIZEOF (forward); + + playground = grub_realloc (playground, + (RELOCATOR_SIZEOF (forward) + RELOCATOR_ALIGN) + + size + + (RELOCATOR_SIZEOF (backward) + RELOCATOR_ALIGN)); + if (!playground) + return 0; + + *(grub_size_t *) playground = size; + + return playground + RELOCATOR_SIZEOF (forward); +} + void grub_relocator32_free (void *relocator) {