Remove useless segments push/pop in VMXAssist.

According to Intel Spec, segments registors are cleared when exiting
virtual-8086 mode through trap or interrupts gate, so it's no need to
save their values in stack.
Signed-off-by: Xin Li <xin.b.li@intel.com>
This commit is contained in:
kfraser@localhost.localdomain committed 2006-12-04 09:20:12 +00:00
1 parent f5bdee9abd
commit b3fba4e07b
5 files changed
+22 -45

No files matched your search

+11 -11
View File
@@ -66,7 +66,7 @@ struct vmx_assist_context newctx;
unsigned long memory_size;
int initialize_real_mode;
extern char stack[], stack_top[];
extern char stack_top[];
extern unsigned trap_handlers[];
void
@@ -201,7 +201,7 @@ void
enter_real_mode(struct regs *regs)
{
/* mask off TSS busy bit */
gdt[TSS_SELECTOR / sizeof(gdt[0])] &= ~0x0000020000000000ULL;
gdt[TSS_SELECTOR / sizeof(gdt[0])] &= ~0x0000020000000000ULL;
/* start 8086 emulation of BIOS */
if (initialize_real_mode) {
@@ -219,8 +219,10 @@ enter_real_mode(struct regs *regs)
regs->cs = booting_vector << 8; /* AP entry point */
regs->eip = 0;
}
regs->uesp = 0;
regs->uss = 0;
regs->uesp = regs->uss = 0;
regs->eax = regs->ecx = regs->edx = regs->ebx = 0;
regs->esp = regs->ebp = regs->esi = regs->edi = 0;
/* intercept accesses to the PIC */
setiomap(PIC_MASTER+PIC_CMD);
@@ -236,14 +238,12 @@ enter_real_mode(struct regs *regs)
/* this should get us into 16-bit mode */
return;
} else {
/* go from protected to real mode */
regs->eflags |= EFLAGS_VM;
set_mode(regs, VM86_PROTECTED_TO_REAL);
emulate(regs);
}
/* go from protected to real mode */
regs->eflags |= EFLAGS_VM;
set_mode(regs, VM86_PROTECTED_TO_REAL);
emulate(regs);
}
/*
+2 -14
View File
@@ -100,10 +100,6 @@ trap_handlers:
.code32
.align 16
common_trap: /* common trap handler */
pushl %gs
pushl %fs
pushl %ds
pushl %es
pushal
movl $(DATA_SELECTOR), %eax /* make sure these are sane */
@@ -114,17 +110,13 @@ common_trap: /* common trap handler */
movl %esp, %ebp
pushl %ebp
pushl 52(%ebp)
pushl 48(%ebp)
pushl 36(%ebp)
pushl 32(%ebp)
call trap /* trap(trapno, errno, regs) */
addl $12, %esp
trap_return:
popal
popl %es
popl %ds
popl %fs
popl %gs
addl $8, %esp /* skip trapno, errno */
iret
/* NOT REACHED */
@@ -152,10 +144,6 @@ switch_to_real_mode:
pushl oldctx+VMX_ASSIST_CTX_EIP
pushl $-1 /* trapno, errno */
pushl $-1
pushl %gs
pushl %fs
pushl %ds
pushl %es
pushal
movl %esp, %ebp
+2 -4
View File
@@ -62,17 +62,15 @@ dump_regs(struct regs *regs)
regs->eax, regs->ecx, regs->edx, regs->ebx);
printf("esp %8x ebp %8x esi %8x edi %8x\n",
regs->esp, regs->ebp, regs->esi, regs->edi);
printf("es %8x ds %8x fs %8x gs %8x\n",
regs->es, regs->ds, regs->fs, regs->gs);
printf("trapno %8x errno %8x\n", regs->trapno, regs->errno);
printf("eip %8x cs %8x eflags %8x\n",
regs->eip, regs->cs, regs->eflags);
printf("uesp %8x uss %8x \n",
printf("uesp %8x uss %8x\n",
regs->uesp, regs->uss);
printf("ves %8x vds %8x vfs %8x vgs %8x\n",
regs->ves, regs->vds, regs->vfs, regs->vgs);
printf("cr0 %8lx cr2 %8x cr3 %8lx cr4 %8lx\n",
printf("cr0 %8lx cr2 %8x cr3 %8lx cr4 %8lx\n\n",
(long)oldctx.cr0, get_cr2(),
(long)oldctx.cr3, (long)oldctx.cr4);
}
+7 -14
View File
@@ -376,9 +376,9 @@ segment(unsigned prefix, struct regs *regs, unsigned seg)
if (prefix & SEG_SS)
seg = regs->uss;
if (prefix & SEG_FS)
seg = regs->fs;
seg = regs->vfs;
if (prefix & SEG_GS)
seg = regs->gs;
seg = regs->vgs;
return seg;
}
@@ -934,6 +934,8 @@ load_or_clear_seg(unsigned long sel, uint32_t *base, uint32_t *limit, union vmcs
static void
protected_mode(struct regs *regs)
{
extern char stack_top[];
regs->eflags &= ~(EFLAGS_TF|EFLAGS_VM);
oldctx.eip = regs->eip;
@@ -958,12 +960,10 @@ protected_mode(struct regs *regs)
&oldctx.gs_limit, &oldctx.gs_arbytes);
/* initialize jump environment to warp back to protected mode */
regs->uss = DATA_SELECTOR;
regs->uesp = stack_top;
regs->cs = CODE_SELECTOR;
regs->ds = DATA_SELECTOR;
regs->es = DATA_SELECTOR;
regs->fs = DATA_SELECTOR;
regs->gs = DATA_SELECTOR;
regs->eip = (unsigned) &switch_to_protected_mode;
regs->eip = (unsigned) switch_to_protected_mode;
/* this should get us into 32-bit mode */
}
@@ -975,10 +975,6 @@ static void
real_mode(struct regs *regs)
{
regs->eflags |= EFLAGS_VM | 0x02;
regs->ds = DATA_SELECTOR;
regs->es = DATA_SELECTOR;
regs->fs = DATA_SELECTOR;
regs->gs = DATA_SELECTOR;
/*
* When we transition from protected to real-mode and we
@@ -1070,9 +1066,6 @@ set_mode(struct regs *regs, enum vm86_mode newmode)
case VM86_PROTECTED:
if (mode == VM86_REAL_TO_PROTECTED) {
protected_mode(regs);
// printf("<VM86_PROTECTED>\n");
mode = newmode;
return;
} else
panic("unexpected protected mode transition");
break;
-2
View File
@@ -34,7 +34,6 @@
struct regs {
unsigned edi, esi, ebp, esp, ebx, edx, ecx, eax;
unsigned es, ds, fs, gs;
unsigned trapno, errno;
unsigned eip, cs, eflags, uesp, uss;
unsigned ves, vds, vfs, vgs;
@@ -55,7 +54,6 @@ enum vm86_mode {
extern enum vm86_mode prevmode, mode;
extern struct vmx_assist_context oldctx;
extern struct vmx_assist_context newctx;
extern void emulate(struct regs *);
extern void dump_regs(struct regs *);
Reference in new issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.