Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
openeuler
qemu
提交
03ff0958
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看板
提交
03ff0958
编写于
7月 19, 2011
作者:
A
Anthony Liguori
浏览文件
操作
浏览文件
下载
差异文件
Merge remote-tracking branch 'agraf/xen-next' into staging
上级
b4dabf95
25a11813
变更
17
隐藏空白更改
内联
并排
Showing
17 changed file
with
221 addition
and
137 deletion
+221
-137
Makefile.objs
Makefile.objs
+2
-2
Makefile.target
Makefile.target
+2
-12
configure
configure
+1
-1
cpu-common.h
cpu-common.h
+1
-1
exec.c
exec.c
+32
-23
hw/xen.h
hw/xen.h
+1
-9
hw/xen_common.h
hw/xen_common.h
+12
-0
hw/xen_console.c
hw/xen_console.c
+18
-7
hw/xen_disk.c
hw/xen_disk.c
+30
-7
hw/xenfb.c
hw/xenfb.c
+12
-7
scripts/checkpatch.pl
scripts/checkpatch.pl
+3
-1
trace-events
trace-events
+3
-3
xen-all.c
xen-all.c
+71
-2
xen-mapcache-stub.c
xen-mapcache-stub.c
+0
-36
xen-mapcache.c
xen-mapcache.c
+23
-18
xen-mapcache.h
xen-mapcache.h
+6
-8
xen-stub.c
xen-stub.c
+4
-0
未找到文件。
Makefile.objs
浏览文件 @
03ff0958
...
...
@@ -155,8 +155,8 @@ slirp-obj-y += tcp_subr.o tcp_timer.o udp.o bootp.o tftp.o
common-obj-$(CONFIG_SLIRP)
+=
$(
addprefix
slirp/,
$
(
slirp-obj-y
))
# xen backend driver support
common-obj-$(CONFIG_XEN)
+=
xen_backend.o xen_devconfig.o
common-obj-$(CONFIG_XEN)
+=
xen_console.o xenfb.o xen_disk.o xen_nic.o
common-obj-$(CONFIG_XEN
_BACKEND
)
+=
xen_backend.o xen_devconfig.o
common-obj-$(CONFIG_XEN
_BACKEND
)
+=
xen_console.o xenfb.o xen_disk.o xen_nic.o
######################################################################
# libuser
...
...
Makefile.target
浏览文件 @
03ff0958
...
...
@@ -3,6 +3,7 @@
GENERATED_HEADERS
=
config-target.h
CONFIG_NO_PCI
=
$(
if
$(
subst
n,,
$(CONFIG_PCI)
)
,n,y
)
CONFIG_NO_KVM
=
$(
if
$(
subst
n,,
$(CONFIG_KVM)
)
,n,y
)
CONFIG_NO_XEN
=
$(
if
$(
subst
n,,
$(CONFIG_XEN)
)
,n,y
)
include
../config-host.mak
include
config-devices.mak
...
...
@@ -204,20 +205,9 @@ QEMU_CFLAGS += $(VNC_SASL_CFLAGS)
QEMU_CFLAGS
+=
$(VNC_JPEG_CFLAGS)
QEMU_CFLAGS
+=
$(VNC_PNG_CFLAGS)
# xen backend driver support
obj-i386-$(CONFIG_XEN)
+=
xen_machine_pv.o xen_domainbuild.o
ifeq
($(TARGET_BASE_ARCH), i386)
CONFIG_NO_XEN
=
$(
if
$(
subst
n,,
$(CONFIG_XEN)
)
,n,y
)
else
CONFIG_NO_XEN
=
y
endif
# xen support
CONFIG_NO_XEN_MAPCACHE
=
$(
if
$(
subst
n,,
$(CONFIG_XEN_MAPCACHE)
)
,n,y
)
obj-i386-$(CONFIG_XEN)
+=
xen-all.o
obj-$(CONFIG_XEN)
+=
xen-all.o xen_machine_pv.o xen_domainbuild.o xen-mapcache.o
obj-$(CONFIG_NO_XEN)
+=
xen-stub.o
obj-i386-$(CONFIG_XEN_MAPCACHE)
+=
xen-mapcache.o
obj-$(CONFIG_NO_XEN_MAPCACHE)
+=
xen-mapcache-stub.o
obj-i386-$(CONFIG_XEN)
+=
xen_platform.o
...
...
configure
浏览文件 @
03ff0958
...
...
@@ -2850,7 +2850,7 @@ if test "$bluez" = "yes" ; then
echo
"BLUEZ_CFLAGS=
$bluez_cflags
"
>>
$config_host_mak
fi
if
test
"
$xen
"
=
"yes"
;
then
echo
"CONFIG_XEN=y"
>>
$config_host_mak
echo
"CONFIG_XEN
_BACKEND
=y"
>>
$config_host_mak
echo
"CONFIG_XEN_CTRL_INTERFACE_VERSION=
$xen_ctrl_version
"
>>
$config_host_mak
fi
if
test
"
$io_thread
"
=
"yes"
;
then
...
...
cpu-common.h
浏览文件 @
03ff0958
...
...
@@ -65,7 +65,7 @@ void qemu_ram_free_from_ptr(ram_addr_t addr);
void
qemu_ram_remap
(
ram_addr_t
addr
,
ram_addr_t
length
);
/* This should only be used for ram local to a device. */
void
*
qemu_get_ram_ptr
(
ram_addr_t
addr
);
void
*
qemu_ram_ptr_length
(
target_phys_addr_t
addr
,
target_phys
_addr_t
*
size
);
void
*
qemu_ram_ptr_length
(
ram_addr_t
addr
,
ram
_addr_t
*
size
);
/* Same but slower, to use for migration, where the order of
* RAMBlocks must not change. */
void
*
qemu_safe_ram_ptr
(
ram_addr_t
addr
);
...
...
exec.c
浏览文件 @
03ff0958
...
...
@@ -2953,7 +2953,7 @@ ram_addr_t qemu_ram_alloc_from_ptr(DeviceState *dev, const char *name,
abort
();
}
#else
if
(
xen_
mapcache_
enabled
())
{
if
(
xen_enabled
())
{
xen_ram_alloc
(
new_block
->
offset
,
size
);
}
else
{
new_block
->
host
=
qemu_vmalloc
(
size
);
...
...
@@ -3019,8 +3019,8 @@ void qemu_ram_free(ram_addr_t addr)
#if defined(TARGET_S390X) && defined(CONFIG_KVM)
munmap
(
block
->
host
,
block
->
length
);
#else
if
(
xen_
mapcache_
enabled
())
{
qemu_invalidat
e_entry
(
block
->
host
);
if
(
xen_enabled
())
{
xen_invalidate_map_cach
e_entry
(
block
->
host
);
}
else
{
qemu_vfree
(
block
->
host
);
}
...
...
@@ -3112,15 +3112,16 @@ void *qemu_get_ram_ptr(ram_addr_t addr)
QLIST_REMOVE
(
block
,
next
);
QLIST_INSERT_HEAD
(
&
ram_list
.
blocks
,
block
,
next
);
}
if
(
xen_
mapcache_
enabled
())
{
if
(
xen_enabled
())
{
/* We need to check if the requested address is in the RAM
* because we don't want to map the entire memory in QEMU.
* In that case just map until the end of the page.
*/
if
(
block
->
offset
==
0
)
{
return
qemu
_map_cache
(
addr
,
0
,
0
);
return
xen
_map_cache
(
addr
,
0
,
0
);
}
else
if
(
block
->
host
==
NULL
)
{
block
->
host
=
qemu_map_cache
(
block
->
offset
,
block
->
length
,
1
);
block
->
host
=
xen_map_cache
(
block
->
offset
,
block
->
length
,
1
);
}
}
return
block
->
host
+
(
addr
-
block
->
offset
);
...
...
@@ -3142,15 +3143,16 @@ void *qemu_safe_ram_ptr(ram_addr_t addr)
QLIST_FOREACH
(
block
,
&
ram_list
.
blocks
,
next
)
{
if
(
addr
-
block
->
offset
<
block
->
length
)
{
if
(
xen_
mapcache_
enabled
())
{
if
(
xen_enabled
())
{
/* We need to check if the requested address is in the RAM
* because we don't want to map the entire memory in QEMU.
* In that case just map until the end of the page.
*/
if
(
block
->
offset
==
0
)
{
return
qemu
_map_cache
(
addr
,
0
,
0
);
return
xen
_map_cache
(
addr
,
0
,
0
);
}
else
if
(
block
->
host
==
NULL
)
{
block
->
host
=
qemu_map_cache
(
block
->
offset
,
block
->
length
,
1
);
block
->
host
=
xen_map_cache
(
block
->
offset
,
block
->
length
,
1
);
}
}
return
block
->
host
+
(
addr
-
block
->
offset
);
...
...
@@ -3165,11 +3167,14 @@ void *qemu_safe_ram_ptr(ram_addr_t addr)
/* Return a host pointer to guest's ram. Similar to qemu_get_ram_ptr
* but takes a size argument */
void
*
qemu_ram_ptr_length
(
target_phys_addr_t
addr
,
target_phys
_addr_t
*
size
)
void
*
qemu_ram_ptr_length
(
ram_addr_t
addr
,
ram
_addr_t
*
size
)
{
if
(
xen_mapcache_enabled
())
return
qemu_map_cache
(
addr
,
*
size
,
1
);
else
{
if
(
*
size
==
0
)
{
return
NULL
;
}
if
(
xen_enabled
())
{
return
xen_map_cache
(
addr
,
*
size
,
1
);
}
else
{
RAMBlock
*
block
;
QLIST_FOREACH
(
block
,
&
ram_list
.
blocks
,
next
)
{
...
...
@@ -3182,9 +3187,6 @@ void *qemu_ram_ptr_length(target_phys_addr_t addr, target_phys_addr_t *size)
fprintf
(
stderr
,
"Bad ram offset %"
PRIx64
"
\n
"
,
(
uint64_t
)
addr
);
abort
();
*
size
=
0
;
return
NULL
;
}
}
...
...
@@ -3198,8 +3200,8 @@ int qemu_ram_addr_from_host(void *ptr, ram_addr_t *ram_addr)
RAMBlock
*
block
;
uint8_t
*
host
=
ptr
;
if
(
xen_
mapcache_
enabled
())
{
*
ram_addr
=
qemu
_ram_addr_from_mapcache
(
ptr
);
if
(
xen_enabled
())
{
*
ram_addr
=
xen
_ram_addr_from_mapcache
(
ptr
);
return
0
;
}
...
...
@@ -4050,7 +4052,9 @@ void *cpu_physical_memory_map(target_phys_addr_t addr,
target_phys_addr_t
page
;
unsigned
long
pd
;
PhysPageDesc
*
p
;
target_phys_addr_t
addr1
=
addr
;
ram_addr_t
raddr
=
ULONG_MAX
;
ram_addr_t
rlen
;
void
*
ret
;
while
(
len
>
0
)
{
page
=
addr
&
TARGET_PAGE_MASK
;
...
...
@@ -4078,13 +4082,18 @@ void *cpu_physical_memory_map(target_phys_addr_t addr,
*
plen
=
l
;
return
bounce
.
buffer
;
}
if
(
!
todo
)
{
raddr
=
(
pd
&
TARGET_PAGE_MASK
)
+
(
addr
&
~
TARGET_PAGE_MASK
);
}
len
-=
l
;
addr
+=
l
;
todo
+=
l
;
}
*
plen
=
todo
;
return
qemu_ram_ptr_length
(
addr1
,
plen
);
rlen
=
todo
;
ret
=
qemu_ram_ptr_length
(
raddr
,
&
rlen
);
*
plen
=
rlen
;
return
ret
;
}
/* Unmaps a memory region previously mapped by cpu_physical_memory_map().
...
...
@@ -4113,8 +4122,8 @@ void cpu_physical_memory_unmap(void *buffer, target_phys_addr_t len,
access_len
-=
l
;
}
}
if
(
xen_
mapcache_
enabled
())
{
qemu_invalidat
e_entry
(
buffer
);
if
(
xen_enabled
())
{
xen_invalidate_map_cach
e_entry
(
buffer
);
}
return
;
}
...
...
hw/xen.h
浏览文件 @
03ff0958
...
...
@@ -31,15 +31,6 @@ static inline int xen_enabled(void)
#endif
}
static
inline
int
xen_mapcache_enabled
(
void
)
{
#ifdef CONFIG_XEN_MAPCACHE
return
xen_enabled
();
#else
return
0
;
#endif
}
int
xen_pci_slot_get_pirq
(
PCIDevice
*
pci_dev
,
int
irq_num
);
void
xen_piix3_set_irq
(
void
*
opaque
,
int
irq_num
,
int
level
);
void
xen_piix_pci_write_config_client
(
uint32_t
address
,
uint32_t
val
,
int
len
);
...
...
@@ -50,6 +41,7 @@ qemu_irq *xen_interrupt_controller_init(void);
int
xen_init
(
void
);
int
xen_hvm_init
(
void
);
void
xen_vcpu_init
(
void
);
void
xenstore_store_pv_console_info
(
int
i
,
struct
CharDriverState
*
chr
);
#if defined(NEED_CPU_H) && !defined(CONFIG_USER_ONLY)
void
xen_ram_alloc
(
ram_addr_t
ram_addr
,
ram_addr_t
size
);
...
...
hw/xen_common.h
浏览文件 @
03ff0958
...
...
@@ -85,6 +85,18 @@ static inline int xc_domain_add_to_physmap(int xc_handle, uint32_t domid,
return
xc_memory_op
(
xc_handle
,
XENMEM_add_to_physmap
,
&
xatp
);
}
static
inline
struct
xs_handle
*
xs_open
(
unsigned
long
flags
)
{
return
xs_daemon_open
();
}
static
inline
void
xs_close
(
struct
xs_handle
*
xsh
)
{
if
(
xsh
!=
NULL
)
{
xs_daemon_close
(
xsh
);
}
}
/* Xen 4.1 */
#else
...
...
hw/xen_console.c
浏览文件 @
03ff0958
...
...
@@ -179,7 +179,9 @@ static void xencons_send(struct XenConsole *con)
static
int
con_init
(
struct
XenDevice
*
xendev
)
{
struct
XenConsole
*
con
=
container_of
(
xendev
,
struct
XenConsole
,
xendev
);
char
*
type
,
*
dom
;
char
*
type
,
*
dom
,
label
[
32
];
int
ret
=
0
;
const
char
*
output
;
/* setup */
dom
=
xs_get_domain_path
(
xenstore
,
con
->
xendev
.
dom
);
...
...
@@ -189,16 +191,25 @@ static int con_init(struct XenDevice *xendev)
type
=
xenstore_read_str
(
con
->
console
,
"type"
);
if
(
!
type
||
strcmp
(
type
,
"ioemu"
)
!=
0
)
{
xen_be_printf
(
xendev
,
1
,
"not for me (type=%s)
\n
"
,
type
);
return
-
1
;
ret
=
-
1
;
goto
out
;
}
if
(
!
serial_hds
[
con
->
xendev
.
dev
])
xen_be_printf
(
xendev
,
1
,
"WARNING: serial line %d not configured
\n
"
,
con
->
xendev
.
dev
);
else
output
=
xenstore_read_str
(
con
->
console
,
"output"
);
/* no Xen override, use qemu output device */
if
(
output
==
NULL
)
{
con
->
chr
=
serial_hds
[
con
->
xendev
.
dev
];
}
else
{
snprintf
(
label
,
sizeof
(
label
),
"xencons%d"
,
con
->
xendev
.
dev
);
con
->
chr
=
qemu_chr_open
(
label
,
output
,
NULL
);
}
return
0
;
xenstore_store_pv_console_info
(
con
->
xendev
.
dev
,
con
->
chr
);
out:
qemu_free
(
type
);
return
ret
;
}
static
int
con_connect
(
struct
XenDevice
*
xendev
)
...
...
hw/xen_disk.c
浏览文件 @
03ff0958
...
...
@@ -616,12 +616,14 @@ static int blk_init(struct XenDevice *xendev)
{
struct
XenBlkDev
*
blkdev
=
container_of
(
xendev
,
struct
XenBlkDev
,
xendev
);
int
index
,
qflags
,
have_barriers
,
info
=
0
;
char
*
h
;
/* read xenstore entries */
if
(
blkdev
->
params
==
NULL
)
{
char
*
h
=
NULL
;
blkdev
->
params
=
xenstore_read_be_str
(
&
blkdev
->
xendev
,
"params"
);
h
=
strchr
(
blkdev
->
params
,
':'
);
if
(
blkdev
->
params
!=
NULL
)
{
h
=
strchr
(
blkdev
->
params
,
':'
);
}
if
(
h
!=
NULL
)
{
blkdev
->
fileproto
=
blkdev
->
params
;
blkdev
->
filename
=
h
+
1
;
...
...
@@ -631,6 +633,9 @@ static int blk_init(struct XenDevice *xendev)
blkdev
->
filename
=
blkdev
->
params
;
}
}
if
(
!
strcmp
(
"aio"
,
blkdev
->
fileproto
))
{
blkdev
->
fileproto
=
"raw"
;
}
if
(
blkdev
->
mode
==
NULL
)
{
blkdev
->
mode
=
xenstore_read_be_str
(
&
blkdev
->
xendev
,
"mode"
);
}
...
...
@@ -649,7 +654,7 @@ static int blk_init(struct XenDevice *xendev)
blkdev
->
mode
==
NULL
||
blkdev
->
type
==
NULL
||
blkdev
->
dev
==
NULL
)
{
return
-
1
;
goto
out_error
;
}
/* read-only ? */
...
...
@@ -672,10 +677,15 @@ static int blk_init(struct XenDevice *xendev)
/* setup via xenbus -> create new block driver instance */
xen_be_printf
(
&
blkdev
->
xendev
,
2
,
"create new bdrv (xenbus setup)
\n
"
);
blkdev
->
bs
=
bdrv_new
(
blkdev
->
dev
);
if
(
bdrv_open
(
blkdev
->
bs
,
blkdev
->
filename
,
qflags
,
bdrv_find_whitelisted_format
(
blkdev
->
fileproto
))
!=
0
)
{
bdrv_delete
(
blkdev
->
bs
);
return
-
1
;
if
(
blkdev
->
bs
)
{
if
(
bdrv_open
(
blkdev
->
bs
,
blkdev
->
filename
,
qflags
,
bdrv_find_whitelisted_format
(
blkdev
->
fileproto
))
!=
0
)
{
bdrv_delete
(
blkdev
->
bs
);
blkdev
->
bs
=
NULL
;
}
}
if
(
!
blkdev
->
bs
)
{
goto
out_error
;
}
}
else
{
/* setup via qemu cmdline -> already setup for us */
...
...
@@ -704,6 +714,19 @@ static int blk_init(struct XenDevice *xendev)
xenstore_write_be_int
(
&
blkdev
->
xendev
,
"sectors"
,
blkdev
->
file_size
/
blkdev
->
file_blk
);
return
0
;
out_error:
qemu_free
(
blkdev
->
params
);
blkdev
->
params
=
NULL
;
qemu_free
(
blkdev
->
mode
);
blkdev
->
mode
=
NULL
;
qemu_free
(
blkdev
->
type
);
blkdev
->
type
=
NULL
;
qemu_free
(
blkdev
->
dev
);
blkdev
->
dev
=
NULL
;
qemu_free
(
blkdev
->
devtype
);
blkdev
->
devtype
=
NULL
;
return
-
1
;
}
static
int
blk_connect
(
struct
XenDevice
*
xendev
)
...
...
hw/xenfb.c
浏览文件 @
03ff0958
...
...
@@ -347,13 +347,6 @@ static void xenfb_mouse_event(void *opaque,
static
int
input_init
(
struct
XenDevice
*
xendev
)
{
struct
XenInput
*
in
=
container_of
(
xendev
,
struct
XenInput
,
c
.
xendev
);
if
(
!
in
->
c
.
ds
)
{
xen_be_printf
(
xendev
,
1
,
"ds not set (yet)
\n
"
);
return
-
1
;
}
xenstore_write_be_int
(
xendev
,
"feature-abs-pointer"
,
1
);
return
0
;
}
...
...
@@ -367,6 +360,18 @@ static int input_connect(struct XenDevice *xendev)
&
in
->
abs_pointer_wanted
)
==
-
1
)
in
->
abs_pointer_wanted
=
0
;
if
(
!
in
->
c
.
ds
)
{
char
*
vfb
=
xenstore_read_str
(
NULL
,
"device/vfb"
);
if
(
vfb
==
NULL
)
{
/* there is no vfb, run vkbd on its own */
in
->
c
.
ds
=
get_displaystate
();
}
else
{
qemu_free
(
vfb
);
xen_be_printf
(
xendev
,
1
,
"ds not set (yet)
\n
"
);
return
-
1
;
}
}
rc
=
common_bind
(
&
in
->
c
);
if
(
rc
!=
0
)
return
rc
;
...
...
scripts/checkpatch.pl
浏览文件 @
03ff0958
...
...
@@ -2068,8 +2068,10 @@ sub process {
}
# , must have a space on the right.
# not required when having a single },{ on one line
}
elsif
(
$op
eq
'
,
')
{
if
(
$ctx
!~
/.x[WEC]/
&&
$cc
!~
/^}/
)
{
if
(
$ctx
!~
/.x[WEC]/
&&
$cc
!~
/^}/
&&
(
$elements
[
$n
]
.
$elements
[
$n
+
2
])
!~
"
*}{
")
{
ERROR
("
space required after that '
$op
'
$at
\n
"
.
$hereptr
);
}
...
...
trace-events
浏览文件 @
03ff0958
...
...
@@ -410,9 +410,9 @@ disable xen_ram_alloc(unsigned long ram_addr, unsigned long size) "requested: %#
disable xen_client_set_memory(uint64_t start_addr, unsigned long size, unsigned long phys_offset, bool log_dirty) "%#"PRIx64" size %#lx, offset %#lx, log_dirty %i"
# xen-mapcache.c
disable
qemu
_map_cache(uint64_t phys_addr) "want %#"PRIx64""
disable
qemu
_remap_bucket(uint64_t index) "index %#"PRIx64""
disable
qemu
_map_cache_return(void* ptr) "%p"
disable
xen
_map_cache(uint64_t phys_addr) "want %#"PRIx64""
disable
xen
_remap_bucket(uint64_t index) "index %#"PRIx64""
disable
xen
_map_cache_return(void* ptr) "%p"
disable xen_map_block(uint64_t phys_addr, uint64_t size) "%#"PRIx64", size %#"PRIx64""
disable xen_unmap_block(void* addr, unsigned long size) "%p, size %#lx"
...
...
xen-all.c
浏览文件 @
03ff0958
...
...
@@ -644,7 +644,7 @@ static void handle_ioreq(ioreq_t *req)
case
IOREQ_TYPE_TIMEOFFSET
:
break
;
case
IOREQ_TYPE_INVALIDATE
:
qemu
_invalidate_map_cache
();
xen
_invalidate_map_cache
();
break
;
default:
hw_error
(
"Invalid ioreq type 0x%x
\n
"
,
req
->
type
);
...
...
@@ -737,6 +737,66 @@ static void cpu_handle_ioreq(void *opaque)
}
}
static
int
store_dev_info
(
int
domid
,
CharDriverState
*
cs
,
const
char
*
string
)
{
struct
xs_handle
*
xs
=
NULL
;
char
*
path
=
NULL
;
char
*
newpath
=
NULL
;
char
*
pts
=
NULL
;
int
ret
=
-
1
;
/* Only continue if we're talking to a pty. */
if
(
strncmp
(
cs
->
filename
,
"pty:"
,
4
))
{
return
0
;
}
pts
=
cs
->
filename
+
4
;
/* We now have everything we need to set the xenstore entry. */
xs
=
xs_open
(
0
);
if
(
xs
==
NULL
)
{
fprintf
(
stderr
,
"Could not contact XenStore
\n
"
);
goto
out
;
}
path
=
xs_get_domain_path
(
xs
,
domid
);
if
(
path
==
NULL
)
{
fprintf
(
stderr
,
"xs_get_domain_path() error
\n
"
);
goto
out
;
}
newpath
=
realloc
(
path
,
(
strlen
(
path
)
+
strlen
(
string
)
+
strlen
(
"/tty"
)
+
1
));
if
(
newpath
==
NULL
)
{
fprintf
(
stderr
,
"realloc error
\n
"
);
goto
out
;
}
path
=
newpath
;
strcat
(
path
,
string
);
strcat
(
path
,
"/tty"
);
if
(
!
xs_write
(
xs
,
XBT_NULL
,
path
,
pts
,
strlen
(
pts
)))
{
fprintf
(
stderr
,
"xs_write for '%s' fail"
,
string
);
goto
out
;
}
ret
=
0
;
out:
free
(
path
);
xs_close
(
xs
);
return
ret
;
}
void
xenstore_store_pv_console_info
(
int
i
,
CharDriverState
*
chr
)
{
if
(
i
==
0
)
{
store_dev_info
(
xen_domid
,
chr
,
"/console"
);
}
else
{
char
buf
[
32
];
snprintf
(
buf
,
sizeof
(
buf
),
"/device/console/%d"
,
i
);
store_dev_info
(
xen_domid
,
chr
,
buf
);
}
}
static
void
xenstore_record_dm_state
(
XenIOState
*
s
,
const
char
*
state
)
{
char
path
[
50
];
...
...
@@ -852,7 +912,7 @@ int xen_hvm_init(void)
}
/* Init RAM management */
qemu
_map_cache_init
();
xen
_map_cache_init
();
xen_ram_init
(
ram_size
);
qemu_add_vm_change_state_handler
(
xen_vm_change_state_handler
,
state
);
...
...
@@ -862,6 +922,15 @@ int xen_hvm_init(void)
cpu_register_phys_memory_client
(
&
state
->
client
);
state
->
log_for_dirtybit
=
NULL
;
/* Initialize backend core & drivers */
if
(
xen_be_init
()
!=
0
)
{
fprintf
(
stderr
,
"%s: xen backend core setup failed
\n
"
,
__FUNCTION__
);
exit
(
1
);
}
xen_be_register
(
"console"
,
&
xen_console_ops
);
xen_be_register
(
"vkbd"
,
&
xen_kbdmouse_ops
);
xen_be_register
(
"qdisk"
,
&
xen_blkdev_ops
);
return
0
;
}
...
...
xen-mapcache-stub.c
已删除
100644 → 0
浏览文件 @
b4dabf95
/*
* Copyright (C) 2011 Citrix Ltd.
*
* This work is licensed under the terms of the GNU GPL, version 2. See
* the COPYING file in the top-level directory.
*
*/
#include "config.h"
#include "cpu.h"
#include "qemu-common.h"
#include "cpu-common.h"
#include "xen-mapcache.h"
void
qemu_map_cache_init
(
void
)
{
}
uint8_t
*
qemu_map_cache
(
target_phys_addr_t
phys_addr
,
target_phys_addr_t
size
,
uint8_t
lock
)
{
return
qemu_get_ram_ptr
(
phys_addr
);
}
ram_addr_t
qemu_ram_addr_from_mapcache
(
void
*
ptr
)
{
return
-
1
;
}
void
qemu_invalidate_map_cache
(
void
)
{
}
void
qemu_invalidate_entry
(
uint8_t
*
buffer
)
{
}
xen-mapcache.c
浏览文件 @
03ff0958
...
...
@@ -40,6 +40,9 @@
#endif
#define MCACHE_BUCKET_SIZE (1UL << MCACHE_BUCKET_SHIFT)
#define mapcache_lock() ((void)0)
#define mapcache_unlock() ((void)0)
typedef
struct
MapCacheEntry
{
target_phys_addr_t
paddr_index
;
uint8_t
*
vaddr_base
;
...
...
@@ -79,7 +82,7 @@ static inline int test_bits(int nr, int size, const unsigned long *addr)
return
0
;
}
void
qemu
_map_cache_init
(
void
)
void
xen
_map_cache_init
(
void
)
{
unsigned
long
size
;
struct
rlimit
rlimit_as
;
...
...
@@ -106,13 +109,14 @@ void qemu_map_cache_init(void)
size
=
mapcache
->
nr_buckets
*
sizeof
(
MapCacheEntry
);
size
=
(
size
+
XC_PAGE_SIZE
-
1
)
&
~
(
XC_PAGE_SIZE
-
1
);
DPRINTF
(
"qemu_map_cache_init, nr_buckets = %lx size %lu
\n
"
,
mapcache
->
nr_buckets
,
size
);
DPRINTF
(
"%s, nr_buckets = %lx size %lu
\n
"
,
__func__
,
mapcache
->
nr_buckets
,
size
);
mapcache
->
entry
=
qemu_mallocz
(
size
);
}
static
void
qemu
_remap_bucket
(
MapCacheEntry
*
entry
,
target_phys_addr_t
size
,
target_phys_addr_t
address_index
)
static
void
xen
_remap_bucket
(
MapCacheEntry
*
entry
,
target_phys_addr_t
size
,
target_phys_addr_t
address_index
)
{
uint8_t
*
vaddr_base
;
xen_pfn_t
*
pfns
;
...
...
@@ -120,7 +124,7 @@ static void qemu_remap_bucket(MapCacheEntry *entry,
unsigned
int
i
;
target_phys_addr_t
nb_pfn
=
size
>>
XC_PAGE_SHIFT
;
trace_
qemu
_remap_bucket
(
address_index
);
trace_
xen
_remap_bucket
(
address_index
);
pfns
=
qemu_mallocz
(
nb_pfn
*
sizeof
(
xen_pfn_t
));
err
=
qemu_mallocz
(
nb_pfn
*
sizeof
(
int
));
...
...
@@ -164,17 +168,18 @@ static void qemu_remap_bucket(MapCacheEntry *entry,
qemu_free
(
err
);
}
uint8_t
*
qemu_map_cache
(
target_phys_addr_t
phys_addr
,
target_phys_addr_t
size
,
uint8_t
lock
)
uint8_t
*
xen_map_cache
(
target_phys_addr_t
phys_addr
,
target_phys_addr_t
size
,
uint8_t
lock
)
{
MapCacheEntry
*
entry
,
*
pentry
=
NULL
;
target_phys_addr_t
address_index
=
phys_addr
>>
MCACHE_BUCKET_SHIFT
;
target_phys_addr_t
address_offset
=
phys_addr
&
(
MCACHE_BUCKET_SIZE
-
1
);
target_phys_addr_t
__size
=
size
;
trace_
qemu
_map_cache
(
phys_addr
);
trace_
xen
_map_cache
(
phys_addr
);
if
(
address_index
==
mapcache
->
last_address_index
&&
!
lock
&&
!
__size
)
{
trace_
qemu
_map_cache_return
(
mapcache
->
last_address_vaddr
+
address_offset
);
trace_
xen
_map_cache_return
(
mapcache
->
last_address_vaddr
+
address_offset
);
return
mapcache
->
last_address_vaddr
+
address_offset
;
}
...
...
@@ -198,20 +203,20 @@ uint8_t *qemu_map_cache(target_phys_addr_t phys_addr, target_phys_addr_t size, u
if
(
!
entry
)
{
entry
=
qemu_mallocz
(
sizeof
(
MapCacheEntry
));
pentry
->
next
=
entry
;
qemu
_remap_bucket
(
entry
,
__size
,
address_index
);
xen
_remap_bucket
(
entry
,
__size
,
address_index
);
}
else
if
(
!
entry
->
lock
)
{
if
(
!
entry
->
vaddr_base
||
entry
->
paddr_index
!=
address_index
||
entry
->
size
!=
__size
||
!
test_bits
(
address_offset
>>
XC_PAGE_SHIFT
,
size
>>
XC_PAGE_SHIFT
,
entry
->
valid_mapping
))
{
qemu
_remap_bucket
(
entry
,
__size
,
address_index
);
xen
_remap_bucket
(
entry
,
__size
,
address_index
);
}
}
if
(
!
test_bits
(
address_offset
>>
XC_PAGE_SHIFT
,
size
>>
XC_PAGE_SHIFT
,
entry
->
valid_mapping
))
{
mapcache
->
last_address_index
=
-
1
;
trace_
qemu
_map_cache_return
(
NULL
);
trace_
xen
_map_cache_return
(
NULL
);
return
NULL
;
}
...
...
@@ -226,11 +231,11 @@ uint8_t *qemu_map_cache(target_phys_addr_t phys_addr, target_phys_addr_t size, u
QTAILQ_INSERT_HEAD
(
&
mapcache
->
locked_entries
,
reventry
,
next
);
}
trace_
qemu
_map_cache_return
(
mapcache
->
last_address_vaddr
+
address_offset
);
trace_
xen
_map_cache_return
(
mapcache
->
last_address_vaddr
+
address_offset
);
return
mapcache
->
last_address_vaddr
+
address_offset
;
}
ram_addr_t
qemu
_ram_addr_from_mapcache
(
void
*
ptr
)
ram_addr_t
xen
_ram_addr_from_mapcache
(
void
*
ptr
)
{
MapCacheEntry
*
entry
=
NULL
,
*
pentry
=
NULL
;
MapCacheRev
*
reventry
;
...
...
@@ -247,7 +252,7 @@ ram_addr_t qemu_ram_addr_from_mapcache(void *ptr)
}
}
if
(
!
found
)
{
fprintf
(
stderr
,
"
qemu_ram_addr_from_mapcache, could not find %p
\n
"
,
ptr
);
fprintf
(
stderr
,
"
%s, could not find %p
\n
"
,
__func__
,
ptr
);
QTAILQ_FOREACH
(
reventry
,
&
mapcache
->
locked_entries
,
next
)
{
DPRINTF
(
" "
TARGET_FMT_plx
" -> %p is present
\n
"
,
reventry
->
paddr_index
,
reventry
->
vaddr_req
);
...
...
@@ -269,7 +274,7 @@ ram_addr_t qemu_ram_addr_from_mapcache(void *ptr)
((
unsigned
long
)
ptr
-
(
unsigned
long
)
entry
->
vaddr_base
);
}
void
qemu_invalidat
e_entry
(
uint8_t
*
buffer
)
void
xen_invalidate_map_cach
e_entry
(
uint8_t
*
buffer
)
{
MapCacheEntry
*
entry
=
NULL
,
*
pentry
=
NULL
;
MapCacheRev
*
reventry
;
...
...
@@ -290,7 +295,7 @@ void qemu_invalidate_entry(uint8_t *buffer)
}
}
if
(
!
found
)
{
DPRINTF
(
"
qemu_invalidate_entry, could not find %p
\n
"
,
buffer
);
DPRINTF
(
"
%s, could not find %p
\n
"
,
__func__
,
buffer
);
QTAILQ_FOREACH
(
reventry
,
&
mapcache
->
locked_entries
,
next
)
{
DPRINTF
(
" "
TARGET_FMT_plx
" -> %p is present
\n
"
,
reventry
->
paddr_index
,
reventry
->
vaddr_req
);
}
...
...
@@ -322,7 +327,7 @@ void qemu_invalidate_entry(uint8_t *buffer)
qemu_free
(
entry
);
}
void
qemu
_invalidate_map_cache
(
void
)
void
xen
_invalidate_map_cache
(
void
)
{
unsigned
long
i
;
MapCacheRev
*
reventry
;
...
...
xen-mapcache.h
浏览文件 @
03ff0958
...
...
@@ -9,13 +9,11 @@
#ifndef XEN_MAPCACHE_H
#define XEN_MAPCACHE_H
void
qemu_map_cache_init
(
void
);
uint8_t
*
qemu_map_cache
(
target_phys_addr_t
phys_addr
,
target_phys_addr_t
size
,
uint8_t
lock
);
ram_addr_t
qemu_ram_addr_from_mapcache
(
void
*
ptr
);
void
qemu_invalidate_entry
(
uint8_t
*
buffer
);
void
qemu_invalidate_map_cache
(
void
);
#define mapcache_lock() ((void)0)
#define mapcache_unlock() ((void)0)
void
xen_map_cache_init
(
void
);
uint8_t
*
xen_map_cache
(
target_phys_addr_t
phys_addr
,
target_phys_addr_t
size
,
uint8_t
lock
);
ram_addr_t
xen_ram_addr_from_mapcache
(
void
*
ptr
);
void
xen_invalidate_map_cache_entry
(
uint8_t
*
buffer
);
void
xen_invalidate_map_cache
(
void
);
#endif
/* !XEN_MAPCACHE_H */
xen-stub.c
浏览文件 @
03ff0958
...
...
@@ -9,6 +9,10 @@
#include "qemu-common.h"
#include "hw/xen.h"
void
xenstore_store_pv_console_info
(
int
i
,
CharDriverState
*
chr
)
{
}
int
xen_pci_slot_get_pirq
(
PCIDevice
*
pci_dev
,
int
irq_num
)
{
return
-
1
;
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录