Pass %dl to ntldr. Clear other registers.

This commit is contained in:
Vladimir 'phcoder' Serbinenko 2010-04-15 02:11:26 +02:00
parent b883356cf6
commit dae84898b2
4 changed files with 19 additions and 1 deletions

View file

@ -44,6 +44,7 @@ struct grub_relocator16_state
grub_uint16_t ss; grub_uint16_t ss;
grub_uint16_t sp; grub_uint16_t sp;
grub_uint16_t ip; grub_uint16_t ip;
grub_uint32_t edx;
}; };
struct grub_relocator64_state struct grub_relocator64_state

View file

@ -49,6 +49,7 @@ extern grub_uint16_t grub_relocator16_fs;
extern grub_uint16_t grub_relocator16_gs; extern grub_uint16_t grub_relocator16_gs;
extern grub_uint16_t grub_relocator16_ss; extern grub_uint16_t grub_relocator16_ss;
extern grub_uint16_t grub_relocator16_sp; 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_start;
extern grub_uint8_t grub_relocator32_end; 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_ss = state.ss;
grub_relocator16_sp = state.sp; grub_relocator16_sp = state.sp;
grub_relocator16_edx = state.edx;
grub_memmove (src, &grub_relocator16_start, RELOCATOR_SIZEOF (16)); grub_memmove (src, &grub_relocator16_start, RELOCATOR_SIZEOF (16));
err = grub_relocator_prepare_relocs (rel, target, &relst, NULL); err = grub_relocator_prepare_relocs (rel, target, &relst, NULL);

View file

@ -152,6 +152,11 @@ VARIABLE(grub_relocator16_sp)
.word 0 .word 0
movw %ax, %ss 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 /* Cleared direction flag is of no problem with any current
payload and makes this implementation easier. */ payload and makes this implementation easier. */
cld cld

View file

@ -35,6 +35,7 @@
static grub_dl_t my_mod; static grub_dl_t my_mod;
static struct grub_relocator *rel; static struct grub_relocator *rel;
static grub_uint32_t edx = 0xffffffff;
#define GRUB_NTLDR_SEGMENT 0x2000 #define GRUB_NTLDR_SEGMENT 0x2000
@ -43,7 +44,14 @@ grub_ntldr_boot (void)
{ {
struct grub_relocator16_state state = { struct grub_relocator16_state state = {
.cs = GRUB_NTLDR_SEGMENT, .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); grub_video_set_mode ("text", 0, 0);
@ -87,6 +95,7 @@ grub_cmd_ntldr (grub_command_t cmd __attribute__ ((unused)),
if (err) if (err)
goto fail; goto fail;
edx = grub_get_root_biosnumber ();
dev = grub_device_open (0); dev = grub_device_open (0);
if (dev && dev->disk) if (dev && dev->disk)