grub_uint16_t ss;
grub_uint16_t sp;
grub_uint16_t ip;
+ grub_uint32_t edx;
};
struct grub_relocator64_state
extern grub_uint16_t grub_relocator16_gs;
extern grub_uint16_t grub_relocator16_ss;
extern grub_uint16_t grub_relocator16_sp;
+extern grub_uint32_t grub_relocator16_edx;
extern grub_uint8_t grub_relocator32_start;
extern grub_uint8_t grub_relocator32_end;
grub_relocator16_ss = state.ss;
grub_relocator16_sp = state.sp;
+ grub_relocator16_edx = state.edx;
+
grub_memmove (src, &grub_relocator16_start, RELOCATOR_SIZEOF (16));
err = grub_relocator_prepare_relocs (rel, target, &relst, NULL);
VARIABLE(grub_relocator16_sp)
.word 0
movw %ax, %ss
+
+ /* movw imm32, %edx. */
+ .byte 0x66, 0xba
+VARIABLE(grub_relocator16_edx)
+ .long 0
/* Cleared direction flag is of no problem with any current
payload and makes this implementation easier. */
static grub_dl_t my_mod;
static struct grub_relocator *rel;
+static grub_uint32_t edx = 0xffffffff;
#define GRUB_NTLDR_SEGMENT 0x2000
{
struct grub_relocator16_state state = {
.cs = GRUB_NTLDR_SEGMENT,
- .ip = 0
+ .ip = 0,
+ .ds = 0,
+ .es = 0,
+ .fs = 0,
+ .gs = 0,
+ .ss = 0,
+ .sp = 0x7c00,
+ .edx = edx
};
grub_video_set_mode ("text", 0, 0);
if (err)
goto fail;
+ edx = grub_get_root_biosnumber ();
dev = grub_device_open (0);
if (dev && dev->disk)