/[gxemul]/trunk/src/include/cpu_x86.h
This is repository of my old source code which isn't updated any more. Go to git.rot13.org for current projects!
ViewVC logotype

Diff of /trunk/src/include/cpu_x86.h

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 4 by dpavlin, Mon Oct 8 16:18:00 2007 UTC revision 26 by dpavlin, Mon Oct 8 16:20:10 2007 UTC
# Line 2  Line 2 
2  #define CPU_X86_H  #define CPU_X86_H
3    
4  /*  /*
5   *  Copyright (C) 2005  Anders Gavare.  All rights reserved.   *  Copyright (C) 2005-2006  Anders Gavare.  All rights reserved.
6   *   *
7   *  Redistribution and use in source and binary forms, with or without   *  Redistribution and use in source and binary forms, with or without
8   *  modification, are permitted provided that the following conditions are met:   *  modification, are permitted provided that the following conditions are met:
# Line 28  Line 28 
28   *  SUCH DAMAGE.   *  SUCH DAMAGE.
29   *   *
30   *   *
31   *  $Id: cpu_x86.h,v 1.7 2005/04/20 02:05:57 debug Exp $   *  $Id: cpu_x86.h,v 1.48 2006/06/24 21:47:24 debug Exp $
32     *
33     *  x86 (including AMD64) cpu dependent stuff.
34   */   */
35    
36  #include "misc.h"  #include "misc.h"
# Line 41  struct cpu_family; Line 43  struct cpu_family;
43  #define x86_reg_names           {                       \  #define x86_reg_names           {                       \
44          "ax", "cx", "dx", "bx", "sp", "bp", "si", "di", \          "ax", "cx", "dx", "bx", "sp", "bp", "si", "di", \
45          "08", "09", "10", "11", "12", "13", "14", "15" }          "08", "09", "10", "11", "12", "13", "14", "15" }
46    #define x86_reg_names_bytes     {                       \
47            "al", "cl", "dl", "bl", "ah", "ch", "dh", "bh" }
48    
49  #define X86_R_AX        0  #define X86_R_AX        0
50  #define X86_R_CX        1  #define X86_R_CX        1
# Line 61  struct cpu_family; Line 65  struct cpu_family;
65  #define X86_S_FS        4  #define X86_S_FS        4
66  #define X86_S_GS        5  #define X86_S_GS        5
67    
68  #define x86_seg_names   { "es", "cs", "ss", "ds", "es", "gs", "xx6", "xx7" }  #define x86_seg_names   { "es", "cs", "ss", "ds", "fs", "gs", "segr6", "segr7" }
69    
70  #define N_X86_CREGS             8  #define N_X86_CREGS             8
71    
72    #define N_X86_DREGS             8
73    
74  #define x86_cond_names  { "o", "b", "z", "be", "s", "p", "l", "le" }  #define x86_cond_names  { "o", "b", "z", "be", "s", "p", "l", "le" }
75  #define N_X86_CONDS             8  #define N_X86_CONDS             8
76    
77  #define X86_MODEL_8086          1  #define X86_MODEL_8086          1
78  #define X86_MODEL_80386         2  #define X86_MODEL_80286         2
79  #define X86_MODEL_PENTIUM       3  #define X86_MODEL_80386         3
80  #define X86_MODEL_AMD64         4  #define X86_MODEL_80486         4
81    #define X86_MODEL_PENTIUM       5
82    #define X86_MODEL_AMD64         6
83    
84  struct x86_model {  struct x86_model {
85          int             model_number;          int             model_number;
# Line 80  struct x86_model { Line 88  struct x86_model {
88    
89  #define x86_models {                                                    \  #define x86_models {                                                    \
90          { X86_MODEL_8086, "8086" },                                     \          { X86_MODEL_8086, "8086" },                                     \
91            { X86_MODEL_80286, "80286" },                                   \
92          { X86_MODEL_80386, "80386" },                                   \          { X86_MODEL_80386, "80386" },                                   \
93            { X86_MODEL_80486, "80486" },                                   \
94          { X86_MODEL_PENTIUM, "PENTIUM" },                               \          { X86_MODEL_PENTIUM, "PENTIUM" },                               \
95          { X86_MODEL_AMD64, "AMD64" },                                   \          { X86_MODEL_AMD64, "AMD64" },                                   \
96          { 0, NULL }                                                     \          { 0, NULL }                                                     \
97          }          }
98    
99    #define X86_N_IC_ARGS                   3
100    #define X86_INSTR_ALIGNMENT_SHIFT       0
101    #define X86_IC_ENTRIES_SHIFT            12
102    #define X86_IC_ENTRIES_PER_PAGE         (1 << X86_IC_ENTRIES_SHIFT)
103    #define X86_PC_TO_IC_ENTRY(a)           ((a) & (X86_IC_ENTRIES_PER_PAGE-1))
104    #define X86_ADDR_TO_PAGENR(a)           ((a) >> X86_IC_ENTRIES_SHIFT)
105    
106    #define X86_L2N                 17
107    #define X86_L3N                 18
108    
109    DYNTRANS_MISC_DECLARATIONS(x86,X86,uint64_t)
110    DYNTRANS_MISC64_DECLARATIONS(x86,X86,uint8_t)
111    
112    #define X86_MAX_VPH_TLB_ENTRIES         128
113    
114    struct descriptor_cache {
115            int             valid;
116            int             default_op_size;
117            int             access_rights;
118            int             descr_type;
119            int             readable;
120            int             writable;
121            int             granularity;
122            uint64_t        base;
123            uint64_t        limit;
124    };
125    
126    
127  struct x86_cpu {  struct x86_cpu {
128          struct x86_model model;          struct x86_model model;
129    
130          int             bits;           /*  16, 32, or 64  */          int             halted;
131          int             mode;           /*  16, 32, or 64  */          int             interrupt_asserted;
132    
133            int             cursegment;     /*  NOTE: 0..N_X86_SEGS-1  */
134            int             seg_override;   /*  0 or 1  */
135    
136          uint16_t        cursegment;     /*  for 16-bit memory_rw  */          uint64_t        tsc;            /*  time stamp counter  */
137    
138            uint64_t        gdtr;           /*  global descriptor table */
139            uint32_t        gdtr_limit;
140            uint64_t        idtr;           /*  interrupt descriptor table  */
141            uint32_t        idtr_limit;
142    
143            uint16_t        tr;             /*  task register  */
144            uint64_t        tr_base;
145            uint32_t        tr_limit;
146            uint16_t        ldtr;           /*  local descriptor table register  */
147            uint64_t        ldtr_base;
148            uint32_t        ldtr_limit;
149    
150          uint64_t        rflags;          uint64_t        rflags;
151          uint64_t        cr[N_X86_CREGS];          uint64_t        cr[N_X86_CREGS];        /*  control registers  */
152            uint64_t        dr[N_X86_DREGS];        /*  debug registers  */
153    
154            uint16_t        s[N_X86_SEGS];          /*  segment selectors  */
155            struct descriptor_cache descr_cache[N_X86_SEGS];
156    
157          uint16_t        s[N_X86_SEGS];          uint64_t        r[N_X86_REGS];          /*  GPRs  */
158          uint64_t        r[N_X86_REGS];  
159            /*  FPU:  */
160            uint16_t        fpu_sw;         /*  status word  */
161            uint16_t        fpu_cw;         /*  control word  */
162    
163            /*  MSRs:  */
164            uint64_t        efer;
165    
166    
167            /*
168             *  Instruction translation cache and Virtual->Physical->Host
169             *  address translation:
170             */
171            DYNTRANS_ITC(x86)
172            VPH_TLBS(x86,X86)
173            VPH32(x86,X86,uint64_t,uint8_t)
174            VPH64(x86,X86,uint8_t)
175  };  };
176    
177    
# Line 116  struct x86_cpu { Line 188  struct x86_cpu {
188  #define X86_FLAGS_NT    (1<<14)         /*  Nested Task Flag  */  #define X86_FLAGS_NT    (1<<14)         /*  Nested Task Flag  */
189  #define X86_FLAGS_RF    (1<<16)         /*  Resume Flag  */  #define X86_FLAGS_RF    (1<<16)         /*  Resume Flag  */
190  #define X86_FLAGS_VM    (1<<17)         /*  VM86 Flag  */  #define X86_FLAGS_VM    (1<<17)         /*  VM86 Flag  */
191    #define X86_FLAGS_AC    (1<<18)         /*  Alignment Check  */
192    #define X86_FLAGS_VIF   (1<<19)         /*  ?  */
193    #define X86_FLAGS_VIP   (1<<20)         /*  ?  */
194    #define X86_FLAGS_ID    (1<<21)         /*  CPUID present  */
195    
196    #define X86_CR0_PE      0x00000001      /*  Protection Enable  */
197    #define X86_CR0_MP      0x00000002
198    #define X86_CR0_EM      0x00000004
199    #define X86_CR0_TS      0x00000008
200    #define X86_CR0_ET      0x00000010
201    #define X86_CR0_NE      0x00000020
202    #define X86_CR0_WP      0x00010000
203    #define X86_CR0_AM      0x00040000
204    #define X86_CR0_NW      0x20000000
205    #define X86_CR0_CD      0x40000000
206    #define X86_CR0_PG      0x80000000      /*  Paging Enable  */
207    
208    #define X86_CR4_OSXMEX  0x00000400
209    #define X86_CR4_OSFXSR  0x00000200
210    #define X86_CR4_PCE     0x00000100
211    #define X86_CR4_PGE     0x00000080
212    #define X86_CR4_MCE     0x00000040
213    #define X86_CR4_PAE     0x00000020
214    #define X86_CR4_PSE     0x00000010
215    #define X86_CR4_DE      0x00000008
216    #define X86_CR4_TSD     0x00000004      /*  Time Stamp Disable  */
217    #define X86_CR4_PVI     0x00000002
218    #define X86_CR4_VME     0x00000001
219    
220    /*  EFER bits:  */
221    #define X86_EFER_FFXSR  0x00004000
222    #define X86_EFER_LMSLE  0x00002000
223    #define X86_EFER_NXE    0x00000800
224    #define X86_EFER_LMA    0x00000400
225    #define X86_EFER_LME    0x00000100      /*  Long Mode (64-bit)  */
226    #define X86_EFER_SCE    0x00000001
227    
228    /*  CPUID feature bits:  */
229    #define X86_CPUID_ECX_ETPRD     0x00004000
230    #define X86_CPUID_ECX_CX16      0x00002000      /*  cmpxchg16b  */
231    #define X86_CPUID_ECX_CID       0x00000400
232    #define X86_CPUID_ECX_TM2       0x00000100
233    #define X86_CPUID_ECX_EST       0x00000080
234    #define X86_CPUID_ECX_DSCPL     0x00000010
235    #define X86_CPUID_ECX_MON       0x00000004
236    #define X86_CPUID_ECX_SSE3      0x00000001
237    #define X86_CPUID_EDX_PBE       0x80000000      /*  pending break event  */
238    #define X86_CPUID_EDX_IA64      0x40000000
239    #define X86_CPUID_EDX_TM1       0x20000000      /*  thermal interrupt  */
240    #define X86_CPUID_EDX_HTT       0x10000000      /*  hyper threading  */
241    #define X86_CPUID_EDX_SS        0x08000000      /*  self-snoop  */
242    #define X86_CPUID_EDX_SSE2      0x04000000
243    #define X86_CPUID_EDX_SSE       0x02000000
244    #define X86_CPUID_EDX_FXSR      0x01000000
245    #define X86_CPUID_EDX_MMX       0x00800000
246    #define X86_CPUID_EDX_ACPI      0x00400000
247    #define X86_CPUID_EDX_DTES      0x00200000
248    #define X86_CPUID_EDX_CLFL      0x00080000
249    #define X86_CPUID_EDX_PSN       0x00040000
250    #define X86_CPUID_EDX_PSE36     0x00020000
251    #define X86_CPUID_EDX_PAT       0x00010000
252    #define X86_CPUID_EDX_CMOV      0x00008000
253    #define X86_CPUID_EDX_MCA       0x00004000
254    #define X86_CPUID_EDX_PGE       0x00002000      /*  global bit in PDE/PTE  */
255    #define X86_CPUID_EDX_MTRR      0x00001000
256    #define X86_CPUID_EDX_SEP       0x00000800      /*  sysenter/sysexit  */
257    #define X86_CPUID_EDX_APIC      0x00000200
258    #define X86_CPUID_EDX_CX8       0x00000100      /*  cmpxchg8b  */
259    #define X86_CPUID_EDX_MCE       0x00000080
260    #define X86_CPUID_EDX_PAE       0x00000040
261    #define X86_CPUID_EDX_MSR       0x00000020
262    #define X86_CPUID_EDX_TSC       0x00000010
263    #define X86_CPUID_EDX_PSE       0x00000008
264    #define X86_CPUID_EDX_DE        0x00000004
265    #define X86_CPUID_EDX_VME       0x00000002
266    #define X86_CPUID_EDX_FPU       0x00000001
267    
268    /*  Extended CPUID flags:  */
269    #define X86_CPUID_EXT_ECX_CR8D  0x00000010
270    #define X86_CPUID_EXT_ECX_CMP   0x00000002
271    #define X86_CPUID_EXT_ECX_AHF64 0x00000001
272    #define X86_CPUID_EXT_EDX_LM    0x20000000      /*  AMD64 Long Mode  */
273    #define X86_CPUID_EXT_EDX_FFXSR 0x02000000
274    /*  TODO: Many bits are duplicated in the Extended CPUID bits!  */
275    
276    #define X86_IO_BASE     0x1000000000ULL
277    
278    /*  Privilege level in the lowest 2 bits of a selector:  */
279    #define X86_PL_MASK             0x0003
280    #define X86_RING0               0
281    #define X86_RING1               1
282    #define X86_RING2               2
283    #define X86_RING3               3
284    
285    #define DESCR_TYPE_CODE         1
286    #define DESCR_TYPE_DATA         2
287    
288    
289    #define LONG_MODE               (cpu->cd.x86.efer & X86_EFER_LME)
290    #define PROTECTED_MODE          (cpu->cd.x86.cr[0] & X86_CR0_PE)
291    #define REAL_MODE               (!PROTECTED_MODE)
292    
293    
294  /*  cpu_x86.c:  */  /*  cpu_x86.c:  */
295    void reload_segment_descriptor(struct cpu *cpu, int segnr, int selector,
296            uint64_t *curpcp);
297    int x86_interrupt(struct cpu *cpu, int nr, int errcode);
298  int x86_memory_rw(struct cpu *cpu, struct memory *mem, uint64_t vaddr,  int x86_memory_rw(struct cpu *cpu, struct memory *mem, uint64_t vaddr,
299          unsigned char *data, size_t len, int writeflag, int cache_flags);          unsigned char *data, size_t len, int writeflag, int cache_flags);
300    void x86_update_translation_table(struct cpu *cpu, uint64_t vaddr_page,
301            unsigned char *host_page, int writeflag, uint64_t paddr_page);
302    void x8632_update_translation_table(struct cpu *cpu, uint64_t vaddr_page,
303            unsigned char *host_page, int writeflag, uint64_t paddr_page);
304    void x86_invalidate_translation_caches(struct cpu *cpu, uint64_t, int);
305    void x8632_invalidate_translation_caches(struct cpu *cpu, uint64_t, int);
306    void x86_invalidate_code_translation(struct cpu *cpu, uint64_t, int);
307    void x8632_invalidate_code_translation(struct cpu *cpu, uint64_t, int);
308    void x86_init_64bit_dummy_tables(struct cpu *cpu);
309  int x86_cpu_family_init(struct cpu_family *);  int x86_cpu_family_init(struct cpu_family *);
310    
311    
312    /*  memory_x86.c:  */
313    int x86_translate_v2p(struct cpu *cpu, uint64_t vaddr,
314            uint64_t *return_addr, int flags);
315    
316  #endif  /*  CPU_X86_H  */  #endif  /*  CPU_X86_H  */

Legend:
Removed from v.4  
changed lines
  Added in v.26

  ViewVC Help
Powered by ViewVC 1.1.26