Linux Kernel
3.7.1
Main Page
Related Pages
Modules
Namespaces
Data Structures
Files
File List
Globals
All
Data Structures
Namespaces
Files
Functions
Variables
Typedefs
Enumerations
Enumerator
Macros
Groups
Pages
arch
powerpc
include
asm
kvm_ppc.h
Go to the documentation of this file.
1
/*
2
* This program is free software; you can redistribute it and/or modify
3
* it under the terms of the GNU General Public License, version 2, as
4
* published by the Free Software Foundation.
5
*
6
* This program is distributed in the hope that it will be useful,
7
* but WITHOUT ANY WARRANTY; without even the implied warranty of
8
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
9
* GNU General Public License for more details.
10
*
11
* You should have received a copy of the GNU General Public License
12
* along with this program; if not, write to the Free Software
13
* Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
14
*
15
* Copyright IBM Corp. 2008
16
*
17
* Authors: Hollis Blanchard <
[email protected]
>
18
*/
19
20
#ifndef __POWERPC_KVM_PPC_H__
21
#define __POWERPC_KVM_PPC_H__
22
23
/* This file exists just so we can dereference kvm_vcpu, avoiding nested header
24
* dependencies. */
25
26
#include <
linux/mutex.h
>
27
#include <
linux/timer.h
>
28
#include <linux/types.h>
29
#include <
linux/kvm_types.h
>
30
#include <
linux/kvm_host.h
>
31
#ifdef CONFIG_PPC_BOOK3S
32
#include <
asm/kvm_book3s.h
>
33
#else
34
#include <
asm/kvm_booke.h
>
35
#endif
36
#ifdef CONFIG_KVM_BOOK3S_64_HANDLER
37
#include <
asm/paca.h
>
38
#endif
39
40
enum
emulation_result
{
41
EMULATE_DONE
,
/* no further processing */
42
EMULATE_DO_MMIO
,
/* kvm_run filled with MMIO request */
43
EMULATE_DO_DCR
,
/* kvm_run filled with DCR request */
44
EMULATE_FAIL
,
/* can't emulate this instruction */
45
EMULATE_AGAIN
,
/* something went wrong. go again */
46
};
47
48
extern
int
kvmppc_vcpu_run
(
struct
kvm_run
*
kvm_run
,
struct
kvm_vcpu
*vcpu);
49
extern
int
__kvmppc_vcpu_run
(
struct
kvm_run
*
kvm_run
,
struct
kvm_vcpu
*vcpu);
50
extern
char
kvmppc_handlers_start
[];
51
extern
unsigned
long
kvmppc_handler_len
;
52
extern
void
kvmppc_handler_highmem
(
void
);
53
54
extern
void
kvmppc_dump_vcpu
(
struct
kvm_vcpu
*vcpu);
55
extern
int
kvmppc_handle_load
(
struct
kvm_run
*
run
,
struct
kvm_vcpu
*vcpu,
56
unsigned
int
rt,
unsigned
int
bytes
,
57
int
is_bigendian);
58
extern
int
kvmppc_handle_loads
(
struct
kvm_run
*
run
,
struct
kvm_vcpu
*vcpu,
59
unsigned
int
rt,
unsigned
int
bytes
,
60
int
is_bigendian);
61
extern
int
kvmppc_handle_store
(
struct
kvm_run
*
run
,
struct
kvm_vcpu
*vcpu,
62
u64
val
,
unsigned
int
bytes
,
int
is_bigendian);
63
64
extern
int
kvmppc_emulate_instruction
(
struct
kvm_run
*
run
,
65
struct
kvm_vcpu
*vcpu);
66
extern
int
kvmppc_emulate_mmio
(
struct
kvm_run
*
run
,
struct
kvm_vcpu
*vcpu);
67
extern
void
kvmppc_emulate_dec
(
struct
kvm_vcpu
*vcpu);
68
extern
u32
kvmppc_get_dec
(
struct
kvm_vcpu
*vcpu,
u64
tb
);
69
extern
void
kvmppc_decrementer_func
(
unsigned
long
data
);
70
extern
int
kvmppc_sanity_check
(
struct
kvm_vcpu
*vcpu);
71
72
/* Core-specific hooks */
73
74
extern
void
kvmppc_mmu_map
(
struct
kvm_vcpu
*vcpu,
u64
gvaddr,
gpa_t
gpaddr,
75
unsigned
int
gtlb_idx);
76
extern
void
kvmppc_mmu_priv_switch
(
struct
kvm_vcpu
*vcpu,
int
usermode);
77
extern
void
kvmppc_mmu_switch_pid
(
struct
kvm_vcpu
*vcpu,
u32
pid
);
78
extern
void
kvmppc_mmu_destroy
(
struct
kvm_vcpu
*vcpu);
79
extern
int
kvmppc_mmu_init
(
struct
kvm_vcpu
*vcpu);
80
extern
int
kvmppc_mmu_dtlb_index
(
struct
kvm_vcpu
*vcpu,
gva_t
eaddr);
81
extern
int
kvmppc_mmu_itlb_index
(
struct
kvm_vcpu
*vcpu,
gva_t
eaddr);
82
extern
gpa_t
kvmppc_mmu_xlate
(
struct
kvm_vcpu
*vcpu,
unsigned
int
gtlb_index,
83
gva_t
eaddr);
84
extern
void
kvmppc_mmu_dtlb_miss
(
struct
kvm_vcpu
*vcpu);
85
extern
void
kvmppc_mmu_itlb_miss
(
struct
kvm_vcpu
*vcpu);
86
87
extern
struct
kvm_vcpu
*
kvmppc_core_vcpu_create
(
struct
kvm
*
kvm
,
88
unsigned
int
id
);
89
extern
void
kvmppc_core_vcpu_free
(
struct
kvm_vcpu
*vcpu);
90
extern
int
kvmppc_core_vcpu_setup
(
struct
kvm_vcpu
*vcpu);
91
extern
int
kvmppc_core_check_processor_compat
(
void
);
92
extern
int
kvmppc_core_vcpu_translate
(
struct
kvm_vcpu
*vcpu,
93
struct
kvm_translation
*
tr
);
94
95
extern
void
kvmppc_core_vcpu_load
(
struct
kvm_vcpu
*vcpu,
int
cpu
);
96
extern
void
kvmppc_core_vcpu_put
(
struct
kvm_vcpu
*vcpu);
97
98
extern
int
kvmppc_core_prepare_to_enter
(
struct
kvm_vcpu
*vcpu);
99
extern
int
kvmppc_core_pending_dec
(
struct
kvm_vcpu
*vcpu);
100
extern
void
kvmppc_core_queue_program
(
struct
kvm_vcpu
*vcpu,
ulong
flags
);
101
extern
void
kvmppc_core_queue_dec
(
struct
kvm_vcpu
*vcpu);
102
extern
void
kvmppc_core_dequeue_dec
(
struct
kvm_vcpu
*vcpu);
103
extern
void
kvmppc_core_queue_external
(
struct
kvm_vcpu
*vcpu,
104
struct
kvm_interrupt
*irq);
105
extern
void
kvmppc_core_dequeue_external
(
struct
kvm_vcpu
*vcpu,
106
struct
kvm_interrupt
*irq);
107
108
extern
int
kvmppc_core_emulate_op
(
struct
kvm_run
*
run
,
struct
kvm_vcpu
*vcpu,
109
unsigned
int
op
,
int
*advance);
110
extern
int
kvmppc_core_emulate_mtspr
(
struct
kvm_vcpu
*vcpu,
int
sprn,
111
ulong
val
);
112
extern
int
kvmppc_core_emulate_mfspr
(
struct
kvm_vcpu
*vcpu,
int
sprn,
113
ulong
*
val
);
114
115
extern
int
kvmppc_booke_init
(
void
);
116
extern
void
kvmppc_booke_exit
(
void
);
117
118
extern
void
kvmppc_core_destroy_mmu
(
struct
kvm_vcpu
*vcpu);
119
extern
int
kvmppc_kvm_pv
(
struct
kvm_vcpu
*vcpu);
120
extern
void
kvmppc_map_magic
(
struct
kvm_vcpu
*vcpu);
121
122
extern
long
kvmppc_alloc_hpt
(
struct
kvm
*
kvm
,
u32
*htab_orderp);
123
extern
long
kvmppc_alloc_reset_hpt
(
struct
kvm
*
kvm
,
u32
*htab_orderp);
124
extern
void
kvmppc_free_hpt
(
struct
kvm
*
kvm
);
125
extern
long
kvmppc_prepare_vrma
(
struct
kvm
*
kvm
,
126
struct
kvm_userspace_memory_region
*
mem
);
127
extern
void
kvmppc_map_vrma
(
struct
kvm_vcpu
*vcpu,
128
struct
kvm_memory_slot
*memslot,
unsigned
long
porder);
129
extern
int
kvmppc_pseries_do_hcall
(
struct
kvm_vcpu
*vcpu);
130
extern
long
kvm_vm_ioctl_create_spapr_tce
(
struct
kvm
*
kvm
,
131
struct
kvm_create_spapr_tce
*args);
132
extern
long
kvmppc_h_put_tce
(
struct
kvm_vcpu
*vcpu,
unsigned
long
liobn,
133
unsigned
long
ioba
,
unsigned
long
tce);
134
extern
long
kvm_vm_ioctl_allocate_rma
(
struct
kvm
*
kvm
,
135
struct
kvm_allocate_rma
*rma);
136
extern
struct
kvmppc_linear_info
*
kvm_alloc_rma
(
void
);
137
extern
void
kvm_release_rma
(
struct
kvmppc_linear_info
*ri);
138
extern
struct
kvmppc_linear_info
*
kvm_alloc_hpt
(
void
);
139
extern
void
kvm_release_hpt
(
struct
kvmppc_linear_info
*
li
);
140
extern
int
kvmppc_core_init_vm
(
struct
kvm
*
kvm
);
141
extern
void
kvmppc_core_destroy_vm
(
struct
kvm
*
kvm
);
142
extern
int
kvmppc_core_prepare_memory_region
(
struct
kvm
*
kvm
,
143
struct
kvm_userspace_memory_region
*
mem
);
144
extern
void
kvmppc_core_commit_memory_region
(
struct
kvm
*
kvm
,
145
struct
kvm_userspace_memory_region
*
mem
);
146
extern
int
kvm_vm_ioctl_get_smmu_info
(
struct
kvm
*
kvm
,
147
struct
kvm_ppc_smmu_info
*
info
);
148
149
extern
int
kvmppc_bookehv_init
(
void
);
150
extern
void
kvmppc_bookehv_exit
(
void
);
151
152
/*
153
* Cuts out inst bits with ordering according to spec.
154
* That means the leftmost bit is zero. All given bits are included.
155
*/
156
static
inline
u32
kvmppc_get_field(
u64
inst,
int
msb
,
int
lsb
)
157
{
158
u32
r
;
159
u32
mask
;
160
161
BUG_ON
(msb > lsb);
162
163
mask = (1 << (lsb - msb + 1)) - 1;
164
r = (inst >> (63 -
lsb
)) &
mask
;
165
166
return
r
;
167
}
168
169
/*
170
* Replaces inst bits with ordering according to spec.
171
*/
172
static
inline
u32
kvmppc_set_field(
u64
inst,
int
msb
,
int
lsb
,
int
value
)
173
{
174
u32
r
;
175
u32
mask
;
176
177
BUG_ON
(msb > lsb);
178
179
mask = ((1 << (lsb - msb + 1)) - 1) << (63 - lsb);
180
r = (inst & ~mask) | ((value << (63 - lsb)) & mask);
181
182
return
r
;
183
}
184
185
void
kvmppc_core_get_sregs
(
struct
kvm_vcpu
*vcpu,
struct
kvm_sregs
*sregs);
186
int
kvmppc_core_set_sregs
(
struct
kvm_vcpu
*vcpu,
struct
kvm_sregs
*sregs);
187
188
void
kvmppc_get_sregs_ivor
(
struct
kvm_vcpu
*vcpu,
struct
kvm_sregs
*sregs);
189
int
kvmppc_set_sregs_ivor
(
struct
kvm_vcpu
*vcpu,
struct
kvm_sregs
*sregs);
190
191
int
kvm_vcpu_ioctl_get_one_reg
(
struct
kvm_vcpu
*vcpu,
struct
kvm_one_reg
*
reg
);
192
int
kvm_vcpu_ioctl_set_one_reg
(
struct
kvm_vcpu
*vcpu,
struct
kvm_one_reg
*
reg
);
193
194
void
kvmppc_set_pid
(
struct
kvm_vcpu
*vcpu,
u32
pid
);
195
196
#ifdef CONFIG_KVM_BOOK3S_64_HV
197
static
inline
void
kvmppc_set_xics_phys(
int
cpu
,
unsigned
long
addr
)
198
{
199
paca
[
cpu
].kvm_hstate.xics_phys =
addr
;
200
}
201
202
extern
void
kvm_linear_init
(
void
);
203
204
#else
205
static
inline
void
kvmppc_set_xics_phys(
int
cpu
,
unsigned
long
addr
)
206
{}
207
208
static
inline
void
kvm_linear_init
(
void
)
209
{}
210
#endif
211
212
int
kvm_vcpu_ioctl_config_tlb
(
struct
kvm_vcpu
*vcpu,
213
struct
kvm_config_tlb
*
cfg
);
214
int
kvm_vcpu_ioctl_dirty_tlb
(
struct
kvm_vcpu
*vcpu,
215
struct
kvm_dirty_tlb
*
cfg
);
216
217
long
kvmppc_alloc_lpid
(
void
);
218
void
kvmppc_claim_lpid
(
long
lpid);
219
void
kvmppc_free_lpid
(
long
lpid);
220
void
kvmppc_init_lpid
(
unsigned
long
nr_lpids);
221
222
static
inline
void
kvmppc_mmu_flush_icache(
pfn_t
pfn)
223
{
224
/* Clear i-cache for new pages */
225
struct
page
*
page
;
226
page =
pfn_to_page
(pfn);
227
if
(!
test_bit
(
PG_arch_1
, &page->
flags
)) {
228
flush_dcache_icache_page
(page);
229
set_bit
(
PG_arch_1
, &page->
flags
);
230
}
231
}
232
233
234
#endif
/* __POWERPC_KVM_PPC_H__ */
Generated on Thu Jan 10 2013 13:13:21 for Linux Kernel by
1.8.2