Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
openeuler
qemu
提交
8217d945
Q
qemu
项目概览
openeuler
/
qemu
通知
10
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
Q
qemu
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
8217d945
编写于
2月 08, 2010
作者:
A
Anthony Liguori
浏览文件
操作
浏览文件
下载
差异文件
Merge remote branch 'qemu-kvm/uq/master' into staging-tmp
上级
4cb26382
c5f32c99
变更
8
显示空白变更内容
内联
并排
Showing
8 changed file
with
49 addition
and
17 deletion
+49
-17
cpu-all.h
cpu-all.h
+2
-0
cpu-defs.h
cpu-defs.h
+2
-1
exec.c
exec.c
+6
-0
hw/vmport.c
hw/vmport.c
+3
-0
kvm-all.c
kvm-all.c
+21
-15
kvm.h
kvm.h
+1
-0
target-i386/kvm.c
target-i386/kvm.c
+10
-1
vl.c
vl.c
+4
-0
未找到文件。
cpu-all.h
浏览文件 @
8217d945
...
...
@@ -915,6 +915,8 @@ void qemu_register_coalesced_mmio(target_phys_addr_t addr, ram_addr_t size);
void
qemu_unregister_coalesced_mmio
(
target_phys_addr_t
addr
,
ram_addr_t
size
);
void
qemu_flush_coalesced_mmio_buffer
(
void
);
/*******************************************/
/* host CPU ticks (if available) */
...
...
cpu-defs.h
浏览文件 @
8217d945
...
...
@@ -197,6 +197,7 @@ typedef struct CPUWatchpoint {
const char *cpu_model_str; \
struct KVMState *kvm_state; \
struct kvm_run *kvm_run; \
int kvm_fd;
int kvm_fd; \
int kvm_vcpu_dirty;
#endif
exec.c
浏览文件 @
8217d945
...
...
@@ -2415,6 +2415,12 @@ void qemu_unregister_coalesced_mmio(target_phys_addr_t addr, ram_addr_t size)
kvm_uncoalesce_mmio_region
(
addr
,
size
);
}
void
qemu_flush_coalesced_mmio_buffer
(
void
)
{
if
(
kvm_enabled
())
kvm_flush_coalesced_mmio_buffer
();
}
ram_addr_t
qemu_ram_alloc
(
ram_addr_t
size
)
{
RAMBlock
*
new_block
;
...
...
hw/vmport.c
浏览文件 @
8217d945
...
...
@@ -25,6 +25,7 @@
#include "isa.h"
#include "pc.h"
#include "sysemu.h"
#include "kvm.h"
//#define VMPORT_DEBUG
...
...
@@ -58,6 +59,8 @@ static uint32_t vmport_ioport_read(void *opaque, uint32_t addr)
unsigned
char
command
;
uint32_t
eax
;
cpu_synchronize_state
(
env
);
eax
=
env
->
regs
[
R_EAX
];
if
(
eax
!=
VMPORT_MAGIC
)
return
eax
;
...
...
kvm-all.c
浏览文件 @
8217d945
...
...
@@ -57,8 +57,10 @@ struct KVMState
KVMSlot
slots
[
32
];
int
fd
;
int
vmfd
;
int
regs_modified
;
int
coalesced_mmio
;
#ifdef KVM_CAP_COALESCED_MMIO
struct
kvm_coalesced_mmio_ring
*
coalesced_mmio_ring
;
#endif
int
broken_set_mem_region
;
int
migration_log
;
int
vcpu_events
;
...
...
@@ -200,6 +202,12 @@ int kvm_init_vcpu(CPUState *env)
goto
err
;
}
#ifdef KVM_CAP_COALESCED_MMIO
if
(
s
->
coalesced_mmio
&&
!
s
->
coalesced_mmio_ring
)
s
->
coalesced_mmio_ring
=
(
void
*
)
env
->
kvm_run
+
s
->
coalesced_mmio
*
PAGE_SIZE
;
#endif
ret
=
kvm_arch_init_vcpu
(
env
);
if
(
ret
==
0
)
{
qemu_register_reset
(
kvm_reset_vcpu
,
env
);
...
...
@@ -466,10 +474,10 @@ int kvm_init(int smp_cpus)
goto
err
;
}
s
->
coalesced_mmio
=
0
;
#ifdef KVM_CAP_COALESCED_MMIO
s
->
coalesced_mmio
=
kvm_check_extension
(
s
,
KVM_CAP_COALESCED_MMIO
);
#else
s
->
coalesced_mmio
=
0
;
s
->
coalesced_mmio_ring
=
NULL
;
#endif
s
->
broken_set_mem_region
=
1
;
...
...
@@ -544,14 +552,12 @@ static int kvm_handle_io(uint16_t port, void *data, int direction, int size,
return
1
;
}
static
void
kvm_run_coalesced_mmio
(
CPUState
*
env
,
struct
kvm_run
*
run
)
void
kvm_flush_coalesced_mmio_buffer
(
void
)
{
#ifdef KVM_CAP_COALESCED_MMIO
KVMState
*
s
=
kvm_state
;
if
(
s
->
coalesced_mmio
)
{
struct
kvm_coalesced_mmio_ring
*
ring
;
ring
=
(
void
*
)
run
+
(
s
->
coalesced_mmio
*
TARGET_PAGE_SIZE
);
if
(
s
->
coalesced_mmio_ring
)
{
struct
kvm_coalesced_mmio_ring
*
ring
=
s
->
coalesced_mmio_ring
;
while
(
ring
->
first
!=
ring
->
last
)
{
struct
kvm_coalesced_mmio
*
ent
;
...
...
@@ -567,9 +573,9 @@ static void kvm_run_coalesced_mmio(CPUState *env, struct kvm_run *run)
void
kvm_cpu_synchronize_state
(
CPUState
*
env
)
{
if
(
!
env
->
kvm_
state
->
regs_modified
)
{
if
(
!
env
->
kvm_
vcpu_dirty
)
{
kvm_arch_get_registers
(
env
);
env
->
kvm_
state
->
regs_modified
=
1
;
env
->
kvm_
vcpu_dirty
=
1
;
}
}
...
...
@@ -587,9 +593,9 @@ int kvm_cpu_exec(CPUState *env)
break
;
}
if
(
env
->
kvm_
state
->
regs_modified
)
{
if
(
env
->
kvm_
vcpu_dirty
)
{
kvm_arch_put_registers
(
env
);
env
->
kvm_
state
->
regs_modified
=
0
;
env
->
kvm_
vcpu_dirty
=
0
;
}
kvm_arch_pre_run
(
env
,
run
);
...
...
@@ -609,7 +615,7 @@ int kvm_cpu_exec(CPUState *env)
abort
();
}
kvm_
run_coalesced_mmio
(
env
,
run
);
kvm_
flush_coalesced_mmio_buffer
(
);
ret
=
0
;
/* exit loop */
switch
(
run
->
exit_reason
)
{
...
...
@@ -939,9 +945,9 @@ static void kvm_invoke_set_guest_debug(void *data)
struct
kvm_set_guest_debug_data
*
dbg_data
=
data
;
CPUState
*
env
=
dbg_data
->
env
;
if
(
env
->
kvm_
state
->
regs_modified
)
{
if
(
env
->
kvm_
vcpu_dirty
)
{
kvm_arch_put_registers
(
env
);
env
->
kvm_
state
->
regs_modified
=
0
;
env
->
kvm_
vcpu_dirty
=
0
;
}
dbg_data
->
err
=
kvm_vcpu_ioctl
(
env
,
KVM_SET_GUEST_DEBUG
,
&
dbg_data
->
dbg
);
}
...
...
kvm.h
浏览文件 @
8217d945
...
...
@@ -53,6 +53,7 @@ void kvm_setup_guest_memory(void *start, size_t size);
int
kvm_coalesce_mmio_region
(
target_phys_addr_t
start
,
ram_addr_t
size
);
int
kvm_uncoalesce_mmio_region
(
target_phys_addr_t
start
,
ram_addr_t
size
);
void
kvm_flush_coalesced_mmio_buffer
(
void
);
int
kvm_insert_breakpoint
(
CPUState
*
current_env
,
target_ulong
addr
,
target_ulong
len
,
int
type
);
...
...
target-i386/kvm.c
浏览文件 @
8217d945
...
...
@@ -99,12 +99,18 @@ uint32_t kvm_arch_get_supported_cpuid(CPUState *env, uint32_t function, int reg)
break
;
case
R_EDX
:
ret
=
cpuid
->
entries
[
i
].
edx
;
if
(
function
==
0x80000001
)
{
switch
(
function
)
{
case
1
:
/* KVM before 2.6.30 misreports the following features */
ret
|=
CPUID_MTRR
|
CPUID_PAT
|
CPUID_MCE
|
CPUID_MCA
;
break
;
case
0x80000001
:
/* On Intel, kvm returns cpuid according to the Intel spec,
* so add missing bits according to the AMD spec:
*/
cpuid_1_edx
=
kvm_arch_get_supported_cpuid
(
env
,
1
,
R_EDX
);
ret
|=
cpuid_1_edx
&
0xdfeff7ff
;
break
;
}
break
;
}
...
...
@@ -794,6 +800,9 @@ static int kvm_put_vcpu_events(CPUState *env)
events
.
sipi_vector
=
env
->
sipi_vector
;
events
.
flags
=
KVM_VCPUEVENT_VALID_NMI_PENDING
|
KVM_VCPUEVENT_VALID_SIPI_VECTOR
;
return
kvm_vcpu_ioctl
(
env
,
KVM_SET_VCPU_EVENTS
,
&
events
);
#else
return
0
;
...
...
vl.c
浏览文件 @
8217d945
...
...
@@ -2996,6 +2996,7 @@ static void gui_update(void *opaque)
DisplayState
*
ds
=
opaque
;
DisplayChangeListener
*
dcl
=
ds
->
listeners
;
qemu_flush_coalesced_mmio_buffer
();
dpy_refresh
(
ds
);
while
(
dcl
!=
NULL
)
{
...
...
@@ -3011,6 +3012,7 @@ static void nographic_update(void *opaque)
{
uint64_t
interval
=
GUI_REFRESH_INTERVAL
;
qemu_flush_coalesced_mmio_buffer
();
qemu_mod_timer
(
nographic_timer
,
interval
+
qemu_get_clock
(
rt_clock
));
}
...
...
@@ -3280,6 +3282,8 @@ static int cpu_can_run(CPUState *env)
return
0
;
if
(
env
->
stopped
)
return
0
;
if
(
!
vm_running
)
return
0
;
return
1
;
}
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录