Commit a363e34cc51220a31691d54e576fb0e29ec02646

Authored by bellard
1 parent ea041c0e

fixed VM86 support in Virtual Linux - fixed compilation issues with gcc 2.96 - c…

…puid returns now pentium pro in order to avoid F00F bug workaround in Linux kernel


git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@277 c046a42c-6fe2-441c-8c8c-71466251a162
Showing 1 changed file with 21 additions and 4 deletions
helper-i386.c
@@ -216,7 +216,10 @@ static void do_interrupt_protected(int intno, int is_int, int error_code, @@ -216,7 +216,10 @@ static void do_interrupt_protected(int intno, int is_int, int error_code,
216 break; 216 break;
217 } 217 }
218 dpl = (e2 >> DESC_DPL_SHIFT) & 3; 218 dpl = (e2 >> DESC_DPL_SHIFT) & 3;
219 - cpl = env->segs[R_CS].selector & 3; 219 + if (env->eflags & VM_MASK)
  220 + cpl = 3;
  221 + else
  222 + cpl = env->segs[R_CS].selector & 3;
220 /* check privledge if software int */ 223 /* check privledge if software int */
221 if (is_int && dpl < cpl) 224 if (is_int && dpl < cpl)
222 raise_exception_err(EXCP0D_GPF, intno * 8 + 2); 225 raise_exception_err(EXCP0D_GPF, intno * 8 + 2);
@@ -572,13 +575,25 @@ void helper_cpuid(void) @@ -572,13 +575,25 @@ void helper_cpuid(void)
572 ECX = 0x6c65746e; 575 ECX = 0x6c65746e;
573 EDX = 0x49656e69; 576 EDX = 0x49656e69;
574 } else if (EAX == 1) { 577 } else if (EAX == 1) {
  578 + int family, model, stepping;
575 /* EAX = 1 info */ 579 /* EAX = 1 info */
576 - EAX = 0x52b; 580 +#if 0
  581 + /* pentium 75-200 */
  582 + family = 5;
  583 + model = 2;
  584 + stepping = 11;
  585 +#else
  586 + /* pentium pro */
  587 + family = 6;
  588 + model = 1;
  589 + stepping = 3;
  590 +#endif
  591 + EAX = (family << 8) | (model << 4) | stepping;
577 EBX = 0; 592 EBX = 0;
578 ECX = 0; 593 ECX = 0;
579 EDX = CPUID_FP87 | CPUID_DE | CPUID_PSE | 594 EDX = CPUID_FP87 | CPUID_DE | CPUID_PSE |
580 CPUID_TSC | CPUID_MSR | CPUID_MCE | 595 CPUID_TSC | CPUID_MSR | CPUID_MCE |
581 - CPUID_CX8; 596 + CPUID_CX8 | CPUID_PGE | CPUID_CMOV;
582 } 597 }
583 } 598 }
584 599
@@ -751,7 +766,9 @@ void jmp_seg(int selector, unsigned int new_eip) @@ -751,7 +766,9 @@ void jmp_seg(int selector, unsigned int new_eip)
751 load_seg_cache(&sc1, e1, e2); 766 load_seg_cache(&sc1, e1, e2);
752 if (new_eip > sc1.limit) 767 if (new_eip > sc1.limit)
753 raise_exception_err(EXCP0D_GPF, selector & 0xfffc); 768 raise_exception_err(EXCP0D_GPF, selector & 0xfffc);
754 - env->segs[R_CS] = sc1; 769 + env->segs[R_CS].base = sc1.base;
  770 + env->segs[R_CS].limit = sc1.limit;
  771 + env->segs[R_CS].flags = sc1.flags;
755 env->segs[R_CS].selector = (selector & 0xfffc) | cpl; 772 env->segs[R_CS].selector = (selector & 0xfffc) | cpl;
756 EIP = new_eip; 773 EIP = new_eip;
757 } else { 774 } else {