VirtualBox

Changeset 13960 in vbox for trunk/src/VBox/VMM/VMMSwitcher


Ignore:
Timestamp:
Nov 7, 2008 1:04:45 PM (17 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
38992
Message:

Moved guest and host CPU contexts into per-VCPU array.

Location:
trunk/src/VBox/VMM/VMMSwitcher
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/VMM/VMMSwitcher/AMD64ToPAE.asm

    r12602 r13960  
    198198;
    199199; USES/DESTROYS:
    200 ;       - eax, ecx, edx
     200;       - eax, ecx, edx, r8
    201201;
    202202; ASSUMPTION:
     
    206206ALIGNCODE(16)
    207207BEGINPROC vmmR0HostToGuestAsm
     208    ;; Store the offset from CPUM to CPUMCPU in r8
     209    mov     r8, [rdx + CPUM.ulOffCPUMCPU]
     210   
    208211    ;;
    209212    ;; Save CPU host context
     
    211214    ;;
    212215    ; general registers.
    213     ; mov     [rdx + CPUM.Host.rax], rax - scratch
    214     mov     [rdx + CPUM.Host.rbx], rbx
    215     ; mov     [rdx + CPUM.Host.rcx], rcx - scratch
    216     ; mov     [rdx + CPUM.Host.rdx], rdx - scratch
    217     mov     [rdx + CPUM.Host.rdi], rdi
    218     mov     [rdx + CPUM.Host.rsi], rsi
    219     mov     [rdx + CPUM.Host.rsp], rsp
    220     mov     [rdx + CPUM.Host.rbp], rbp
    221     ; mov     [rdx + CPUM.Host.r8 ], r8 - scratch
    222     ; mov     [rdx + CPUM.Host.r9 ], r9 - scratch
    223     mov     [rdx + CPUM.Host.r10], r10
    224     mov     [rdx + CPUM.Host.r11], r11
    225     mov     [rdx + CPUM.Host.r12], r12
    226     mov     [rdx + CPUM.Host.r13], r13
    227     mov     [rdx + CPUM.Host.r14], r14
    228     mov     [rdx + CPUM.Host.r15], r15
     216    ; mov     [rdx + r8 + CPUMCPU.Host.rax], rax - scratch
     217    mov     [rdx + r8 + CPUMCPU.Host.rbx], rbx
     218    ; mov     [rdx + r8 + CPUMCPU.Host.rcx], rcx - scratch
     219    ; mov     [rdx + r8 + CPUMCPU.Host.rdx], rdx - scratch
     220    mov     [rdx + r8 + CPUMCPU.Host.rdi], rdi
     221    mov     [rdx + r8 + CPUMCPU.Host.rsi], rsi
     222    mov     [rdx + r8 + CPUMCPU.Host.rsp], rsp
     223    mov     [rdx + r8 + CPUMCPU.Host.rbp], rbp
     224    ; mov     [rdx + r8 + CPUMCPU.Host.r8 ], r8 - scratch
     225    ; mov     [rdx + r8 + CPUMCPU.Host.r9 ], r9 - scratch
     226    mov     [rdx + r8 + CPUMCPU.Host.r10], r10
     227    mov     [rdx + r8 + CPUMCPU.Host.r11], r11
     228    mov     [rdx + r8 + CPUMCPU.Host.r12], r12
     229    mov     [rdx + r8 + CPUMCPU.Host.r13], r13
     230    mov     [rdx + r8 + CPUMCPU.Host.r14], r14
     231    mov     [rdx + r8 + CPUMCPU.Host.r15], r15
    229232    ; selectors.
    230     mov     [rdx + CPUM.Host.ds], ds
    231     mov     [rdx + CPUM.Host.es], es
    232     mov     [rdx + CPUM.Host.fs], fs
    233     mov     [rdx + CPUM.Host.gs], gs
    234     mov     [rdx + CPUM.Host.ss], ss
     233    mov     [rdx + r8 + CPUMCPU.Host.ds], ds
     234    mov     [rdx + r8 + CPUMCPU.Host.es], es
     235    mov     [rdx + r8 + CPUMCPU.Host.fs], fs
     236    mov     [rdx + r8 + CPUMCPU.Host.gs], gs
     237    mov     [rdx + r8 + CPUMCPU.Host.ss], ss
    235238    ; MSRs
    236239    mov     rbx, rdx
    237240    mov     ecx, MSR_K8_FS_BASE
    238241    rdmsr
    239     mov     [rbx + CPUM.Host.FSbase], eax
    240     mov     [rbx + CPUM.Host.FSbase + 4], edx
     242    mov     [rbx + r8 + CPUMCPU.Host.FSbase], eax
     243    mov     [rbx + r8 + CPUMCPU.Host.FSbase + 4], edx
    241244    mov     ecx, MSR_K8_GS_BASE
    242245    rdmsr
    243     mov     [rbx + CPUM.Host.GSbase], eax
    244     mov     [rbx + CPUM.Host.GSbase + 4], edx
     246    mov     [rbx + r8 + CPUMCPU.Host.GSbase], eax
     247    mov     [rbx + r8 + CPUMCPU.Host.GSbase + 4], edx
    245248    mov     ecx, MSR_K6_EFER
    246249    rdmsr
    247     mov     [rbx + CPUM.Host.efer], eax
    248     mov     [rbx + CPUM.Host.efer + 4], edx
     250    mov     [rbx + r8 + CPUMCPU.Host.efer], eax
     251    mov     [rbx + r8 + CPUMCPU.Host.efer + 4], edx
    249252    mov     ecx, MSR_K6_EFER
    250253    mov     rdx, rbx
    251254    ; special registers.
    252     sldt    [rdx + CPUM.Host.ldtr]
    253     sidt    [rdx + CPUM.Host.idtr]
    254     sgdt    [rdx + CPUM.Host.gdtr]
    255     str     [rdx + CPUM.Host.tr]        ; yasm BUG, generates sldt. YASMCHECK!
     255    sldt    [rdx + r8 + CPUMCPU.Host.ldtr]
     256    sidt    [rdx + r8 + CPUMCPU.Host.idtr]
     257    sgdt    [rdx + r8 + CPUMCPU.Host.gdtr]
     258    str     [rdx + r8 + CPUMCPU.Host.tr]        ; yasm BUG, generates sldt. YASMCHECK!
    256259    ; flags
    257260    pushf
    258     pop     qword [rdx + CPUM.Host.rflags]
     261    pop     qword [rdx + r8 + CPUMCPU.Host.rflags]
    259262
    260263    FIXUP FIX_NO_SYSENTER_JMP, 0, htg_no_sysenter - NAME(Start) ; this will insert a jmp htg_no_sysenter if host doesn't use sysenter.
     
    263266    mov     rbx, rdx                    ; save edx
    264267    rdmsr                               ; edx:eax <- MSR[ecx]
    265     mov     [rbx + CPUM.Host.SysEnter.cs], rax
    266     mov     [rbx + CPUM.Host.SysEnter.cs + 4], rdx
     268    mov     [rbx + r8 + CPUMCPU.Host.SysEnter.cs], rax
     269    mov     [rbx + r8 + CPUMCPU.Host.SysEnter.cs + 4], rdx
    267270    xor     rax, rax                    ; load 0:0 to cause #GP upon sysenter
    268271    xor     rdx, rdx
     
    275278
    276279    ;; handle use flags.
    277     mov     esi, [rdx + CPUM.fUseFlags] ; esi == use flags.
     280    mov     esi, [rdx + r8 + CPUMCPU.fUseFlags] ; esi == use flags.
    278281    and     esi, ~CPUM_USED_FPU   ; Clear CPUM_USED_* flags. ;;@todo FPU check can be optimized to use cr0 flags!
    279     mov     [rdx + CPUM.fUseFlags], esi
     282    mov     [rdx + r8 + CPUMCPU.fUseFlags], esi
    280283
    281284    ; debug registers.
     
    288291    ; control registers.
    289292    mov     rax, cr0
    290     mov     [rdx + CPUM.Host.cr0], rax
    291     ;mov     rax, cr2                   ; assume host os don't suff things in cr2. (safe)
    292     ;mov     [rdx + CPUM.Host.cr2], rax
     293    mov     [rdx + r8 + CPUMCPU.Host.cr0], rax
     294    ;mov     rax, cr2                   ; assume host os don't stuff things in cr2. (safe)
     295    ;mov     [rdx + r8 + CPUMCPU.Host.cr2], rax
    293296    mov     rax, cr3
    294     mov     [rdx + CPUM.Host.cr3], rax
     297    mov     [rdx + r8 + CPUMCPU.Host.cr3], rax
    295298    mov     rax, cr4
    296     mov     [rdx + CPUM.Host.cr4], rax
     299    mov     [rdx + r8 + CPUMCPU.Host.cr4], rax
    297300
    298301    ;;
     
    306309    ;
    307310    and     rax, X86_CR4_MCE | X86_CR4_PSE | X86_CR4_PAE
    308     mov     ecx, [rdx + CPUM.Guest.cr4]
     311    mov     ecx, [rdx + r8 + CPUMCPU.Guest.cr4]
    309312    DEBUG_CHAR('b')                     ; trashes esi
    310     ;; @todo Switcher cleanup: Determin base CR4 during CPUMR0Init / VMMR3SelectSwitcher putting it
     313    ;; @todo Switcher cleanup: Determine base CR4 during CPUMR0Init / VMMR3SelectSwitcher putting it
    311314    ;                          in CPUM.Hyper.cr4 (which isn't currently being used). That should
    312315    ;                          simplify this operation a bit (and improve locality of the data).
     
    322325    DEBUG_CHAR('c')                     ; trashes esi
    323326
    324     mov     eax, [rdx + CPUM.Guest.cr0]
     327    mov     eax, [rdx + r8 + CPUMCPU.Guest.cr0]
    325328    and     eax, X86_CR0_EM
    326329    or      eax, X86_CR0_PE | X86_CR0_PG | X86_CR0_TS | X86_CR0_ET | X86_CR0_NE | X86_CR0_MP
     
    360363DEBUG_S_CHAR('s');
    361364    mov     rax, dr7                    ; not sure, but if I read the docs right this will trap if GD is set. FIXME!!!
    362     mov     [rdx + CPUM.Host.dr7], rax
     365    mov     [rdx + r8 + CPUMCPU.Host.dr7], rax
    363366    xor     eax, eax                    ; clear everything. (bit 12? is read as 1...)
    364367    mov     dr7, rax
    365368    mov     rax, dr6                    ; just in case we save the state register too.
    366     mov     [rdx + CPUM.Host.dr6], rax
     369    mov     [rdx + r8 + CPUMCPU.Host.dr6], rax
    367370    ; save host DR0-3?
    368371    test    esi, CPUM_USE_DEBUG_REGS
     
    370373DEBUG_S_CHAR('S');
    371374    mov     rax, dr0
    372     mov     [rdx + CPUM.Host.dr0], rax
     375    mov     [rdx + r8 + CPUMCPU.Host.dr0], rax
    373376    mov     rbx, dr1
    374     mov     [rdx + CPUM.Host.dr1], rbx
     377    mov     [rdx + r8 + CPUMCPU.Host.dr1], rbx
    375378    mov     rcx, dr2
    376     mov     [rdx + CPUM.Host.dr2], rcx
     379    mov     [rdx + r8 + CPUMCPU.Host.dr2], rcx
    377380    mov     rax, dr3
    378     mov     [rdx + CPUM.Host.dr3], rax
     381    mov     [rdx + r8 + CPUMCPU.Host.dr3], rax
    379382    jmp     htg_debug_regs_no
    380383
     
    472475
    473476    ;; use flags.
    474     mov     esi, [edx + CPUM.fUseFlags]
     477    mov     esi, [edx + CPUM.ulOffCPUMCPU]
     478    mov     esi, [edx + esi + CPUMCPU.fUseFlags]
    475479
    476480    ; debug registers
     
    632636    FIXUP FIX_GC_CPUM_OFF, 1, 0
    633637    mov     edx, 0ffffffffh
    634 
     638    ; Convert to CPUMCPU pointer
     639    add     edx, [edx + CPUM.ulOffCPUMCPU]
     640   
    635641    ; Skip return address (assumes called!)
    636642    lea     esp, [esp + 4]
     
    642648    push    eax                         ; save return code.
    643649    mov     eax, [esp + 4 + CPUMCTXCORE.edi]
    644     mov     [edx + CPUM.Guest.edi], eax
     650    mov     [edx + CPUMCPU.Guest.edi], eax
    645651    mov     eax, [esp + 4 + CPUMCTXCORE.esi]
    646     mov     [edx + CPUM.Guest.esi], eax
     652    mov     [edx + CPUMCPU.Guest.esi], eax
    647653    mov     eax, [esp + 4 + CPUMCTXCORE.ebp]
    648     mov     [edx + CPUM.Guest.ebp], eax
     654    mov     [edx + CPUMCPU.Guest.ebp], eax
    649655    mov     eax, [esp + 4 + CPUMCTXCORE.eax]
    650     mov     [edx + CPUM.Guest.eax], eax
     656    mov     [edx + CPUMCPU.Guest.eax], eax
    651657    mov     eax, [esp + 4 + CPUMCTXCORE.ebx]
    652     mov     [edx + CPUM.Guest.ebx], eax
     658    mov     [edx + CPUMCPU.Guest.ebx], eax
    653659    mov     eax, [esp + 4 + CPUMCTXCORE.edx]
    654     mov     [edx + CPUM.Guest.edx], eax
     660    mov     [edx + CPUMCPU.Guest.edx], eax
    655661    mov     eax, [esp + 4 + CPUMCTXCORE.ecx]
    656     mov     [edx + CPUM.Guest.ecx], eax
     662    mov     [edx + CPUMCPU.Guest.ecx], eax
    657663    mov     eax, [esp + 4 + CPUMCTXCORE.esp]
    658     mov     [edx + CPUM.Guest.esp], eax
     664    mov     [edx + CPUMCPU.Guest.esp], eax
    659665    ; selectors
    660666    mov     eax, [esp + 4 + CPUMCTXCORE.ss]
    661     mov     [edx + CPUM.Guest.ss], eax
     667    mov     [edx + CPUMCPU.Guest.ss], eax
    662668    mov     eax, [esp + 4 + CPUMCTXCORE.gs]
    663     mov     [edx + CPUM.Guest.gs], eax
     669    mov     [edx + CPUMCPU.Guest.gs], eax
    664670    mov     eax, [esp + 4 + CPUMCTXCORE.fs]
    665     mov     [edx + CPUM.Guest.fs], eax
     671    mov     [edx + CPUMCPU.Guest.fs], eax
    666672    mov     eax, [esp + 4 + CPUMCTXCORE.es]
    667     mov     [edx + CPUM.Guest.es], eax
     673    mov     [edx + CPUMCPU.Guest.es], eax
    668674    mov     eax, [esp + 4 + CPUMCTXCORE.ds]
    669     mov     [edx + CPUM.Guest.ds], eax
     675    mov     [edx + CPUMCPU.Guest.ds], eax
    670676    mov     eax, [esp + 4 + CPUMCTXCORE.cs]
    671     mov     [edx + CPUM.Guest.cs], eax
     677    mov     [edx + CPUMCPU.Guest.cs], eax
    672678    ; flags
    673679    mov     eax, [esp + 4 + CPUMCTXCORE.eflags]
    674     mov     [edx + CPUM.Guest.eflags], eax
     680    mov     [edx + CPUMCPU.Guest.eflags], eax
    675681    ; eip
    676682    mov     eax, [esp + 4 + CPUMCTXCORE.eip]
    677     mov     [edx + CPUM.Guest.eip], eax
     683    mov     [edx + CPUMCPU.Guest.eip], eax
    678684    ; jump to common worker code.
    679685    pop     eax                         ; restore return code.
     686    ; Load CPUM into edx again
     687    sub     edx, [edx + CPUMCPU.ulOffCPUM]
    680688
    681689    add     esp, CPUMCTXCORE_size      ; skip CPUMCTXCORE structure
     
    913921
    914922    ; load final cr3
    915     mov     rsi, [rdx + CPUM.Host.cr3]
     923    mov     rsi, [rdx + r8 + CPUMCPU.Host.cr3]
    916924    mov     cr3, rsi
    917925    DEBUG_CHAR('@')
     
    922930    ; Load CPUM pointer into edx
    923931    mov     rdx, [NAME(pCpumHC) wrt rip]
     932    ; Load the CPUMCPU offset.
     933    mov     r8, [rdx + CPUM.ulOffCPUMCPU]
     934   
    924935    ; activate host gdt and idt
    925     lgdt    [rdx + CPUM.Host.gdtr]
     936    lgdt    [rdx + r8 + CPUMCPU.Host.gdtr]
    926937    DEBUG_CHAR('0')
    927     lidt    [rdx + CPUM.Host.idtr]
     938    lidt    [rdx + r8 + CPUMCPU.Host.idtr]
    928939    DEBUG_CHAR('1')
    929940    ; Restore TSS selector; must mark it as not busy before using ltr (!)
    930941%if 1 ; ASSUME that this is supposed to be 'BUSY'. (saves 20-30 ticks on the T42p)
    931     movzx   eax, word [rdx + CPUM.Host.tr]          ; eax <- TR
     942    movzx   eax, word [rdx + r8 + CPUMCPU.Host.tr]          ; eax <- TR
    932943    and     al, 0F8h                                ; mask away TI and RPL bits, get descriptor offset.
    933     add     rax, [rdx + CPUM.Host.gdtr + 2]         ; eax <- GDTR.address + descriptor offset.
     944    add     rax, [rdx + r8 + CPUMCPU.Host.gdtr + 2]         ; eax <- GDTR.address + descriptor offset.
    934945    and     dword [rax + 4], ~0200h                 ; clear busy flag (2nd type2 bit)
    935     ltr     word [rdx + CPUM.Host.tr]
     946    ltr     word [rdx + r8 + CPUMCPU.Host.tr]
    936947%else
    937     movzx   eax, word [rdx + CPUM.Host.tr]          ; eax <- TR
     948    movzx   eax, word [rdx + r8 + CPUMCPU.Host.tr]          ; eax <- TR
    938949    and     al, 0F8h                                ; mask away TI and RPL bits, get descriptor offset.
    939     add     rax, [rdx + CPUM.Host.gdtr + 2]         ; eax <- GDTR.address + descriptor offset.
     950    add     rax, [rdx + r8 + CPUMCPU.Host.gdtr + 2]         ; eax <- GDTR.address + descriptor offset.
    940951    mov     ecx, [rax + 4]                          ; ecx <- 2nd descriptor dword
    941952    mov     ebx, ecx                                ; save orginal value
    942953    and     ecx, ~0200h                             ; clear busy flag (2nd type2 bit)
    943954    mov     [rax + 4], ccx                          ; not using xchg here is paranoia..
    944     ltr     word [rdx + CPUM.Host.tr]
     955    ltr     word [rdx + r8 + CPUMCPU.Host.tr]
    945956    xchg    [rax + 4], ebx                          ; using xchg is paranoia too...
    946957%endif
    947958    ; activate ldt
    948959    DEBUG_CHAR('2')
    949     lldt    [rdx + CPUM.Host.ldtr]
     960    lldt    [rdx + r8 + CPUMCPU.Host.ldtr]
    950961    ; Restore segment registers
    951     mov     eax, [rdx + CPUM.Host.ds]
     962    mov     eax, [rdx + r8 + CPUMCPU.Host.ds]
    952963    mov     ds, eax
    953     mov     eax, [rdx + CPUM.Host.es]
     964    mov     eax, [rdx + r8 + CPUMCPU.Host.es]
    954965    mov     es, eax
    955     mov     eax, [rdx + CPUM.Host.fs]
     966    mov     eax, [rdx + r8 + CPUMCPU.Host.fs]
    956967    mov     fs, eax
    957     mov     eax, [rdx + CPUM.Host.gs]
     968    mov     eax, [rdx + r8 + CPUMCPU.Host.gs]
    958969    mov     gs, eax
    959970    ; restore stack
    960     mov     eax, [rdx + CPUM.Host.ss]
     971    mov     eax, [rdx + r8 + CPUMCPU.Host.ss]
    961972    mov     ss, eax
    962     mov     rsp, [rdx + CPUM.Host.rsp]
     973    mov     rsp, [rdx + r8 + CPUMCPU.Host.rsp]
    963974
    964975    FIXUP FIX_NO_SYSENTER_JMP, 0, gth_sysenter_no - NAME(Start) ; this will insert a jmp gth_sysenter_no if host doesn't use sysenter.
    965976    ; restore MSR_IA32_SYSENTER_CS register.
    966977    mov     ecx, MSR_IA32_SYSENTER_CS
    967     mov     eax, [rdx + CPUM.Host.SysEnter.cs]
    968     mov     ebx, [rdx + CPUM.Host.SysEnter.cs + 4]
     978    mov     eax, [rdx + r8 + CPUMCPU.Host.SysEnter.cs]
     979    mov     ebx, [rdx + r8 + CPUMCPU.Host.SysEnter.cs + 4]
    969980    mov     rbx, rdx                    ; save/load edx
    970981    wrmsr                               ; MSR[ecx] <- edx:eax
     
    979990    ; Restore FPU if guest has used it.
    980991    ; Using fxrstor should ensure that we're not causing unwanted exception on the host.
    981     mov     esi, [rdx + CPUM.fUseFlags] ; esi == use flags.
     992    mov     esi, [rdx + r8 + CPUMCPU.fUseFlags] ; esi == use flags.
    982993    test    esi, CPUM_USED_FPU
    983994    jz short gth_fpu_no
     
    986997    mov     cr0, rcx
    987998
    988     fxsave  [rdx + CPUM.Guest.fpu]
    989     fxrstor [rdx + CPUM.Host.fpu]
     999    fxsave  [rdx + r8 + CPUMCPU.Guest.fpu]
     1000    fxrstor [rdx + r8 + CPUMCPU.Host.fpu]
    9901001    jmp short gth_fpu_no
    9911002
     
    9961007    ; Would've liked to have these highere up in case of crashes, but
    9971008    ; the fpu stuff must be done before we restore cr0.
    998     mov     rcx, [rdx + CPUM.Host.cr4]
     1009    mov     rcx, [rdx + r8 + CPUMCPU.Host.cr4]
    9991010    mov     cr4, rcx
    1000     mov     rcx, [rdx + CPUM.Host.cr0]
     1011    mov     rcx, [rdx + r8 + CPUMCPU.Host.cr0]
    10011012    mov     cr0, rcx
    1002     ;mov     rcx, [rdx + CPUM.Host.cr2] ; assumes this is waste of time.
     1013    ;mov     rcx, [rdx + r8 + CPUMCPU.Host.cr2] ; assumes this is waste of time.
    10031014    ;mov     cr2, rcx
    10041015
     
    10131024    mov     rbx, rdx
    10141025    mov     ecx, MSR_K8_FS_BASE
    1015     mov     eax, [rbx + CPUM.Host.FSbase]
    1016     mov     edx, [rbx + CPUM.Host.FSbase + 4]
     1026    mov     eax, [rbx + r8 + CPUMCPU.Host.FSbase]
     1027    mov     edx, [rbx + r8 + CPUMCPU.Host.FSbase + 4]
    10171028    wrmsr
    10181029    mov     ecx, MSR_K8_GS_BASE
    1019     mov     eax, [rbx + CPUM.Host.GSbase]
    1020     mov     edx, [rbx + CPUM.Host.GSbase + 4]
     1030    mov     eax, [rbx + r8 + CPUMCPU.Host.GSbase]
     1031    mov     edx, [rbx + r8 + CPUMCPU.Host.GSbase + 4]
    10211032    wrmsr
    10221033    mov     ecx, MSR_K6_EFER
    1023     mov     eax, [rbx + CPUM.Host.efer]
    1024     mov     edx, [rbx + CPUM.Host.efer + 4]
     1034    mov     eax, [rbx + r8 + CPUMCPU.Host.efer]
     1035    mov     edx, [rbx + r8 + CPUMCPU.Host.efer + 4]
    10251036    wrmsr
    10261037    mov     rdx, rbx
     
    10291040    ; restore general registers.
    10301041    mov     eax, edi                    ; restore return code. eax = return code !!
    1031     ; mov     rax, [rdx + CPUM.Host.rax] - scratch + return code
    1032     mov     rbx, [rdx + CPUM.Host.rbx]
    1033     ; mov     rcx, [rdx + CPUM.Host.rcx] - scratch
    1034     ; mov     rdx, [rdx + CPUM.Host.rdx] - scratch
    1035     mov     rdi, [rdx + CPUM.Host.rdi]
    1036     mov     rsi, [rdx + CPUM.Host.rsi]
    1037     mov     rsp, [rdx + CPUM.Host.rsp]
    1038     mov     rbp, [rdx + CPUM.Host.rbp]
    1039     ; mov     r8,  [rdx + CPUM.Host.r8 ] - scratch
    1040     ; mov     r9,  [rdx + CPUM.Host.r9 ] - scratch
    1041     mov     r10, [rdx + CPUM.Host.r10]
    1042     mov     r11, [rdx + CPUM.Host.r11]
    1043     mov     r12, [rdx + CPUM.Host.r12]
    1044     mov     r13, [rdx + CPUM.Host.r13]
    1045     mov     r14, [rdx + CPUM.Host.r14]
    1046     mov     r15, [rdx + CPUM.Host.r15]
     1042    ; mov     rax, [rdx + r8 + CPUMCPU.Host.rax] - scratch + return code
     1043    mov     rbx, [rdx + r8 + CPUMCPU.Host.rbx]
     1044    ; mov     rcx, [rdx + r8 + CPUMCPU.Host.rcx] - scratch
     1045    ; mov     rdx, [rdx + r8 + CPUMCPU.Host.rdx] - scratch
     1046    mov     rdi, [rdx + r8 + CPUMCPU.Host.rdi]
     1047    mov     rsi, [rdx + r8 + CPUMCPU.Host.rsi]
     1048    mov     rsp, [rdx + r8 + CPUMCPU.Host.rsp]
     1049    mov     rbp, [rdx + r8 + CPUMCPU.Host.rbp]
     1050    ; mov     r8,  [rdx + r8 + CPUMCPU.Host.r8 ] - scratch
     1051    ; mov     r9,  [rdx + r8 + CPUMCPU.Host.r9 ] - scratch
     1052    mov     r10, [rdx + r8 + CPUMCPU.Host.r10]
     1053    mov     r11, [rdx + r8 + CPUMCPU.Host.r11]
     1054    mov     r12, [rdx + r8 + CPUMCPU.Host.r12]
     1055    mov     r13, [rdx + r8 + CPUMCPU.Host.r13]
     1056    mov     r14, [rdx + r8 + CPUMCPU.Host.r14]
     1057    mov     r15, [rdx + r8 + CPUMCPU.Host.r15]
    10471058
    10481059    ; finally restore flags. (probably not required)
    1049     push    qword [rdx + CPUM.Host.rflags]
     1060    push    qword [rdx + r8 + CPUMCPU.Host.rflags]
    10501061    popf
    10511062
     
    10671078    jz short gth_debug_regs_dr7
    10681079    DEBUG_S_CHAR('r')
    1069     mov     rax, [rdx + CPUM.Host.dr0]
     1080    mov     rax, [rdx + r8 + CPUMCPU.Host.dr0]
    10701081    mov     dr0, rax
    1071     mov     rbx, [rdx + CPUM.Host.dr1]
     1082    mov     rbx, [rdx + r8 + CPUMCPU.Host.dr1]
    10721083    mov     dr1, rbx
    1073     mov     rcx, [rdx + CPUM.Host.dr2]
     1084    mov     rcx, [rdx + r8 + CPUMCPU.Host.dr2]
    10741085    mov     dr2, rcx
    1075     mov     rax, [rdx + CPUM.Host.dr3]
     1086    mov     rax, [rdx + r8 + CPUMCPU.Host.dr3]
    10761087    mov     dr3, rax
    10771088gth_debug_regs_dr7:
    1078     mov     rbx, [rdx + CPUM.Host.dr6]
     1089    mov     rbx, [rdx + r8 + CPUMCPU.Host.dr6]
    10791090    mov     dr6, rbx
    1080     mov     rcx, [rdx + CPUM.Host.dr7]
     1091    mov     rcx, [rdx + r8 + CPUMCPU.Host.dr7]
    10811092    mov     dr7, rcx
    10821093    jmp     gth_debug_regs_no
  • trunk/src/VBox/VMM/VMMSwitcher/PAEand32Bit.mac

    r12602 r13960  
    119119    ;;      Skip eax, edx and ecx as these are not preserved over calls.
    120120    ;;
     121    CPUMCPU_FROM_CPUM(edx)
    121122    ; general registers.
    122     mov     [edx + CPUM.Host.ebx], ebx
    123     mov     [edx + CPUM.Host.edi], edi
    124     mov     [edx + CPUM.Host.esi], esi
    125     mov     [edx + CPUM.Host.esp], esp
    126     mov     [edx + CPUM.Host.ebp], ebp
     123    mov     [edx + CPUMCPU.Host.ebx], ebx
     124    mov     [edx + CPUMCPU.Host.edi], edi
     125    mov     [edx + CPUMCPU.Host.esi], esi
     126    mov     [edx + CPUMCPU.Host.esp], esp
     127    mov     [edx + CPUMCPU.Host.ebp], ebp
    127128    ; selectors.
    128     mov     [edx + CPUM.Host.ds], ds
    129     mov     [edx + CPUM.Host.es], es
    130     mov     [edx + CPUM.Host.fs], fs
    131     mov     [edx + CPUM.Host.gs], gs
    132     mov     [edx + CPUM.Host.ss], ss
     129    mov     [edx + CPUMCPU.Host.ds], ds
     130    mov     [edx + CPUMCPU.Host.es], es
     131    mov     [edx + CPUMCPU.Host.fs], fs
     132    mov     [edx + CPUMCPU.Host.gs], gs
     133    mov     [edx + CPUMCPU.Host.ss], ss
    133134    ; special registers.
    134     sldt    [edx + CPUM.Host.ldtr]
    135     sidt    [edx + CPUM.Host.idtr]
    136     sgdt    [edx + CPUM.Host.gdtr]
    137     str     [edx + CPUM.Host.tr]
     135    sldt    [edx + CPUMCPU.Host.ldtr]
     136    sidt    [edx + CPUMCPU.Host.idtr]
     137    sgdt    [edx + CPUMCPU.Host.gdtr]
     138    str     [edx + CPUMCPU.Host.tr]
    138139    ; flags
    139140    pushfd
    140     pop     dword [edx + CPUM.Host.eflags]
     141    pop     dword [edx + CPUMCPU.Host.eflags]
    141142
    142143    FIXUP FIX_NO_SYSENTER_JMP, 0, htg_no_sysenter - NAME(Start) ; this will insert a jmp htg_no_sysenter if host doesn't use sysenter.
     
    145146    mov     ebx, edx                    ; save edx
    146147    rdmsr                               ; edx:eax <- MSR[ecx]
    147     mov     [ebx + CPUM.Host.SysEnter.cs], eax
    148     mov     [ebx + CPUM.Host.SysEnter.cs + 4], edx
     148    mov     [ebx + CPUMCPU.Host.SysEnter.cs], eax
     149    mov     [ebx + CPUMCPU.Host.SysEnter.cs + 4], edx
    149150    xor     eax, eax                    ; load 0:0 to cause #GP upon sysenter
    150151    xor     edx, edx
     
    157158
    158159    ;; handle use flags.
    159     mov     esi, [edx + CPUM.fUseFlags] ; esi == use flags.
     160    mov     esi, [edx + CPUMCPU.fUseFlags] ; esi == use flags.
    160161    and     esi, ~CPUM_USED_FPU         ; Clear CPUM_USED_* flags. ;;@todo FPU check can be optimized to use cr0 flags!
    161     mov     [edx + CPUM.fUseFlags], esi
     162    mov     [edx + CPUMCPU.fUseFlags], esi
    162163
    163164    ; debug registers.
     
    169170    ; control registers.
    170171    mov     eax, cr0
    171     mov     [edx + CPUM.Host.cr0], eax
     172    mov     [edx + CPUMCPU.Host.cr0], eax
    172173    ;mov     eax, cr2                   ; assume host os don't suff things in cr2. (safe)
    173     ;mov     [edx + CPUM.Host.cr2], eax
     174    ;mov     [edx + CPUMCPU.Host.cr2], eax
    174175    mov     eax, cr3
    175     mov     [edx + CPUM.Host.cr3], eax
     176    mov     [edx + CPUMCPU.Host.cr3], eax
    176177    mov     eax, cr4
    177     mov     [edx + CPUM.Host.cr4], eax
     178    mov     [edx + CPUMCPU.Host.cr4], eax
    178179
    179180    ;;
     
    188189    ;
    189190    and     eax, X86_CR4_MCE | X86_CR4_PSE | X86_CR4_PAE | X86_CR4_VMXE
    190     mov     ecx, [edx + CPUM.Guest.cr4]
     191    mov     ecx, [edx + CPUMCPU.Guest.cr4]
    191192    ;; @todo Switcher cleanup: Determin base CR4 during CPUMR0Init / VMMR3SelectSwitcher putting it
    192193    ;                          in CPUM.Hyper.cr4 (which isn't currently being used). That should
     
    197198    ; FXSAVE support on the host CPU
    198199    ;
     200    CPUM_FROM_CPUMCPU(edx)
    199201    and     ecx, [edx + CPUM.CR4.AndMask]
    200202    or      eax, ecx
     
    202204    mov     cr4, eax
    203205
    204     mov     eax, [edx + CPUM.Guest.cr0]
     206    CPUMCPU_FROM_CPUM(edx)
     207    mov     eax, [edx + CPUMCPU.Guest.cr0]
    205208    and     eax, X86_CR0_EM
    206209    or      eax, X86_CR0_PE | X86_CR0_PG | X86_CR0_TS | X86_CR0_ET | X86_CR0_NE | X86_CR0_MP
    207210    mov     cr0, eax
    208211
     212    CPUM_FROM_CPUMCPU(edx)
    209213    ; Load new gdt so we can do far jump to guest code after cr3 reload.
    210214    lgdt    [edx + CPUM.Hyper.gdtr]
     
    307311    DEBUG_CHAR('7')
    308312
     313    CPUMCPU_FROM_CPUM(edx)
    309314    ;; use flags.
    310     mov     esi, [edx + CPUM.fUseFlags]
     315    mov     esi, [edx + CPUMCPU.fUseFlags]
     316    CPUM_FROM_CPUMCPU(edx)
    311317
    312318    ; debug registers
     
    389395htg_debug_regs_save_dr7and6:
    390396DEBUG_S_CHAR('s');
     397    CPUMCPU_FROM_CPUM(edx)
    391398    mov     eax, dr7                    ; not sure, but if I read the docs right this will trap if GD is set. FIXME!!!
    392     mov     [edx + CPUM.Host.dr7], eax
     399    mov     [edx + CPUMCPU.Host.dr7], eax
    393400    xor     eax, eax                    ; clear everything. (bit 12? is read as 1...)
    394401    mov     dr7, eax
    395402    mov     eax, dr6                    ; just in case we save the state register too.
    396     mov     [edx + CPUM.Host.dr6], eax
     403    mov     [edx + CPUMCPU.Host.dr6], eax
     404    CPUM_FROM_CPUMCPU(edx)
    397405    jmp     htg_debug_regs_no
    398406
     
    404412    DEBUG_S_CHAR('R')
    405413    DEBUG_S_CHAR('x')
     414    CPUMCPU_FROM_CPUM(edx)
    406415    ; save host DR0-3.
    407416    mov     eax, dr0
    408     mov     [edx + CPUM.Host.dr0], eax
     417    mov     [edx + CPUMCPU.Host.dr0], eax
    409418    mov     ebx, dr1
    410     mov     [edx + CPUM.Host.dr1], ebx
     419    mov     [edx + CPUMCPU.Host.dr1], ebx
    411420    mov     ecx, dr2
    412     mov     [edx + CPUM.Host.dr2], ecx
     421    mov     [edx + CPUMCPU.Host.dr2], ecx
    413422    mov     eax, dr3
    414     mov     [edx + CPUM.Host.dr3], eax
     423    mov     [edx + CPUMCPU.Host.dr3], eax
     424    CPUM_FROM_CPUMCPU(edx)
     425   
    415426    ; load hyper DR0-7
    416427    mov     ebx, [edx + CPUM.Hyper.dr]
     
    538549    push    eax
    539550
     551    CPUMCPU_FROM_CPUM(edx)
    540552    mov     eax, [esp + 4 + CPUMCTXCORE.eax]
    541     mov     [edx + CPUM.Guest.eax], eax
     553    mov     [edx + CPUMCPU.Guest.eax], eax
    542554    mov     eax, [esp + 4 + CPUMCTXCORE.ecx]
    543     mov     [edx + CPUM.Guest.ecx], eax
     555    mov     [edx + CPUMCPU.Guest.ecx], eax
    544556    mov     eax, [esp + 4 + CPUMCTXCORE.edx]
    545     mov     [edx + CPUM.Guest.edx], eax
     557    mov     [edx + CPUMCPU.Guest.edx], eax
    546558    mov     eax, [esp + 4 + CPUMCTXCORE.ebx]
    547     mov     [edx + CPUM.Guest.ebx], eax
     559    mov     [edx + CPUMCPU.Guest.ebx], eax
    548560    mov     eax, [esp + 4 + CPUMCTXCORE.esp]
    549     mov     [edx + CPUM.Guest.esp], eax
     561    mov     [edx + CPUMCPU.Guest.esp], eax
    550562    mov     eax, [esp + 4 + CPUMCTXCORE.ebp]
    551     mov     [edx + CPUM.Guest.ebp], eax
     563    mov     [edx + CPUMCPU.Guest.ebp], eax
    552564    mov     eax, [esp + 4 + CPUMCTXCORE.esi]
    553     mov     [edx + CPUM.Guest.esi], eax
     565    mov     [edx + CPUMCPU.Guest.esi], eax
    554566    mov     eax, [esp + 4 + CPUMCTXCORE.edi]
    555     mov     [edx + CPUM.Guest.edi], eax
     567    mov     [edx + CPUMCPU.Guest.edi], eax
    556568    mov     eax, dword [esp + 4 + CPUMCTXCORE.es]
    557     mov     dword [edx + CPUM.Guest.es], eax
     569    mov     dword [edx + CPUMCPU.Guest.es], eax
    558570    mov     eax, dword [esp + 4 + CPUMCTXCORE.cs]
    559     mov     dword [edx + CPUM.Guest.cs], eax
     571    mov     dword [edx + CPUMCPU.Guest.cs], eax
    560572    mov     eax, dword [esp + 4 + CPUMCTXCORE.ss]
    561     mov     dword [edx + CPUM.Guest.ss], eax
     573    mov     dword [edx + CPUMCPU.Guest.ss], eax
    562574    mov     eax, dword [esp + 4 + CPUMCTXCORE.ds]
    563     mov     dword [edx + CPUM.Guest.ds], eax
     575    mov     dword [edx + CPUMCPU.Guest.ds], eax
    564576    mov     eax, dword [esp + 4 + CPUMCTXCORE.fs]
    565     mov     dword [edx + CPUM.Guest.fs], eax
     577    mov     dword [edx + CPUMCPU.Guest.fs], eax
    566578    mov     eax, dword [esp + 4 + CPUMCTXCORE.gs]
    567     mov     dword [edx + CPUM.Guest.gs], eax
     579    mov     dword [edx + CPUMCPU.Guest.gs], eax
    568580    mov     eax, [esp + 4 + CPUMCTXCORE.eflags]
    569     mov     dword [edx + CPUM.Guest.eflags], eax
     581    mov     dword [edx + CPUMCPU.Guest.eflags], eax
    570582    mov     eax, [esp + 4 + CPUMCTXCORE.eip]
    571     mov     dword [edx + CPUM.Guest.eip], eax
     583    mov     dword [edx + CPUMCPU.Guest.eip], eax
    572584    pop     eax
     585    CPUM_FROM_CPUMCPU(edx)
    573586
    574587    add     esp, CPUMCTXCORE_size      ; skip CPUMCTXCORE structure
     
    734747    ;;
    735748    mov     edi, eax                    ; save return code in EDI (careful with COM_DWORD_REG from here on!)
    736     mov     ecx, [edx + CPUM.Host.cr3]
     749    CPUMCPU_FROM_CPUM(edx)
     750    mov     ecx, [edx + CPUMCPU.Host.cr3]
     751    CPUM_FROM_CPUMCPU(edx)
    737752    FIXUP SWITCHER_FIX_INTER_CR3_GC, 1
    738753    mov     eax, 0ffffffffh
     
    803818    FIXUP FIX_HC_CPUM_OFF, 1, 0
    804819    mov     edx, 0ffffffffh
     820    CPUMCPU_FROM_CPUM(edx)
    805821    ; activate host gdt and idt
    806     lgdt    [edx + CPUM.Host.gdtr]
     822    lgdt    [edx + CPUMCPU.Host.gdtr]
    807823    DEBUG_CHAR('0')
    808     lidt    [edx + CPUM.Host.idtr]
     824    lidt    [edx + CPUMCPU.Host.idtr]
    809825    DEBUG_CHAR('1')
    810826    ; Restore TSS selector; must mark it as not busy before using ltr (!)
    811827%if 1 ; ASSUME that this is supposed to be 'BUSY'. (saves 20-30 ticks on the T42p)
    812     movzx   eax, word [edx + CPUM.Host.tr]          ; eax <- TR
     828    movzx   eax, word [edx + CPUMCPU.Host.tr]          ; eax <- TR
    813829    and     al, 0F8h                                ; mask away TI and RPL bits, get descriptor offset.
    814     add     eax, [edx + CPUM.Host.gdtr + 2]         ; eax <- GDTR.address + descriptor offset.
     830    add     eax, [edx + CPUMCPU.Host.gdtr + 2]         ; eax <- GDTR.address + descriptor offset.
    815831    and     dword [eax + 4], ~0200h                 ; clear busy flag (2nd type2 bit)
    816     ltr     word [edx + CPUM.Host.tr]
     832    ltr     word [edx + CPUMCPU.Host.tr]
    817833%else
    818     movzx   eax, word [edx + CPUM.Host.tr]          ; eax <- TR
     834    movzx   eax, word [edx + CPUMCPU.Host.tr]          ; eax <- TR
    819835    and     al, 0F8h                                ; mask away TI and RPL bits, get descriptor offset.
    820     add     eax, [edx + CPUM.Host.gdtr + 2]         ; eax <- GDTR.address + descriptor offset.
     836    add     eax, [edx + CPUMCPU.Host.gdtr + 2]         ; eax <- GDTR.address + descriptor offset.
    821837    mov     ecx, [eax + 4]                          ; ecx <- 2nd descriptor dword
    822838    mov     ebx, ecx                                ; save orginal value
    823839    and     ecx, ~0200h                             ; clear busy flag (2nd type2 bit)
    824840    mov     [eax + 4], ecx                          ; not using xchg here is paranoia..
    825     ltr     word [edx + CPUM.Host.tr]
     841    ltr     word [edx + CPUMCPU.Host.tr]
    826842    xchg    [eax + 4], ebx                          ; using xchg is paranoia too...
    827843%endif
    828844    ; activate ldt
    829845    DEBUG_CHAR('2')
    830     lldt    [edx + CPUM.Host.ldtr]
     846    lldt    [edx + CPUMCPU.Host.ldtr]
    831847    ; Restore segment registers
    832     mov     eax, [edx + CPUM.Host.ds]
     848    mov     eax, [edx + CPUMCPU.Host.ds]
    833849    mov     ds, eax
    834     mov     eax, [edx + CPUM.Host.es]
     850    mov     eax, [edx + CPUMCPU.Host.es]
    835851    mov     es, eax
    836     mov     eax, [edx + CPUM.Host.fs]
     852    mov     eax, [edx + CPUMCPU.Host.fs]
    837853    mov     fs, eax
    838     mov     eax, [edx + CPUM.Host.gs]
     854    mov     eax, [edx + CPUMCPU.Host.gs]
    839855    mov     gs, eax
    840856    ; restore stack
    841     lss     esp, [edx + CPUM.Host.esp]
     857    lss     esp, [edx + CPUMCPU.Host.esp]
    842858
    843859
     
    845861    ; restore MSR_IA32_SYSENTER_CS register.
    846862    mov     ecx, MSR_IA32_SYSENTER_CS
    847     mov     eax, [edx + CPUM.Host.SysEnter.cs]
    848     mov     ebx, [edx + CPUM.Host.SysEnter.cs + 4]
     863    mov     eax, [edx + CPUMCPU.Host.SysEnter.cs]
     864    mov     ebx, [edx + CPUMCPU.Host.SysEnter.cs + 4]
    849865    xchg    edx, ebx                    ; save/load edx
    850866    wrmsr                               ; MSR[ecx] <- edx:eax
     
    859875    ; Restore FPU if guest has used it.
    860876    ; Using fxrstor should ensure that we're not causing unwanted exception on the host.
    861     mov     esi, [edx + CPUM.fUseFlags] ; esi == use flags.
     877    mov     esi, [edx + CPUMCPU.fUseFlags] ; esi == use flags.
    862878    test    esi, CPUM_USED_FPU
    863879    jz near gth_fpu_no
     
    867883
    868884    FIXUP FIX_NO_FXSAVE_JMP, 0, gth_no_fxsave - NAME(Start) ; this will insert a jmp gth_no_fxsave if fxsave isn't supported.
    869     fxsave  [edx + CPUM.Guest.fpu]
    870     fxrstor [edx + CPUM.Host.fpu]
     885    fxsave  [edx + CPUMCPU.Guest.fpu]
     886    fxrstor [edx + CPUMCPU.Host.fpu]
    871887    jmp near gth_fpu_no
    872888
    873889gth_no_fxsave:
    874     fnsave  [edx + CPUM.Guest.fpu]
    875     mov     eax, [edx + CPUM.Host.fpu]     ; control word
     890    fnsave  [edx + CPUMCPU.Guest.fpu]
     891    mov     eax, [edx + CPUMCPU.Host.fpu]     ; control word
    876892    not     eax                            ; 1 means exception ignored (6 LS bits)
    877893    and     eax, byte 03Fh                 ; 6 LS bits only
    878     test    eax, [edx + CPUM.Host.fpu + 4] ; status word
     894    test    eax, [edx + CPUMCPU.Host.fpu + 4] ; status word
    879895    jz      gth_no_exceptions_pending
    880896
    881897    ; technically incorrect, but we certainly don't want any exceptions now!!
    882     and     dword [edx + CPUM.Host.fpu + 4], ~03Fh
     898    and     dword [edx + CPUMCPU.Host.fpu + 4], ~03Fh
    883899
    884900gth_no_exceptions_pending:
    885     frstor  [edx + CPUM.Host.fpu]
     901    frstor  [edx + CPUMCPU.Host.fpu]
    886902    jmp short gth_fpu_no
    887903
     
    892908    ; Would've liked to have these highere up in case of crashes, but
    893909    ; the fpu stuff must be done before we restore cr0.
    894     mov     ecx, [edx + CPUM.Host.cr4]
     910    mov     ecx, [edx + CPUMCPU.Host.cr4]
    895911    mov     cr4, ecx
    896     mov     ecx, [edx + CPUM.Host.cr0]
     912    mov     ecx, [edx + CPUMCPU.Host.cr0]
    897913    mov     cr0, ecx
    898     ;mov     ecx, [edx + CPUM.Host.cr2] ; assumes this is waste of time.
     914    ;mov     ecx, [edx + CPUMCPU.Host.cr2] ; assumes this is waste of time.
    899915    ;mov     cr2, ecx
    900916
     
    908924    ; restore general registers.
    909925    mov     eax, edi                    ; restore return code. eax = return code !!
    910     mov     edi, [edx + CPUM.Host.edi]
    911     mov     esi, [edx + CPUM.Host.esi]
    912     mov     ebx, [edx + CPUM.Host.ebx]
    913     mov     ebp, [edx + CPUM.Host.ebp]
    914     push    dword [edx + CPUM.Host.eflags]
     926    mov     edi, [edx + CPUMCPU.Host.edi]
     927    mov     esi, [edx + CPUMCPU.Host.esi]
     928    mov     ebx, [edx + CPUMCPU.Host.ebx]
     929    mov     ebp, [edx + CPUMCPU.Host.ebp]
     930    push    dword [edx + CPUMCPU.Host.eflags]
    915931    popfd
    916932
     
    930946    jz short gth_debug_regs_dr7
    931947    DEBUG_S_CHAR('r')
    932     mov     eax, [edx + CPUM.Host.dr0]
     948    mov     eax, [edx + CPUMCPU.Host.dr0]
    933949    mov     dr0, eax
    934     mov     ebx, [edx + CPUM.Host.dr1]
     950    mov     ebx, [edx + CPUMCPU.Host.dr1]
    935951    mov     dr1, ebx
    936     mov     ecx, [edx + CPUM.Host.dr2]
     952    mov     ecx, [edx + CPUMCPU.Host.dr2]
    937953    mov     dr2, ecx
    938     mov     eax, [edx + CPUM.Host.dr3]
     954    mov     eax, [edx + CPUMCPU.Host.dr3]
    939955    mov     dr3, eax
    940956gth_debug_regs_dr7:
    941     mov     ebx, [edx + CPUM.Host.dr6]
     957    mov     ebx, [edx + CPUMCPU.Host.dr6]
    942958    mov     dr6, ebx
    943     mov     ecx, [edx + CPUM.Host.dr7]
     959    mov     ecx, [edx + CPUMCPU.Host.dr7]
    944960    mov     dr7, ecx
    945961    jmp     gth_debug_regs_no
Note: See TracChangeset for help on using the changeset viewer.

© 2025 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette