Pass %dl to ntldr. Clear other registers.
This commit is contained in:
parent
b883356cf6
commit
dae84898b2
4 changed files with 19 additions and 1 deletions
|
@ -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
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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)
|
||||||
|
|
Loading…
Reference in a new issue