xref: /openbmc/qemu/target/i386/hvf/x86_descr.h (revision 69e0a03c3f28f5bd35f54a47cd4996cc14e135ba)
1*69e0a03cSPaolo Bonzini /*
2*69e0a03cSPaolo Bonzini  * Copyright (C) 2016 Veertu Inc,
3*69e0a03cSPaolo Bonzini  * Copyright (C) 2017 Google Inc,
4*69e0a03cSPaolo Bonzini  *
5*69e0a03cSPaolo Bonzini  * This program is free software; you can redistribute it and/or
6*69e0a03cSPaolo Bonzini  * modify it under the terms of the GNU Lesser General Public
7*69e0a03cSPaolo Bonzini  * License as published by the Free Software Foundation; either
8*69e0a03cSPaolo Bonzini  * version 2 of the License, or (at your option) any later version.
9*69e0a03cSPaolo Bonzini  *
10*69e0a03cSPaolo Bonzini  * This program is distributed in the hope that it will be useful,
11*69e0a03cSPaolo Bonzini  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12*69e0a03cSPaolo Bonzini  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13*69e0a03cSPaolo Bonzini  * Lesser General Public License for more details.
14*69e0a03cSPaolo Bonzini  *
15*69e0a03cSPaolo Bonzini  * You should have received a copy of the GNU Lesser General Public
16*69e0a03cSPaolo Bonzini  * License along with this program; if not, see <http://www.gnu.org/licenses/>.
17*69e0a03cSPaolo Bonzini  */
18*69e0a03cSPaolo Bonzini 
19*69e0a03cSPaolo Bonzini #pragma once
20*69e0a03cSPaolo Bonzini 
21*69e0a03cSPaolo Bonzini #include "x86.h"
22*69e0a03cSPaolo Bonzini 
23*69e0a03cSPaolo Bonzini typedef struct vmx_segment {
24*69e0a03cSPaolo Bonzini     uint16_t sel;
25*69e0a03cSPaolo Bonzini     uint64_t base;
26*69e0a03cSPaolo Bonzini     uint64_t limit;
27*69e0a03cSPaolo Bonzini     uint64_t ar;
28*69e0a03cSPaolo Bonzini } vmx_segment;
29*69e0a03cSPaolo Bonzini 
30*69e0a03cSPaolo Bonzini /* deal with vmstate descriptors */
31*69e0a03cSPaolo Bonzini void vmx_read_segment_descriptor(struct CPUState *cpu,
32*69e0a03cSPaolo Bonzini                                  struct vmx_segment *desc, x86_reg_segment seg);
33*69e0a03cSPaolo Bonzini void vmx_write_segment_descriptor(CPUState *cpu, struct vmx_segment *desc,
34*69e0a03cSPaolo Bonzini                                   x86_reg_segment seg);
35*69e0a03cSPaolo Bonzini 
36*69e0a03cSPaolo Bonzini x68_segment_selector vmx_read_segment_selector(struct CPUState *cpu,
37*69e0a03cSPaolo Bonzini                                                x86_reg_segment seg);
38*69e0a03cSPaolo Bonzini void vmx_write_segment_selector(struct CPUState *cpu,
39*69e0a03cSPaolo Bonzini                                 x68_segment_selector selector,
40*69e0a03cSPaolo Bonzini                                 x86_reg_segment seg);
41*69e0a03cSPaolo Bonzini 
42*69e0a03cSPaolo Bonzini uint64_t vmx_read_segment_base(struct CPUState *cpu, x86_reg_segment seg);
43*69e0a03cSPaolo Bonzini void vmx_write_segment_base(struct CPUState *cpu, x86_reg_segment seg,
44*69e0a03cSPaolo Bonzini                             uint64_t base);
45*69e0a03cSPaolo Bonzini 
46*69e0a03cSPaolo Bonzini void x86_segment_descriptor_to_vmx(struct CPUState *cpu,
47*69e0a03cSPaolo Bonzini                                    x68_segment_selector selector,
48*69e0a03cSPaolo Bonzini                                    struct x86_segment_descriptor *desc,
49*69e0a03cSPaolo Bonzini                                    struct vmx_segment *vmx_desc);
50*69e0a03cSPaolo Bonzini 
51*69e0a03cSPaolo Bonzini uint32_t vmx_read_segment_limit(CPUState *cpu, x86_reg_segment seg);
52*69e0a03cSPaolo Bonzini uint32_t vmx_read_segment_ar(CPUState *cpu, x86_reg_segment seg);
53*69e0a03cSPaolo Bonzini void vmx_segment_to_x86_descriptor(struct CPUState *cpu,
54*69e0a03cSPaolo Bonzini                                    struct vmx_segment *vmx_desc,
55*69e0a03cSPaolo Bonzini                                    struct x86_segment_descriptor *desc);
56