mirror of
https://github.com/xen-project/xen.git
synced 2026-10-29 18:50:05 +01:00
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:
1 parent
f5bdee9abd
commit
b3fba4e07b
5 files changed
+22
-45
No files matched your search
@@ -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);
|
||||
}
|
||||
|
||||
/*
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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 *);
|
||||
|
||||