~jderose/ubuntu/raring/qemu/vde-again

« back to all changes in this revision

Viewing changes to target-i386/svm.h

  • Committer: Bazaar Package Importer
  • Author(s): Aurelien Jarno, Aurelien Jarno
  • Date: 2009-03-22 10:13:17 UTC
  • mfrom: (1.2.1 upstream) (6.1.1 sid)
  • Revision ID: james.westby@ubuntu.com-20090322101317-iigjtnu5qil35dtb
Tags: 0.10.1-1
[ Aurelien Jarno ]
* New upstream stable release:
  - patches/80_stable-branch.patch: remove.
* debian/control: 
  - Remove depends on proll.
  - Move depends on device-tree-compiler to build-depends.
  - Bump Standards-Version to 3.8.1 (no changes).
* patches/82_qemu-img_decimal.patch: new patch from upstream to make
  qemu-img accept sizes with decimal values (closes: bug#501400).

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
1
#ifndef __SVM_H
2
2
#define __SVM_H
3
3
 
4
 
enum {
5
 
        /* We shift all the intercept bits so we can OR them with the
6
 
           TB flags later on */
7
 
        INTERCEPT_INTR = HF_HIF_SHIFT,
8
 
        INTERCEPT_NMI,
9
 
        INTERCEPT_SMI,
10
 
        INTERCEPT_INIT,
11
 
        INTERCEPT_VINTR,
12
 
        INTERCEPT_SELECTIVE_CR0,
13
 
        INTERCEPT_STORE_IDTR,
14
 
        INTERCEPT_STORE_GDTR,
15
 
        INTERCEPT_STORE_LDTR,
16
 
        INTERCEPT_STORE_TR,
17
 
        INTERCEPT_LOAD_IDTR,
18
 
        INTERCEPT_LOAD_GDTR,
19
 
        INTERCEPT_LOAD_LDTR,
20
 
        INTERCEPT_LOAD_TR,
21
 
        INTERCEPT_RDTSC,
22
 
        INTERCEPT_RDPMC,
23
 
        INTERCEPT_PUSHF,
24
 
        INTERCEPT_POPF,
25
 
        INTERCEPT_CPUID,
26
 
        INTERCEPT_RSM,
27
 
        INTERCEPT_IRET,
28
 
        INTERCEPT_INTn,
29
 
        INTERCEPT_INVD,
30
 
        INTERCEPT_PAUSE,
31
 
        INTERCEPT_HLT,
32
 
        INTERCEPT_INVLPG,
33
 
        INTERCEPT_INVLPGA,
34
 
        INTERCEPT_IOIO_PROT,
35
 
        INTERCEPT_MSR_PROT,
36
 
        INTERCEPT_TASK_SWITCH,
37
 
        INTERCEPT_FERR_FREEZE,
38
 
        INTERCEPT_SHUTDOWN,
39
 
        INTERCEPT_VMRUN,
40
 
        INTERCEPT_VMMCALL,
41
 
        INTERCEPT_VMLOAD,
42
 
        INTERCEPT_VMSAVE,
43
 
        INTERCEPT_STGI,
44
 
        INTERCEPT_CLGI,
45
 
        INTERCEPT_SKINIT,
46
 
        INTERCEPT_RDTSCP,
47
 
        INTERCEPT_ICEBP,
48
 
        INTERCEPT_WBINVD,
49
 
};
50
 
/* This is not really an intercept but rather a placeholder to
51
 
   show that we are in an SVM (just like a hidden flag, but keeps the
52
 
   TBs clean) */
53
 
#define INTERCEPT_SVM 63
54
 
#define INTERCEPT_SVM_MASK (1ULL << INTERCEPT_SVM)
55
 
 
56
 
struct __attribute__ ((__packed__)) vmcb_control_area {
57
 
        uint16_t intercept_cr_read;
58
 
        uint16_t intercept_cr_write;
59
 
        uint16_t intercept_dr_read;
60
 
        uint16_t intercept_dr_write;
61
 
        uint32_t intercept_exceptions;
62
 
        uint64_t intercept;
63
 
        uint8_t reserved_1[44];
64
 
        uint64_t iopm_base_pa;
65
 
        uint64_t msrpm_base_pa;
66
 
        uint64_t tsc_offset;
67
 
        uint32_t asid;
68
 
        uint8_t tlb_ctl;
69
 
        uint8_t reserved_2[3];
70
 
        uint32_t int_ctl;
71
 
        uint32_t int_vector;
72
 
        uint32_t int_state;
73
 
        uint8_t reserved_3[4];
74
 
        uint32_t exit_code;
75
 
        uint32_t exit_code_hi;
76
 
        uint64_t exit_info_1;
77
 
        uint64_t exit_info_2;
78
 
        uint32_t exit_int_info;
79
 
        uint32_t exit_int_info_err;
80
 
        uint64_t nested_ctl;
81
 
        uint8_t reserved_4[16];
82
 
        uint32_t event_inj;
83
 
        uint32_t event_inj_err;
84
 
        uint64_t nested_cr3;
85
 
        uint64_t lbr_ctl;
86
 
        uint8_t reserved_5[832];
87
 
};
88
 
 
89
 
 
90
4
#define TLB_CONTROL_DO_NOTHING 0
91
5
#define TLB_CONTROL_FLUSH_ALL_ASID 1
92
6
 
117
31
#define SVM_IOIO_SIZE_MASK (7 << SVM_IOIO_SIZE_SHIFT)
118
32
#define SVM_IOIO_ASIZE_MASK (7 << SVM_IOIO_ASIZE_SHIFT)
119
33
 
120
 
struct __attribute__ ((__packed__)) vmcb_seg {
121
 
        uint16_t selector;
122
 
        uint16_t attrib;
123
 
        uint32_t limit;
124
 
        uint64_t base;
125
 
};
126
 
 
127
 
struct __attribute__ ((__packed__)) vmcb_save_area {
128
 
        struct vmcb_seg es;
129
 
        struct vmcb_seg cs;
130
 
        struct vmcb_seg ss;
131
 
        struct vmcb_seg ds;
132
 
        struct vmcb_seg fs;
133
 
        struct vmcb_seg gs;
134
 
        struct vmcb_seg gdtr;
135
 
        struct vmcb_seg ldtr;
136
 
        struct vmcb_seg idtr;
137
 
        struct vmcb_seg tr;
138
 
        uint8_t reserved_1[43];
139
 
        uint8_t cpl;
140
 
        uint8_t reserved_2[4];
141
 
        uint64_t efer;
142
 
        uint8_t reserved_3[112];
143
 
        uint64_t cr4;
144
 
        uint64_t cr3;
145
 
        uint64_t cr0;
146
 
        uint64_t dr7;
147
 
        uint64_t dr6;
148
 
        uint64_t rflags;
149
 
        uint64_t rip;
150
 
        uint8_t reserved_4[88];
151
 
        uint64_t rsp;
152
 
        uint8_t reserved_5[24];
153
 
        uint64_t rax;
154
 
        uint64_t star;
155
 
        uint64_t lstar;
156
 
        uint64_t cstar;
157
 
        uint64_t sfmask;
158
 
        uint64_t kernel_gs_base;
159
 
        uint64_t sysenter_cs;
160
 
        uint64_t sysenter_esp;
161
 
        uint64_t sysenter_eip;
162
 
        uint64_t cr2;
163
 
        /* qemu: cr8 added to reuse this as hsave */
164
 
        uint64_t cr8;
165
 
        uint8_t reserved_6[32 - 8]; /* originally 32 */
166
 
        uint64_t g_pat;
167
 
        uint64_t dbgctl;
168
 
        uint64_t br_from;
169
 
        uint64_t br_to;
170
 
        uint64_t last_excp_from;
171
 
        uint64_t last_excp_to;
172
 
};
173
 
 
174
 
struct __attribute__ ((__packed__)) vmcb {
175
 
        struct vmcb_control_area control;
176
 
        struct vmcb_save_area save;
177
 
};
178
 
 
179
 
#define SVM_CPUID_FEATURE_SHIFT 2
180
 
#define SVM_CPUID_FUNC 0x8000000a
181
 
 
182
 
#define MSR_EFER_SVME_MASK (1ULL << 12)
183
 
 
184
 
#define SVM_SELECTOR_S_SHIFT 4
185
 
#define SVM_SELECTOR_DPL_SHIFT 5
186
 
#define SVM_SELECTOR_P_SHIFT 7
187
 
#define SVM_SELECTOR_AVL_SHIFT 8
188
 
#define SVM_SELECTOR_L_SHIFT 9
189
 
#define SVM_SELECTOR_DB_SHIFT 10
190
 
#define SVM_SELECTOR_G_SHIFT 11
191
 
 
192
 
#define SVM_SELECTOR_TYPE_MASK (0xf)
193
 
#define SVM_SELECTOR_S_MASK (1 << SVM_SELECTOR_S_SHIFT)
194
 
#define SVM_SELECTOR_DPL_MASK (3 << SVM_SELECTOR_DPL_SHIFT)
195
 
#define SVM_SELECTOR_P_MASK (1 << SVM_SELECTOR_P_SHIFT)
196
 
#define SVM_SELECTOR_AVL_MASK (1 << SVM_SELECTOR_AVL_SHIFT)
197
 
#define SVM_SELECTOR_L_MASK (1 << SVM_SELECTOR_L_SHIFT)
198
 
#define SVM_SELECTOR_DB_MASK (1 << SVM_SELECTOR_DB_SHIFT)
199
 
#define SVM_SELECTOR_G_MASK (1 << SVM_SELECTOR_G_SHIFT)
200
 
 
201
 
#define SVM_SELECTOR_WRITE_MASK (1 << 1)
202
 
#define SVM_SELECTOR_READ_MASK SVM_SELECTOR_WRITE_MASK
203
 
#define SVM_SELECTOR_CODE_MASK (1 << 3)
204
 
 
205
 
#define INTERCEPT_CR0_MASK 1
206
 
#define INTERCEPT_CR3_MASK (1 << 3)
207
 
#define INTERCEPT_CR4_MASK (1 << 4)
208
 
 
209
 
#define INTERCEPT_DR0_MASK 1
210
 
#define INTERCEPT_DR1_MASK (1 << 1)
211
 
#define INTERCEPT_DR2_MASK (1 << 2)
212
 
#define INTERCEPT_DR3_MASK (1 << 3)
213
 
#define INTERCEPT_DR4_MASK (1 << 4)
214
 
#define INTERCEPT_DR5_MASK (1 << 5)
215
 
#define INTERCEPT_DR6_MASK (1 << 6)
216
 
#define INTERCEPT_DR7_MASK (1 << 7)
217
 
 
218
34
#define SVM_EVTINJ_VEC_MASK 0xff
219
35
 
220
36
#define SVM_EVTINJ_TYPE_SHIFT 8
314
130
 
315
131
#define SVM_CR0_SELECTIVE_MASK (1 << 3 | 1) /* TS and MP */
316
132
 
317
 
#define SVM_VMLOAD ".byte 0x0f, 0x01, 0xda"
318
 
#define SVM_VMRUN  ".byte 0x0f, 0x01, 0xd8"
319
 
#define SVM_VMSAVE ".byte 0x0f, 0x01, 0xdb"
320
 
#define SVM_CLGI   ".byte 0x0f, 0x01, 0xdd"
321
 
#define SVM_STGI   ".byte 0x0f, 0x01, 0xdc"
322
 
#define SVM_INVLPGA ".byte 0x0f, 0x01, 0xdf"
323
 
 
324
 
/* function references */
325
 
 
326
 
void helper_stgi();
327
 
void vmexit(uint64_t exit_code, uint64_t exit_info_1);
328
 
int svm_check_intercept_param(uint32_t type, uint64_t param);
329
 
static inline int svm_check_intercept(unsigned int type) {
330
 
    return svm_check_intercept_param(type, 0);
331
 
}
332
 
 
333
 
 
334
 
#define INTERCEPTED(mask) (env->intercept & mask)
335
 
#define INTERCEPTEDw(var, mask) (env->intercept ## var & mask)
336
 
#define INTERCEPTEDl(var, mask) (env->intercept ## var & mask)
337
 
 
338
 
#define SVM_LOAD_SEG(addr, seg_index, seg) \
339
 
    cpu_x86_load_seg_cache(env, \
340
 
                    R_##seg_index, \
341
 
                    lduw_phys(addr + offsetof(struct vmcb, save.seg.selector)),\
342
 
                    ldq_phys(addr + offsetof(struct vmcb, save.seg.base)),\
343
 
                    ldl_phys(addr + offsetof(struct vmcb, save.seg.limit)),\
344
 
                    vmcb2cpu_attrib(lduw_phys(addr + offsetof(struct vmcb, save.seg.attrib)), ldq_phys(addr + offsetof(struct vmcb, save.seg.base)), ldl_phys(addr + offsetof(struct vmcb, save.seg.limit))))
345
 
 
346
 
#define SVM_LOAD_SEG2(addr, seg_qemu, seg_vmcb) \
347
 
    env->seg_qemu.selector  = lduw_phys(addr + offsetof(struct vmcb, save.seg_vmcb.selector)); \
348
 
    env->seg_qemu.base      = ldq_phys(addr + offsetof(struct vmcb, save.seg_vmcb.base)); \
349
 
    env->seg_qemu.limit     = ldl_phys(addr + offsetof(struct vmcb, save.seg_vmcb.limit)); \
350
 
    env->seg_qemu.flags     = vmcb2cpu_attrib(lduw_phys(addr + offsetof(struct vmcb, save.seg_vmcb.attrib)), env->seg_qemu.base, env->seg_qemu.limit)
351
 
 
352
 
#define SVM_SAVE_SEG(addr, seg_qemu, seg_vmcb) \
353
 
    stw_phys(addr + offsetof(struct vmcb, save.seg_vmcb.selector), env->seg_qemu.selector); \
354
 
    stq_phys(addr + offsetof(struct vmcb, save.seg_vmcb.base), env->seg_qemu.base); \
355
 
    stl_phys(addr + offsetof(struct vmcb, save.seg_vmcb.limit), env->seg_qemu.limit); \
356
 
    stw_phys(addr + offsetof(struct vmcb, save.seg_vmcb.attrib), cpu2vmcb_attrib(env->seg_qemu.flags))
 
133
struct __attribute__ ((__packed__)) vmcb_control_area {
 
134
        uint16_t intercept_cr_read;
 
135
        uint16_t intercept_cr_write;
 
136
        uint16_t intercept_dr_read;
 
137
        uint16_t intercept_dr_write;
 
138
        uint32_t intercept_exceptions;
 
139
        uint64_t intercept;
 
140
        uint8_t reserved_1[44];
 
141
        uint64_t iopm_base_pa;
 
142
        uint64_t msrpm_base_pa;
 
143
        uint64_t tsc_offset;
 
144
        uint32_t asid;
 
145
        uint8_t tlb_ctl;
 
146
        uint8_t reserved_2[3];
 
147
        uint32_t int_ctl;
 
148
        uint32_t int_vector;
 
149
        uint32_t int_state;
 
150
        uint8_t reserved_3[4];
 
151
        uint64_t exit_code;
 
152
        uint64_t exit_info_1;
 
153
        uint64_t exit_info_2;
 
154
        uint32_t exit_int_info;
 
155
        uint32_t exit_int_info_err;
 
156
        uint64_t nested_ctl;
 
157
        uint8_t reserved_4[16];
 
158
        uint32_t event_inj;
 
159
        uint32_t event_inj_err;
 
160
        uint64_t nested_cr3;
 
161
        uint64_t lbr_ctl;
 
162
        uint8_t reserved_5[832];
 
163
};
 
164
 
 
165
struct __attribute__ ((__packed__)) vmcb_seg {
 
166
        uint16_t selector;
 
167
        uint16_t attrib;
 
168
        uint32_t limit;
 
169
        uint64_t base;
 
170
};
 
171
 
 
172
struct __attribute__ ((__packed__)) vmcb_save_area {
 
173
        struct vmcb_seg es;
 
174
        struct vmcb_seg cs;
 
175
        struct vmcb_seg ss;
 
176
        struct vmcb_seg ds;
 
177
        struct vmcb_seg fs;
 
178
        struct vmcb_seg gs;
 
179
        struct vmcb_seg gdtr;
 
180
        struct vmcb_seg ldtr;
 
181
        struct vmcb_seg idtr;
 
182
        struct vmcb_seg tr;
 
183
        uint8_t reserved_1[43];
 
184
        uint8_t cpl;
 
185
        uint8_t reserved_2[4];
 
186
        uint64_t efer;
 
187
        uint8_t reserved_3[112];
 
188
        uint64_t cr4;
 
189
        uint64_t cr3;
 
190
        uint64_t cr0;
 
191
        uint64_t dr7;
 
192
        uint64_t dr6;
 
193
        uint64_t rflags;
 
194
        uint64_t rip;
 
195
        uint8_t reserved_4[88];
 
196
        uint64_t rsp;
 
197
        uint8_t reserved_5[24];
 
198
        uint64_t rax;
 
199
        uint64_t star;
 
200
        uint64_t lstar;
 
201
        uint64_t cstar;
 
202
        uint64_t sfmask;
 
203
        uint64_t kernel_gs_base;
 
204
        uint64_t sysenter_cs;
 
205
        uint64_t sysenter_esp;
 
206
        uint64_t sysenter_eip;
 
207
        uint64_t cr2;
 
208
        uint8_t reserved_6[32];
 
209
        uint64_t g_pat;
 
210
        uint64_t dbgctl;
 
211
        uint64_t br_from;
 
212
        uint64_t br_to;
 
213
        uint64_t last_excp_from;
 
214
        uint64_t last_excp_to;
 
215
};
 
216
 
 
217
struct __attribute__ ((__packed__)) vmcb {
 
218
        struct vmcb_control_area control;
 
219
        struct vmcb_save_area save;
 
220
};
357
221
 
358
222
#endif