From dae84898b268bf733e8a6c2cc31be814ee0e1694 Mon Sep 17 00:00:00 2001 From: Vladimir 'phcoder' Serbinenko Date: Thu, 15 Apr 2010 02:11:26 +0200 Subject: [PATCH] Pass %dl to ntldr. Clear other registers. --- include/grub/i386/relocator.h | 1 + lib/i386/relocator.c | 3 +++ lib/i386/relocator16.S | 5 +++++ loader/i386/pc/ntldr.c | 11 ++++++++++- 4 files changed, 19 insertions(+), 1 deletion(-) diff --git a/include/grub/i386/relocator.h b/include/grub/i386/relocator.h index f32413a1b..891235f9b 100644 --- a/include/grub/i386/relocator.h +++ b/include/grub/i386/relocator.h @@ -44,6 +44,7 @@ struct grub_relocator16_state grub_uint16_t ss; grub_uint16_t sp; grub_uint16_t ip; + grub_uint32_t edx; }; struct grub_relocator64_state diff --git a/lib/i386/relocator.c b/lib/i386/relocator.c index 4eaa66890..5985fac7a 100644 --- a/lib/i386/relocator.c +++ b/lib/i386/relocator.c @@ -49,6 +49,7 @@ extern grub_uint16_t grub_relocator16_fs; 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; @@ -207,6 +208,8 @@ grub_relocator16_boot (struct grub_relocator *rel, 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); diff --git a/lib/i386/relocator16.S b/lib/i386/relocator16.S index 7d65e4dbe..510d3a1ed 100644 --- a/lib/i386/relocator16.S +++ b/lib/i386/relocator16.S @@ -151,6 +151,11 @@ VARIABLE(grub_relocator16_ss) 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. */ diff --git a/loader/i386/pc/ntldr.c b/loader/i386/pc/ntldr.c index 9e461ff49..1368694fb 100644 --- a/loader/i386/pc/ntldr.c +++ b/loader/i386/pc/ntldr.c @@ -35,6 +35,7 @@ static grub_dl_t my_mod; static struct grub_relocator *rel; +static grub_uint32_t edx = 0xffffffff; #define GRUB_NTLDR_SEGMENT 0x2000 @@ -43,7 +44,14 @@ grub_ntldr_boot (void) { 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); @@ -87,6 +95,7 @@ grub_cmd_ntldr (grub_command_t cmd __attribute__ ((unused)), if (err) goto fail; + edx = grub_get_root_biosnumber (); dev = grub_device_open (0); if (dev && dev->disk)