Changeset 42407 in vbox for trunk/src/recompiler
- Timestamp:
- Jul 26, 2012 11:41:35 AM (13 years ago)
- svn:sync-xref-src-repo-rev:
- 79503
- Location:
- trunk/src/recompiler
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/recompiler/VBoxRecompiler.c
r41906 r42407 138 138 static STAMCOUNTER gStatRefuseRing1or2; 139 139 static STAMCOUNTER gStatRefuseCanExecute; 140 static STAMCOUNTER gaStatRefuseStale[6]; 140 141 static STAMCOUNTER gStatREMGDTChange; 141 142 static STAMCOUNTER gStatREMIDTChange; … … 390 391 STAM_REG(pVM, &gStatRefuseRing1or2, STAMTYPE_COUNTER, "/REM/Refuse/Ring1or2", STAMUNIT_OCCURENCES, "Raw mode refused because of ring 1/2 execution"); 391 392 STAM_REG(pVM, &gStatRefuseCanExecute, STAMTYPE_COUNTER, "/REM/Refuse/CanExecuteRaw", STAMUNIT_OCCURENCES, "Raw mode refused because of cCanExecuteRaw"); 393 STAM_REG(pVM, &gaStatRefuseStale[R_ES], STAMTYPE_COUNTER, "/REM/Refuse/StaleES", STAMUNIT_OCCURENCES, "Raw mode refused because of stale ES"); 394 STAM_REG(pVM, &gaStatRefuseStale[R_CS], STAMTYPE_COUNTER, "/REM/Refuse/StaleCS", STAMUNIT_OCCURENCES, "Raw mode refused because of stale CS"); 395 STAM_REG(pVM, &gaStatRefuseStale[R_SS], STAMTYPE_COUNTER, "/REM/Refuse/StaleSS", STAMUNIT_OCCURENCES, "Raw mode refused because of stale SS"); 396 STAM_REG(pVM, &gaStatRefuseStale[R_DS], STAMTYPE_COUNTER, "/REM/Refuse/StaleDS", STAMUNIT_OCCURENCES, "Raw mode refused because of stale DS"); 397 STAM_REG(pVM, &gaStatRefuseStale[R_FS], STAMTYPE_COUNTER, "/REM/Refuse/StaleFS", STAMUNIT_OCCURENCES, "Raw mode refused because of stale FS"); 398 STAM_REG(pVM, &gaStatRefuseStale[R_GS], STAMTYPE_COUNTER, "/REM/Refuse/StaleGS", STAMUNIT_OCCURENCES, "Raw mode refused because of stale GS"); 392 399 STAM_REG(pVM, &gStatFlushTBs, STAMTYPE_COUNTER, "/REM/FlushTB", STAMUNIT_OCCURENCES, "Number of TB flushes"); 393 400 … … 568 575 STAM_DEREG(pVM, &gStatRefuseRing1or2); 569 576 STAM_DEREG(pVM, &gStatRefuseCanExecute); 577 STAM_DEREG(pVM, &gaStatRefuseStale[0]); 578 STAM_DEREG(pVM, &gaStatRefuseStale[1]); 579 STAM_DEREG(pVM, &gaStatRefuseStale[2]); 580 STAM_DEREG(pVM, &gaStatRefuseStale[3]); 581 STAM_DEREG(pVM, &gaStatRefuseStale[4]); 582 STAM_DEREG(pVM, &gaStatRefuseStale[5]); 570 583 STAM_DEREG(pVM, &gStatFlushTBs); 571 584 … … 1664 1677 } 1665 1678 1679 /* 1680 * Stale hidden selectors means raw-mode is unsafe (being very careful). 1681 */ 1682 if (env->segs[R_CS].fVBoxFlags & CPUMSELREG_FLAGS_STALE) 1683 { 1684 Log2(("raw mode refused: stale CS (%#x)\n", env->segs[R_CS].selector)); 1685 STAM_COUNTER_INC(&gaStatRefuseStale[R_CS]); 1686 return EMSTATE_REM; 1687 } 1688 if (env->segs[R_SS].fVBoxFlags & CPUMSELREG_FLAGS_STALE) 1689 { 1690 Log2(("raw mode refused: stale SS (%#x)\n", env->segs[R_SS].selector)); 1691 STAM_COUNTER_INC(&gaStatRefuseStale[R_SS]); 1692 return EMSTATE_REM; 1693 } 1694 if (env->segs[R_DS].fVBoxFlags & CPUMSELREG_FLAGS_STALE) 1695 { 1696 Log2(("raw mode refused: stale DS (%#x)\n", env->segs[R_DS].selector)); 1697 STAM_COUNTER_INC(&gaStatRefuseStale[R_DS]); 1698 return EMSTATE_REM; 1699 } 1700 if (env->segs[R_ES].fVBoxFlags & CPUMSELREG_FLAGS_STALE) 1701 { 1702 Log2(("raw mode refused: stale ES (%#x)\n", env->segs[R_ES].selector)); 1703 STAM_COUNTER_INC(&gaStatRefuseStale[R_ES]); 1704 return EMSTATE_REM; 1705 } 1706 if (env->segs[R_FS].fVBoxFlags & CPUMSELREG_FLAGS_STALE) 1707 { 1708 Log2(("raw mode refused: stale FS (%#x)\n", env->segs[R_FS].selector)); 1709 STAM_COUNTER_INC(&gaStatRefuseStale[R_FS]); 1710 return EMSTATE_REM; 1711 } 1712 if (env->segs[R_GS].fVBoxFlags & CPUMSELREG_FLAGS_STALE) 1713 { 1714 Log2(("raw mode refused: stale GS (%#x)\n", env->segs[R_GS].selector)); 1715 STAM_COUNTER_INC(&gaStatRefuseStale[R_GS]); 1716 return EMSTATE_REM; 1717 } 1718 1666 1719 /* Assert(env->pVCpu && PGMPhysIsA20Enabled(env->pVCpu));*/ 1667 1720 *piException = EXCP_EXECUTE_RAW; … … 2042 2095 register const CPUMCTX *pCtx; 2043 2096 register unsigned fFlags; 2044 bool fHiddenSelRegsValid;2045 2097 unsigned i; 2046 2098 TRPMEVENT enmType; … … 2054 2106 pVM->rem.s.Env.pVCpu = pVCpu; 2055 2107 pCtx = pVM->rem.s.pCtx = CPUMQueryGuestCtxPtr(pVCpu); 2056 fHiddenSelRegsValid = CPUMAreHiddenSelRegsValid(pVCpu); /// @todo move this down and use fFlags.2057 2108 2058 2109 Assert(!pVM->rem.s.fInREM); … … 2277 2328 if (fFlags & CPUM_CHANGED_LDTR) 2278 2329 { 2279 if ( fHiddenSelRegsValid || (pCtx->ldtr.fFlags & CPUMSELREG_FLAGS_VALID))2330 if (pCtx->ldtr.fFlags & CPUMSELREG_FLAGS_VALID) 2280 2331 { 2281 2332 pVM->rem.s.Env.ldt.selector = pCtx->ldtr.Sel; … … 2307 2358 * Sync TR unconditionally to make life simpler. 2308 2359 */ 2309 pVM->rem.s.Env.tr.selector = pCtx->tr.Sel; 2310 pVM->rem.s.Env.tr.base = pCtx->tr.u64Base; 2311 pVM->rem.s.Env.tr.limit = pCtx->tr.u32Limit; 2312 pVM->rem.s.Env.tr.flags = (pCtx->tr.Attr.u << 8) & 0xFFFFFF; 2360 pVM->rem.s.Env.tr.selector = pCtx->tr.Sel; 2361 pVM->rem.s.Env.tr.newselector = 0; 2362 pVM->rem.s.Env.tr.fVBoxFlags = pCtx->tr.fFlags; 2363 pVM->rem.s.Env.tr.base = pCtx->tr.u64Base; 2364 pVM->rem.s.Env.tr.limit = pCtx->tr.u32Limit; 2365 pVM->rem.s.Env.tr.flags = (pCtx->tr.Attr.u << 8) & 0xFFFFFF; 2313 2366 /* Note! do_interrupt will fault if the busy flag is still set... */ 2314 pVM->rem.s.Env.tr.flags &= ~DESC_TSS_BUSY_MASK;2367 pVM->rem.s.Env.tr.flags &= ~DESC_TSS_BUSY_MASK; 2315 2368 2316 2369 /* 2317 2370 * Update selector registers. 2371 * 2318 2372 * This must be done *after* we've synced gdt, ldt and crX registers 2319 2373 * since we're reading the GDT/LDT om sync_seg. This will happen with 2320 2374 * saved state which takes a quick dip into rawmode for instance. 2321 */ 2322 /* 2323 * Stack; Note first check this one as the CPL might have changed. The 2324 * wrong CPL can cause QEmu to raise an exception in sync_seg!! 2325 */ 2326 2327 if (fHiddenSelRegsValid) 2328 { 2329 /* The hidden selector registers are valid in the CPU context. */ 2330 /* Note! QEmu saves the 2nd dword of the descriptor; we should convert the attribute word back! */ 2331 2332 /* Set current CPL */ 2333 cpu_x86_set_cpl(&pVM->rem.s.Env, uCpl); 2334 2335 cpu_x86_load_seg_cache(&pVM->rem.s.Env, R_CS, pCtx->cs.Sel, pCtx->cs.u64Base, pCtx->cs.u32Limit, (pCtx->cs.Attr.u << 8) & 0xFFFFFF); 2336 cpu_x86_load_seg_cache(&pVM->rem.s.Env, R_SS, pCtx->ss.Sel, pCtx->ss.u64Base, pCtx->ss.u32Limit, (pCtx->ss.Attr.u << 8) & 0xFFFFFF); 2337 cpu_x86_load_seg_cache(&pVM->rem.s.Env, R_DS, pCtx->ds.Sel, pCtx->ds.u64Base, pCtx->ds.u32Limit, (pCtx->ds.Attr.u << 8) & 0xFFFFFF); 2338 cpu_x86_load_seg_cache(&pVM->rem.s.Env, R_ES, pCtx->es.Sel, pCtx->es.u64Base, pCtx->es.u32Limit, (pCtx->es.Attr.u << 8) & 0xFFFFFF); 2339 cpu_x86_load_seg_cache(&pVM->rem.s.Env, R_FS, pCtx->fs.Sel, pCtx->fs.u64Base, pCtx->fs.u32Limit, (pCtx->fs.Attr.u << 8) & 0xFFFFFF); 2340 cpu_x86_load_seg_cache(&pVM->rem.s.Env, R_GS, pCtx->gs.Sel, pCtx->gs.u64Base, pCtx->gs.u32Limit, (pCtx->gs.Attr.u << 8) & 0xFFFFFF); 2341 } 2342 else 2343 { 2344 /* In 'normal' raw mode we don't have access to the hidden selector registers. */ 2345 /** @todo use hidden registers when possible and make CPUM/someone do the 2346 * reading of lazily maintained hidden registers. */ 2347 if (pVM->rem.s.Env.segs[R_SS].selector != pCtx->ss.Sel) 2348 { 2349 Log2(("REMR3State: SS changed from %04x to %04x!\n", pVM->rem.s.Env.segs[R_SS].selector, pCtx->ss.Sel)); 2350 2351 cpu_x86_set_cpl(&pVM->rem.s.Env, uCpl); 2352 sync_seg(&pVM->rem.s.Env, R_SS, pCtx->ss.Sel); 2353 #ifdef VBOX_WITH_STATISTICS 2354 if (pVM->rem.s.Env.segs[R_SS].newselector) 2355 { 2356 STAM_COUNTER_INC(&gStatSelOutOfSync[R_SS]); 2357 } 2358 #endif 2359 } 2360 else 2361 pVM->rem.s.Env.segs[R_SS].newselector = 0; 2362 2363 if (pVM->rem.s.Env.segs[R_ES].selector != pCtx->es.Sel) 2364 { 2365 Log2(("REMR3State: ES changed from %04x to %04x!\n", pVM->rem.s.Env.segs[R_ES].selector, pCtx->es.Sel)); 2366 sync_seg(&pVM->rem.s.Env, R_ES, pCtx->es.Sel); 2367 #ifdef VBOX_WITH_STATISTICS 2368 if (pVM->rem.s.Env.segs[R_ES].newselector) 2369 { 2370 STAM_COUNTER_INC(&gStatSelOutOfSync[R_ES]); 2371 } 2372 #endif 2373 } 2374 else 2375 pVM->rem.s.Env.segs[R_ES].newselector = 0; 2376 2377 if (pVM->rem.s.Env.segs[R_CS].selector != pCtx->cs.Sel) 2378 { 2379 Log2(("REMR3State: CS changed from %04x to %04x!\n", pVM->rem.s.Env.segs[R_CS].selector, pCtx->cs.Sel)); 2380 sync_seg(&pVM->rem.s.Env, R_CS, pCtx->cs.Sel); 2381 #ifdef VBOX_WITH_STATISTICS 2382 if (pVM->rem.s.Env.segs[R_CS].newselector) 2383 { 2384 STAM_COUNTER_INC(&gStatSelOutOfSync[R_CS]); 2385 } 2386 #endif 2387 } 2388 else 2389 pVM->rem.s.Env.segs[R_CS].newselector = 0; 2390 2391 if (pVM->rem.s.Env.segs[R_DS].selector != pCtx->ds.Sel) 2392 { 2393 Log2(("REMR3State: DS changed from %04x to %04x!\n", pVM->rem.s.Env.segs[R_DS].selector, pCtx->ds.Sel)); 2394 sync_seg(&pVM->rem.s.Env, R_DS, pCtx->ds.Sel); 2395 #ifdef VBOX_WITH_STATISTICS 2396 if (pVM->rem.s.Env.segs[R_DS].newselector) 2397 { 2398 STAM_COUNTER_INC(&gStatSelOutOfSync[R_DS]); 2399 } 2400 #endif 2401 } 2402 else 2403 pVM->rem.s.Env.segs[R_DS].newselector = 0; 2404 2375 * 2376 * CPL/Stack; Note first check this one as the CPL might have changed. 2377 * The wrong CPL can cause QEmu to raise an exception in sync_seg!! 2378 */ 2379 cpu_x86_set_cpl(&pVM->rem.s.Env, uCpl); 2380 /* Note! QEmu saves the 2nd dword of the descriptor; we should convert the attribute word back! */ 2381 #define SYNC_IN_SREG(a_pEnv, a_SReg, a_pRemSReg, a_pVBoxSReg) \ 2382 do \ 2383 { \ 2384 if (CPUMSELREG_ARE_HIDDEN_PARTS_VALID(pVCpu, a_pVBoxSReg)) \ 2385 { \ 2386 cpu_x86_load_seg_cache(a_pEnv, R_##a_SReg, \ 2387 (a_pVBoxSReg)->Sel, \ 2388 (a_pVBoxSReg)->u64Base, \ 2389 (a_pVBoxSReg)->u32Limit, \ 2390 ((a_pVBoxSReg)->Attr.u << 8) & 0xFFFFFF); \ 2391 (a_pRemSReg)->fVBoxFlags = (a_pVBoxSReg)->fFlags; \ 2392 } \ 2393 /* This only-reload-if-changed stuff is the old approach, we should ditch it. */ \ 2394 else if ((a_pRemSReg)->selector != (a_pVBoxSReg)->Sel) \ 2395 { \ 2396 Log2(("REMR3State: " #a_SReg " changed from %04x to %04x!\n", \ 2397 (a_pRemSReg)->selector, (a_pVBoxSReg)->Sel)); \ 2398 sync_seg(a_pEnv, R_##a_SReg, (a_pVBoxSReg)->Sel); \ 2399 if ((a_pRemSReg)->newselector) \ 2400 STAM_COUNTER_INC(&gStatSelOutOfSync[R_##a_SReg]); \ 2401 } \ 2402 else \ 2403 (a_pRemSReg)->newselector = 0; \ 2404 } while (0) 2405 2406 SYNC_IN_SREG(&pVM->rem.s.Env, CS, &pVM->rem.s.Env.segs[R_CS], &pCtx->cs); 2407 SYNC_IN_SREG(&pVM->rem.s.Env, SS, &pVM->rem.s.Env.segs[R_SS], &pCtx->ss); 2408 SYNC_IN_SREG(&pVM->rem.s.Env, DS, &pVM->rem.s.Env.segs[R_DS], &pCtx->ds); 2409 SYNC_IN_SREG(&pVM->rem.s.Env, ES, &pVM->rem.s.Env.segs[R_ES], &pCtx->es); 2410 SYNC_IN_SREG(&pVM->rem.s.Env, FS, &pVM->rem.s.Env.segs[R_FS], &pCtx->fs); 2411 SYNC_IN_SREG(&pVM->rem.s.Env, GS, &pVM->rem.s.Env.segs[R_GS], &pCtx->gs); 2405 2412 /** @todo need to find a way to communicate potential GDT/LDT changes and thread switches. The selector might 2406 2413 * be the same but not the base/limit. */ 2407 if (pVM->rem.s.Env.segs[R_FS].selector != pCtx->fs.Sel)2408 {2409 Log2(("REMR3State: FS changed from %04x to %04x!\n", pVM->rem.s.Env.segs[R_FS].selector, pCtx->fs.Sel));2410 sync_seg(&pVM->rem.s.Env, R_FS, pCtx->fs.Sel);2411 #ifdef VBOX_WITH_STATISTICS2412 if (pVM->rem.s.Env.segs[R_FS].newselector)2413 {2414 STAM_COUNTER_INC(&gStatSelOutOfSync[R_FS]);2415 }2416 #endif2417 }2418 else2419 pVM->rem.s.Env.segs[R_FS].newselector = 0;2420 2421 if (pVM->rem.s.Env.segs[R_GS].selector != pCtx->gs.Sel)2422 {2423 Log2(("REMR3State: GS changed from %04x to %04x!\n", pVM->rem.s.Env.segs[R_GS].selector, pCtx->gs.Sel));2424 sync_seg(&pVM->rem.s.Env, R_GS, pCtx->gs.Sel);2425 #ifdef VBOX_WITH_STATISTICS2426 if (pVM->rem.s.Env.segs[R_GS].newselector)2427 {2428 STAM_COUNTER_INC(&gStatSelOutOfSync[R_GS]);2429 }2430 #endif2431 }2432 else2433 pVM->rem.s.Env.segs[R_GS].newselector = 0;2434 }2435 2414 2436 2415 /* … … 2683 2662 /* Qemu and AMD/Intel have different ideas about the busy flag ... */ 2684 2663 || pCtx->tr.Attr.u != ( (pVM->rem.s.Env.tr.flags >> 8) & 0xF0FF 2685 2686 2664 ? (pVM->rem.s.Env.tr.flags | DESC_TSS_BUSY_MASK) >> 8 2665 : 0) 2687 2666 || !(pCtx->tr.fFlags & CPUMSELREG_FLAGS_VALID) 2688 2667 ) … … 2905 2884 /* Qemu and AMD/Intel have different ideas about the busy flag ... */ 2906 2885 || pCtx->tr.Attr.u != ( (pVM->rem.s.Env.tr.flags >> 8) & 0xF0FF 2907 2908 2886 ? (pVM->rem.s.Env.tr.flags | DESC_TSS_BUSY_MASK) >> 8 2887 : 0) 2909 2888 || !(pCtx->tr.fFlags & CPUMSELREG_FLAGS_VALID) 2910 2889 ) -
trunk/src/recompiler/target-i386/cpu.h
r38319 r42407 65 65 # include <VBox/vmm/vmm.h> 66 66 # include <VBox/vmm/stam.h> 67 # include <VBox/vmm/cpumctx.h> 67 68 #endif /* VBOX */ 68 69 … … 532 533 typedef struct SegmentCache { 533 534 uint32_t selector; 535 #ifdef VBOX 536 /** The new selector is saved here when we are unable to sync it before invoking the recompiled code. */ 537 uint16_t newselector; 538 uint16_t fVBoxFlags; 539 #endif 534 540 target_ulong base; 535 541 uint32_t limit; 536 542 uint32_t flags; 537 #ifdef VBOX538 /** The new selector is saved here when we are unable to sync it before invoking the recompiled code. */539 uint32_t newselector;540 #endif541 543 } SegmentCache; 542 544 … … 942 944 sc->base = base; 943 945 sc->limit = limit; 946 #ifndef VBOX 944 947 sc->flags = flags; 945 #ifdef VBOX 948 #else 949 if (flags & DESC_P_MASK) 950 flags |= DESC_A_MASK; /* Make sure the A bit is set to avoid trouble. */ 951 sc->flags = flags; 946 952 sc->newselector = 0; 953 sc->fVBoxFlags = CPUMSELREG_FLAGS_VALID; 947 954 #endif 948 955 -
trunk/src/recompiler/target-i386/op_helper.c
r39969 r42407 254 254 sc->limit = get_seg_limit(e1, e2); 255 255 sc->flags = e2; 256 #ifdef VBOX 257 sc->newselector = 0; 258 sc->fVBoxFlags = CPUMSELREG_FLAGS_VALID; 259 #endif 256 260 } 257 261 … … 557 561 env->tr.limit = tss_limit; 558 562 env->tr.flags = e2 & ~DESC_TSS_BUSY_MASK; 563 #ifdef VBOX 564 env->tr.fVBoxFlags = CPUMSELREG_FLAGS_VALID; 565 env->tr.newselector = 0; 566 #endif 559 567 560 568 if ((type & 8) && (env->cr[0] & CR0_PG_MASK)) { … … 596 604 env->ldt.limit = 0; 597 605 env->ldt.flags = 0; 606 #ifdef VBOX 607 env->ldt.fVBoxFlags = CPUMSELREG_FLAGS_VALID; 608 env->ldt.newselector = 0; 609 #endif 598 610 599 611 /* load the LDT */ … … 1954 1966 env->ldt.limit = ldl_phys(sm_state + 0x7e74); 1955 1967 env->ldt.flags = (lduw_phys(sm_state + 0x7e72) & 0xf0ff) << 8; 1968 #ifdef VBOX 1969 env->ldt.fVBoxFlags = CPUMSELREG_FLAGS_VALID; 1970 env->ldt.newselector = 0; 1971 #endif 1956 1972 1957 1973 env->idt.base = ldq_phys(sm_state + 0x7e88); … … 1962 1978 env->tr.limit = ldl_phys(sm_state + 0x7e94); 1963 1979 env->tr.flags = (lduw_phys(sm_state + 0x7e92) & 0xf0ff) << 8; 1980 #ifdef VBOX 1981 env->tr.fVBoxFlags = CPUMSELREG_FLAGS_VALID; 1982 env->tr.newselector = 0; 1983 #endif 1964 1984 1965 1985 EAX = ldq_phys(sm_state + 0x7ff8); … … 2008 2028 env->tr.limit = ldl_phys(sm_state + 0x7f60); 2009 2029 env->tr.flags = (ldl_phys(sm_state + 0x7f5c) & 0xf0ff) << 8; 2030 #ifdef VBOX 2031 env->tr.fVBoxFlags = CPUMSELREG_FLAGS_VALID; 2032 env->tr.newselector = 0; 2033 #endif 2010 2034 2011 2035 env->ldt.selector = ldl_phys(sm_state + 0x7fc0) & 0xffff; … … 2013 2037 env->ldt.limit = ldl_phys(sm_state + 0x7f7c); 2014 2038 env->ldt.flags = (ldl_phys(sm_state + 0x7f78) & 0xf0ff) << 8; 2039 #ifdef VBOX 2040 env->ldt.fVBoxFlags = CPUMSELREG_FLAGS_VALID; 2041 env->ldt.newselector = 0; 2042 #endif 2015 2043 2016 2044 env->gdt.base = ldl_phys(sm_state + 0x7f74); … … 2448 2476 env->ldt.base = 0; 2449 2477 env->ldt.limit = 0; 2478 #ifdef VBOX 2479 env->ldt.fVBoxFlags = CPUMSELREG_FLAGS_VALID; 2480 env->ldt.newselector = 0; 2481 #endif 2450 2482 } else { 2451 2483 if (selector & 0x4) … … 2510 2542 env->tr.limit = 0; 2511 2543 env->tr.flags = 0; 2544 #ifdef VBOX 2545 env->tr.fVBoxFlags = CPUMSELREG_FLAGS_VALID; 2546 env->tr.newselector = 0; 2547 #endif 2512 2548 } else { 2513 2549 if (selector & 0x4) … … 5724 5760 5725 5761 /* Successful sync. */ 5726 env1->segs[seg_reg].newselector = 0;5762 Assert(env1->segs[seg_reg].newselector == 0); 5727 5763 } 5728 5764 else … … 5741 5777 load_segment(&e1, &e2, selector); 5742 5778 cpu_x86_load_seg_cache(env, R_CS, selector, 5743 get_seg_base(e1, e2),5744 get_seg_limit(e1, e2),5745 e2);5779 get_seg_base(e1, e2), 5780 get_seg_limit(e1, e2), 5781 e2); 5746 5782 } 5747 5783 else … … 5753 5789 5754 5790 /* Successful sync. */ 5755 env1->segs[seg_reg].newselector = 0;5791 Assert(env1->segs[seg_reg].newselector == 0); 5756 5792 } 5757 5793 else
Note:
See TracChangeset
for help on using the changeset viewer.