#ifndef GRUB_RELOCATOR_CPU_HEADER
#define GRUB_RELOCATOR_CPU_HEADER 1
+#include <grub/types.h>
+#include <grub/err.h>
+
struct grub_relocator32_state
{
grub_uint32_t esp;
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 */
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)
{