VirtualBox

Changeset 7095 in vbox


Ignore:
Timestamp:
Feb 22, 2008 12:41:56 PM (17 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
28339
Message:

Extended the CPUMCTX structure for 64 bits mode.

Location:
trunk
Files:
9 edited

Legend:

Unmodified
Added
Removed
  • trunk/include/VBox/cpum.h

    r5999 r7095  
    8282typedef struct CPUMCTXCORE
    8383{
    84     uint32_t        edi;
    85     uint32_t        esi;
    86     uint32_t        ebp;
    87     uint32_t        eax;
    88     uint32_t        ebx;
    89     uint32_t        edx;
    90     uint32_t        ecx;
    91 
    92     uint32_t        esp;
    93     RTSEL           ss;
    94     RTSEL           ssPadding;
     84    union
     85    {
     86        uint32_t        edi;
     87        uint64_t        rdi;
     88    };
     89    union
     90    {
     91        uint32_t        esi;
     92        uint64_t        rsi;
     93    };
     94    union
     95    {
     96        uint32_t        ebp;
     97        uint64_t        rbp;
     98    };
     99    union
     100    {
     101        uint32_t        eax;
     102        uint64_t        rax;
     103    };
     104    union
     105    {
     106        uint32_t        ebx;
     107        uint64_t        rbx;
     108    };
     109    union
     110    {
     111        uint32_t        edx;
     112        uint64_t        rdx;
     113    };
     114    union
     115    {
     116        uint32_t        ecx;
     117        uint64_t        rcx;
     118    };
     119    union
     120    {
     121        /* Note: we rely on the exact layout, because we use lss esp, [] in the switcher */
     122        struct
     123        {
     124            uint32_t        esp;
     125            RTSEL           ss;
     126            RTSEL           ssPadding;
     127        };
     128        struct
     129        {
     130            uint64_t        rsp;
     131            RTSEL           ss64;
     132            RTSEL           ss64Padding;
     133        };
     134    };
    95135
    96136    RTSEL           gs;
     
    105145    RTSEL           csPadding;
    106146
    107     X86EFLAGS       eflags;
    108     uint32_t        eip;
     147    union
     148    {
     149        X86EFLAGS       eflags;
     150        X86RFLAGS       rflags;
     151    };
     152    union
     153    {
     154        uint32_t        eip;
     155        uint64_t        rip;
     156    };
     157
     158    uint64_t            r8;
     159    uint64_t            r9;
     160    uint64_t            r10;
     161    uint64_t            r11;
     162    uint64_t            r12;
     163    uint64_t            r13;
     164    uint64_t            r14;
     165    uint64_t            r15;
    109166
    110167    /** Hidden selector registers.
     
    138195    /** CPUMCTXCORE Part.
    139196     * @{ */
    140     uint32_t        edi;
    141     uint32_t        esi;
    142     uint32_t        ebp;
    143     uint32_t        eax;
    144     uint32_t        ebx;
    145     uint32_t        edx;
    146     uint32_t        ecx;
    147 
    148     uint32_t        esp;
    149     RTSEL           ss;
    150     RTSEL           ssPadding;
     197    union
     198    {
     199        uint32_t        edi;
     200        uint64_t        rdi;
     201    };
     202    union
     203    {
     204        uint32_t        esi;
     205        uint64_t        rsi;
     206    };
     207    union
     208    {
     209        uint32_t        ebp;
     210        uint64_t        rbp;
     211    };
     212    union
     213    {
     214        uint32_t        eax;
     215        uint64_t        rax;
     216    };
     217    union
     218    {
     219        uint32_t        ebx;
     220        uint64_t        rbx;
     221    };
     222    union
     223    {
     224        uint32_t        edx;
     225        uint64_t        rdx;
     226    };
     227    union
     228    {
     229        uint32_t        ecx;
     230        uint64_t        rcx;
     231    };
     232    union
     233    {
     234        /* Note: we rely on the exact layout, because we use lss esp, [] in the switcher */
     235        struct
     236        {
     237            uint32_t        esp;
     238            RTSEL           ss;
     239            RTSEL           ssPadding;
     240        };
     241        struct
     242        {
     243            uint64_t        rsp;
     244            RTSEL           ss64;
     245            RTSEL           ss64Padding;
     246        };
     247    };
    151248
    152249    RTSEL           gs;
     
    161258    RTSEL           csPadding;
    162259
    163     X86EFLAGS       eflags;
    164     uint32_t        eip;
     260    union
     261    {
     262        X86EFLAGS       eflags;
     263        X86RFLAGS       rflags;
     264    };
     265    union
     266    {
     267        uint32_t        eip;
     268        uint64_t        rip;
     269    };
     270
     271    uint64_t            r8;
     272    uint64_t            r9;
     273    uint64_t            r10;
     274    uint64_t            r11;
     275    uint64_t            r12;
     276    uint64_t            r13;
     277    uint64_t            r14;
     278    uint64_t            r15;
    165279
    166280    /** Hidden selector registers.
     
    178292    /** Control registers.
    179293     * @{ */
    180     uint32_t        cr0;
    181     uint32_t        cr2;
    182     uint32_t        cr3;
    183     uint32_t        cr4;
     294    uint64_t        cr0;
     295    uint64_t        cr2;
     296    uint64_t        cr3;
     297    uint64_t        cr4;
     298    uint64_t        cr8;
    184299    /** @} */
    185300
    186301    /** Debug registers.
    187302     * @{ */
    188     uint32_t        dr0;
    189     uint32_t        dr1;
    190     uint32_t        dr2;
    191     uint32_t        dr3;
    192     uint32_t        dr4; /**< @todo remove dr4 and dr5. */
    193     uint32_t        dr5;
    194     uint32_t        dr6;
    195     uint32_t        dr7;
     303    uint64_t        dr0;
     304    uint64_t        dr1;
     305    uint64_t        dr2;
     306    uint64_t        dr3;
     307    uint64_t        dr4; /**< @todo remove dr4 and dr5. */
     308    uint64_t        dr5;
     309    uint64_t        dr6;
     310    uint64_t        dr7;
     311    /* DR8-15 are currently not supported */
    196312    /** @} */
    197313
  • trunk/include/VBox/cpum.mac

    r5999 r7095  
    3434; and other places.
    3535struc CPUMCTXCORE
    36     .edi            resd    1
    37     .esi            resd    1
    38     .ebp            resd    1
    39     .eax            resd    1
    40     .ebx            resd    1
    41     .edx            resd    1
    42     .ecx            resd    1
     36    .edi            resq    1
     37    .esi            resq    1
     38    .ebp            resq    1
     39    .eax            resq    1
     40    .ebx            resq    1
     41    .edx            resq    1
     42    .ecx            resq    1
    4343    .esp            resd    1
    4444    .ss             resw    1
    45     .ssPadding      resw    1
     45    .ssPadding      resw    3
    4646    .gs             resw    1
    4747    .gsPadding      resw    1
     
    5454    .cs             resw    1
    5555    .csPadding      resw    1
    56     .eflags         resd    1
    57     .eip            resd    1
     56    .eflags         resq    1
     57    .eip            resq    1
     58
     59    .r8             resq    1
     60    .r9             resq    1
     61    .r10            resq    1
     62    .r11            resq    1
     63    .r12            resq    1
     64    .r13            resq    1
     65    .r14            resq    1
     66    .r15            resq    1
    5867
    5968    .esHid.u32Base      resd    1
     
    8796    .fpu            resb    512
    8897
    89     .edi            resd    1
    90     .esi            resd    1
    91     .ebp            resd    1
    92     .eax            resd    1
    93     .ebx            resd    1
    94     .edx            resd    1
    95     .ecx            resd    1
     98    .edi            resq    1
     99    .esi            resq    1
     100    .ebp            resq    1
     101    .eax            resq    1
     102    .ebx            resq    1
     103    .edx            resq    1
     104    .ecx            resq    1
    96105    .esp            resd    1
    97106    .ss             resw    1
    98     .ssPadding      resw    1
     107    .ssPadding      resw    3
    99108    .gs             resw    1
    100109    .gsPadding      resw    1
     
    107116    .cs             resw    1
    108117    .csPadding      resw    1
    109     .eflags         resd    1
    110     .eip            resd    1
     118    .eflags         resq    1
     119    .eip            resq    1
     120
     121    .r8             resq    1
     122    .r9             resq    1
     123    .r10            resq    1
     124    .r11            resq    1
     125    .r12            resq    1
     126    .r13            resq    1
     127    .r14            resq    1
     128    .r15            resq    1
     129
    111130    .esHid.u32Base      resd    1
    112131    .esHid.u32Limit     resd    1
     
    134153
    135154
    136     .cr0            resd    1
    137     .cr2            resd    1
    138     .cr3            resd    1
    139     .cr4            resd    1
     155    .cr0            resq    1
     156    .cr2            resq    1
     157    .cr3            resq    1
     158    .cr4            resq    1
     159    .cr8            resq    1
    140160
    141     .dr0            resd    1
    142     .dr1            resd    1
    143     .dr2            resd    1
    144     .dr3            resd    1
    145     .dr4            resd    1
    146     .dr5            resd    1
    147     .dr6            resd    1
    148     .dr7            resd    1
     161    .dr0            resq    1
     162    .dr1            resq    1
     163    .dr2            resq    1
     164    .dr3            resq    1
     165    .dr4            resq    1
     166    .dr5            resq    1
     167    .dr6            resq    1
     168    .dr7            resq    1
    149169
    150170    .gdtr           resb    6           ; GDT limit + linear address
  • trunk/include/VBox/vm.h

    r7036 r7095  
    392392        struct CPUM s;
    393393#endif
    394 #ifdef VBOX_WITH_HYBIRD_32BIT_KERNEL
    395         char        padding[3648];                                  /* multiple of 32 */
    396 #else
    397         char        padding[HC_ARCH_BITS == 32 ? 3488 : 3616];      /* multiple of 32 */
    398 #endif
     394        char        padding[4096];                                  /* multiple of 32 */
    399395    } cpum;
    400396
  • trunk/include/VBox/vm.mac

    r6796 r7095  
    8888
    8989    alignb 32
    90 %ifdef VBOX_WITH_HYBIRD_32BIT_KERNEL
    91     .cpum                 resb 3648
    92 %elif HC_ARCH_BITS == 32
    93     .cpum                 resb 3488
    94 %else
    95     .cpum                 resb 3616
    96 %endif
     90    .cpum                 resb 4096
    9791    .vmm                  resb 1024
    9892
  • trunk/include/VBox/x86.h

    r5999 r7095  
    119119/** Pointer to const EFLAGS. */
    120120typedef const X86EFLAGS *PCX86EFLAGS;
     121
     122/**
     123 * RFLAGS (32 upper bits are reserved)
     124 */
     125typedef union X86RFLAGS
     126{
     127    /** The bitfield view. */
     128    X86EFLAGSBITS   Bits;
     129    /** The 8-bit view. */
     130    uint8_t         au8[8];
     131    /** The 16-bit view. */
     132    uint16_t        au16[4];
     133    /** The 32-bit view. */
     134    uint32_t        au32[2];
     135    /** The 64-bit view. */
     136    uint64_t        au64[1];
     137    /** The 64-bit view. */
     138    uint32_t        u64;
     139} X86RFLAGS;
     140/** Pointer to RFLAGS. */
     141typedef X86RFLAGS *PX86RFLAGS;
     142/** Pointer to const RFLAGS. */
     143typedef const X86RFLAGS *PCX86RFLAGS;
    121144
    122145
     
    16871710        /** 128-bit view. (yeah, very helpful) */
    16881711        uint128_t   au128[1];
    1689     } aXMM[8];
    1690     /* - offset 288 - */
    1691     uint32_t    au32RsrvdRest[(512 - 288) / sizeof(uint32_t)];
     1712    } aXMM[16]; /* 8 registers in 32 bits mode; 16 in long mode */
     1713    /* - offset 416 - */
     1714    uint32_t    au32RsrvdRest[(512 - 416) / sizeof(uint32_t)];
    16921715} X86FXSTATE;
    16931716#pragma pack()
  • trunk/src/VBox/VMM/CPUM.cpp

    r6178 r7095  
    4646*******************************************************************************/
    4747/** The saved state version. */
    48 #define CPUM_SAVED_STATE_VERSION    5
     48#define CPUM_SAVED_STATE_VERSION    6
    4949
    5050
  • trunk/src/VBox/VMM/CPUMInternal.mac

    r7092 r7095  
    5555    ;
    5656    alignb 32
    57     .Host.fpu            resb    512
     57    .Host.fpu            resb    FPUSTATE_SIZE
    5858
    5959%if HC_ARCH_BITS == 64 || fVBOX_WITH_HYBIRD_32BIT_KERNEL
     
    168168    ;
    169169    alignb 32                           ; the padding
    170     .Hyper.fpu            resb    512
    171 
    172     .Hyper.edi            resd    1
    173     .Hyper.esi            resd    1
    174     .Hyper.ebp            resd    1
    175     .Hyper.eax            resd    1
    176     .Hyper.ebx            resd    1
    177     .Hyper.edx            resd    1
    178     .Hyper.ecx            resd    1
     170    .Hyper.fpu            resb    FPUSTATE_SIZE
     171
     172    .Hyper.edi            resq    1
     173    .Hyper.esi            resq    1
     174    .Hyper.ebp            resq    1
     175    .Hyper.eax            resq    1
     176    .Hyper.ebx            resq    1
     177    .Hyper.edx            resq    1
     178    .Hyper.ecx            resq    1
    179179    .Hyper.esp            resd    1
    180180    .Hyper.ss             resw    1
    181     .Hyper.ssPadding      resw    1
     181    .Hyper.ssPadding      resw    3
    182182    .Hyper.gs             resw    1
    183183    .Hyper.gsPadding      resw    1
     
    190190    .Hyper.cs             resw    1
    191191    .Hyper.csPadding      resw    1
    192     .Hyper.eflags         resd    1
    193     .Hyper.eip            resd    1
     192    .Hyper.eflags         resq    1
     193    .Hyper.eip            resq    1
     194    .Hyper.r8             resq    1
     195    .Hyper.r9             resq    1
     196    .Hyper.r10            resq    1
     197    .Hyper.r11            resq    1
     198    .Hyper.r12            resq    1
     199    .Hyper.r13            resq    1
     200    .Hyper.r14            resq    1
     201    .Hyper.r15            resq    1
     202
    194203    .Hyper.esHid.u32Base      resd    1
    195204    .Hyper.esHid.u32Limit     resd    1
     
    216225    .Hyper.gsHid.Attr         resd    1
    217226
    218     .Hyper.cr0            resd    1
    219     .Hyper.cr2            resd    1
    220     .Hyper.cr3            resd    1
    221     .Hyper.cr4            resd    1
    222 
    223     .Hyper.dr0            resd    1
    224     .Hyper.dr1            resd    1
    225     .Hyper.dr2            resd    1
    226     .Hyper.dr3            resd    1
    227     .Hyper.dr4            resd    1
    228     .Hyper.dr5            resd    1
    229     .Hyper.dr6            resd    1
    230     .Hyper.dr7            resd    1
     227    .Hyper.cr0            resq    1
     228    .Hyper.cr2            resq    1
     229    .Hyper.cr3            resq    1
     230    .Hyper.cr4            resq    1
     231    .Hyper.cr8            resq    1
     232
     233    .Hyper.dr0            resq    1
     234    .Hyper.dr1            resq    1
     235    .Hyper.dr2            resq    1
     236    .Hyper.dr3            resq    1
     237    .Hyper.dr4            resq    1
     238    .Hyper.dr5            resq    1
     239    .Hyper.dr6            resq    1
     240    .Hyper.dr7            resq    1
    231241
    232242    .Hyper.gdtr           resb    6           ; GDT limit + linear address
     
    263273    ;
    264274    alignb 32
    265     .Guest.fpu            resb    512
    266 
    267     .Guest.edi            resd    1
    268     .Guest.esi            resd    1
    269     .Guest.ebp            resd    1
    270     .Guest.eax            resd    1
    271     .Guest.ebx            resd    1
    272     .Guest.edx            resd    1
    273     .Guest.ecx            resd    1
     275    .Guest.fpu            resb    FPUSTATE_SIZE
     276
     277    .Guest.edi            resq    1
     278    .Guest.esi            resq    1
     279    .Guest.ebp            resq    1
     280    .Guest.eax            resq    1
     281    .Guest.ebx            resq    1
     282    .Guest.edx            resq    1
     283    .Guest.ecx            resq    1
    274284    .Guest.esp            resd    1
    275285    .Guest.ss             resw    1
    276     .Guest.ssPadding      resw    1
     286    .Guest.ssPadding      resw    3
    277287    .Guest.gs             resw    1
    278288    .Guest.gsPadding      resw    1
     
    285295    .Guest.cs             resw    1
    286296    .Guest.csPadding      resw    1
    287     .Guest.eflags         resd    1
    288     .Guest.eip            resd    1
     297    .Guest.eflags         resq    1
     298    .Guest.eip            resq    1
     299    .Guest.r8             resq    1
     300    .Guest.r9             resq    1
     301    .Guest.r10            resq    1
     302    .Guest.r11            resq    1
     303    .Guest.r12            resq    1
     304    .Guest.r13            resq    1
     305    .Guest.r14            resq    1
     306    .Guest.r15            resq    1
     307
    289308    .Guest.esHid.u32Base      resd    1
    290309    .Guest.esHid.u32Limit     resd    1
     
    311330    .Guest.gsHid.Attr         resd    1
    312331
    313     .Guest.cr0            resd    1
    314     .Guest.cr2            resd    1
    315     .Guest.cr3            resd    1
    316     .Guest.cr4            resd    1
    317 
    318     .Guest.dr0            resd    1
    319     .Guest.dr1            resd    1
    320     .Guest.dr2            resd    1
    321     .Guest.dr3            resd    1
    322     .Guest.dr4            resd    1
    323     .Guest.dr5            resd    1
    324     .Guest.dr6            resd    1
    325     .Guest.dr7            resd    1
     332    .Guest.cr0            resq    1
     333    .Guest.cr2            resq    1
     334    .Guest.cr3            resq    1
     335    .Guest.cr4            resq    1
     336    .Guest.cr8            resq    1
     337
     338    .Guest.dr0            resq    1
     339    .Guest.dr1            resq    1
     340    .Guest.dr2            resq    1
     341    .Guest.dr3            resq    1
     342    .Guest.dr4            resq    1
     343    .Guest.dr5            resq    1
     344    .Guest.dr6            resq    1
     345    .Guest.dr7            resq    1
    326346
    327347    .Guest.gdtr           resb    6           ; GDT limit + linear address
     
    387407
    388408    ; debug stuff...
    389     .GuestEntry           resb    800
     409    .GuestEntry           resb    960
     410
    390411endstruc
    391412
  • trunk/src/VBox/VMM/VMMSwitcher/AMD64ToPAE.asm

    r5999 r7095  
    631631
    632632    ;
    633     ; Guest Context (assumes CPUMCTXCORE layout).
     633    ; Guest Context (assumes esp now points to CPUMCTXCORE structure).
    634634    ;
    635635    ; general purpose registers (layout is pushad)
    636     pop     dword [edx + CPUM.Guest.edi]
    637     pop     dword [edx + CPUM.Guest.esi]
    638     pop     dword [edx + CPUM.Guest.ebp]
    639     pop     dword [edx + CPUM.Guest.eax]
    640     pop     dword [edx + CPUM.Guest.ebx]
    641     pop     dword [edx + CPUM.Guest.edx]
    642     pop     dword [edx + CPUM.Guest.ecx]
    643     pop     dword [edx + CPUM.Guest.esp]
    644     pop     dword [edx + CPUM.Guest.ss]
    645     pop     dword [edx + CPUM.Guest.gs]
    646     pop     dword [edx + CPUM.Guest.fs]
    647     pop     dword [edx + CPUM.Guest.es]
    648     pop     dword [edx + CPUM.Guest.ds]
    649     pop     dword [edx + CPUM.Guest.cs]
     636    push    eax                         ; save return code.
     637    mov     eax, [esp + 4 + CPUMCTXCORE.edi]
     638    mov     [edx + CPUM.Guest.edi], eax
     639    mov     eax, [esp + 4 + CPUMCTXCORE.esi]
     640    mov     [edx + CPUM.Guest.esi], eax
     641    mov     eax, [esp + 4 + CPUMCTXCORE.ebp]
     642    mov     [edx + CPUM.Guest.ebp], eax
     643    mov     eax, [esp + 4 + CPUMCTXCORE.eax]
     644    mov     [edx + CPUM.Guest.eax], eax
     645    mov     eax, [esp + 4 + CPUMCTXCORE.ebx]
     646    mov     [edx + CPUM.Guest.ebx], eax
     647    mov     eax, [esp + 4 + CPUMCTXCORE.edx]
     648    mov     [edx + CPUM.Guest.edx], eax
     649    mov     eax, [esp + 4 + CPUMCTXCORE.ecx]
     650    mov     [edx + CPUM.Guest.ecx], eax
     651    mov     eax, [esp + 4 + CPUMCTXCORE.esp]
     652    mov     [edx + CPUM.Guest.esp], eax
     653    ; selectors
     654    mov     eax, [esp + 4 + CPUMCTXCORE.ss]
     655    mov     [edx + CPUM.Guest.ss], eax
     656    mov     eax, [esp + 4 + CPUMCTXCORE.gs]
     657    mov     [edx + CPUM.Guest.gs], eax
     658    mov     eax, [esp + 4 + CPUMCTXCORE.fs]
     659    mov     [edx + CPUM.Guest.fs], eax
     660    mov     eax, [esp + 4 + CPUMCTXCORE.es]
     661    mov     [edx + CPUM.Guest.es], eax
     662    mov     eax, [esp + 4 + CPUMCTXCORE.ds]
     663    mov     [edx + CPUM.Guest.ds], eax
     664    mov     eax, [esp + 4 + CPUMCTXCORE.cs]
     665    mov     [edx + CPUM.Guest.cs], eax
    650666    ; flags
    651     pop     dword [edx + CPUM.Guest.eflags]
     667    mov     eax, [esp + 4 + CPUMCTXCORE.eflags]
     668    mov     [edx + CPUM.Guest.eflags], eax
    652669    ; eip
    653     pop     dword [edx + CPUM.Guest.eip]
     670    mov     eax, [esp + 4 + CPUMCTXCORE.eip]
     671    mov     [edx + CPUM.Guest.eip], eax
     672    ; jump to common worker code.
     673    pop     eax                         ; restore return code.
     674
     675    add     esp, CPUMCTXCORE_size      ; skip CPUMCTXCORE structure
     676
    654677    jmp     vmmGCGuestToHostAsm_EIPDone
    655678ENDPROC VMMGCGuestToHostAsmGuestCtx
  • trunk/src/VBox/VMM/VMMSwitcher/PAEand32Bit.mac

    r5999 r7095  
    532532    push    eax
    533533
    534     ; @todo do a rep movsd instead
    535534    mov     eax, [esp + 4 + CPUMCTXCORE.eax]
    536535    mov     [edx + CPUM.Guest.eax], eax
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