Compare commits
87 Commits
queue/ui-p
...
queue/ui+i
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
6e24ee0c1e | ||
|
|
954ee55bd5 | ||
|
|
8498bb8d2e | ||
|
|
85970a627f | ||
|
|
51dbea77a2 | ||
|
|
77b0359bf4 | ||
|
|
d3b787fa7d | ||
|
|
e18a639164 | ||
|
|
469819a3e8 | ||
|
|
22a9e1fd63 | ||
|
|
84e3d0725b | ||
|
|
db7a99cdc1 | ||
|
|
32b9ca9868 | ||
|
|
2a747008cb | ||
|
|
92bd1e465b | ||
|
|
492734b5da | ||
|
|
d2a44865e8 | ||
|
|
a825ca0613 | ||
|
|
a08fc2f8cc | ||
|
|
c34647c18a | ||
|
|
2e1d6bdcce | ||
|
|
c9c06eb832 | ||
|
|
905bf0ee8a | ||
|
|
32809e7f7b | ||
|
|
8a98bfc6e3 | ||
|
|
8a48be0e87 | ||
|
|
96e659d006 | ||
|
|
cf80eb8d09 | ||
|
|
2c1c31ed55 | ||
|
|
438d116872 | ||
|
|
4c84f662c2 | ||
|
|
2499ee9fad | ||
|
|
7af25f9f6a | ||
|
|
896b6757f9 | ||
|
|
269c20b2bb | ||
|
|
ad664c1d4c | ||
|
|
709fa704f6 | ||
|
|
61d7c14437 | ||
|
|
9848619a3b | ||
|
|
07fe095452 | ||
|
|
1eb4243434 | ||
|
|
77a7a36760 | ||
|
|
4ccd89d294 | ||
|
|
5d7fb0f254 | ||
|
|
c7b4efb4a0 | ||
|
|
1ea1572adf | ||
|
|
605553654f | ||
|
|
b81bdbf3c7 | ||
|
|
35f91e5069 | ||
|
|
6d13643a3a | ||
|
|
c5c6c47ce3 | ||
|
|
19e9cdf040 | ||
|
|
c03d83d55a | ||
|
|
b053ef6106 | ||
|
|
9ed442b8ae | ||
|
|
822335eb51 | ||
|
|
446de8b68a | ||
|
|
d528227d4c | ||
|
|
3fb2111fc9 | ||
|
|
76318657a8 | ||
|
|
85bbd1e7a4 | ||
|
|
1e507bb0fd | ||
|
|
d015c4ea6f | ||
|
|
3152779cd6 | ||
|
|
5923f85fb8 | ||
|
|
2bc7cfea09 | ||
|
|
61a8f418b2 | ||
|
|
36aeb6094f | ||
|
|
60390d2dc8 | ||
|
|
01b2ffcedd | ||
|
|
8da54b2507 | ||
|
|
542f70c22e | ||
|
|
54e1d4ed1d | ||
|
|
b97a879de9 | ||
|
|
308714e6bc | ||
|
|
9c39b94f14 | ||
|
|
acb0b292b6 | ||
|
|
3fb53fb4d1 | ||
|
|
cc74d332ff | ||
|
|
2b48e10f88 | ||
|
|
6e3b2bfd6a | ||
|
|
b255b2c8a5 | ||
|
|
58634047b7 | ||
|
|
c1214ad3dc | ||
|
|
7c877c8030 | ||
|
|
560f19f162 | ||
|
|
a2740ad584 |
@@ -1,15 +1,22 @@
|
|||||||
language: c
|
language: c
|
||||||
|
git:
|
||||||
|
submodules: false
|
||||||
env:
|
env:
|
||||||
|
global:
|
||||||
|
- LC_ALL=C
|
||||||
matrix:
|
matrix:
|
||||||
- IMAGE=debian-armhf-cross
|
- IMAGE=debian-armhf-cross
|
||||||
TARGET_LIST=arm-softmmu,arm-linux-user
|
TARGET_LIST=arm-softmmu,arm-linux-user,armeb-linux-user
|
||||||
- IMAGE=debian-arm64-cross
|
- IMAGE=debian-arm64-cross
|
||||||
TARGET_LIST=aarch64-softmmu,aarch64-linux-user
|
TARGET_LIST=aarch64-softmmu,aarch64-linux-user
|
||||||
- IMAGE=debian-s390x-cross
|
- IMAGE=debian-s390x-cross
|
||||||
TARGET_LIST=s390x-softmmu,s390x-linux-user
|
TARGET_LIST=s390x-softmmu,s390x-linux-user
|
||||||
|
# mips64el-softmmu disabled due to libfdt problem
|
||||||
|
- IMAGE=debian-mipsel-cross
|
||||||
|
TARGET_LIST=mipsel-softmmu,mipsel-linux-user,mips64el-linux-user
|
||||||
build:
|
build:
|
||||||
pre_ci:
|
pre_ci:
|
||||||
- make docker-image-${IMAGE}
|
- make docker-image-${IMAGE} V=1
|
||||||
pre_ci_boot:
|
pre_ci_boot:
|
||||||
image_name: qemu
|
image_name: qemu
|
||||||
image_tag: ${IMAGE}
|
image_tag: ${IMAGE}
|
||||||
@@ -17,5 +24,13 @@ build:
|
|||||||
options: "-e HOME=/root"
|
options: "-e HOME=/root"
|
||||||
ci:
|
ci:
|
||||||
- unset CC
|
- unset CC
|
||||||
|
# some targets require newer up to date packages, for example TARGET_LIST matching
|
||||||
|
# aarch64*-softmmu|arm*-softmmu|ppc*-softmmu|microblaze*-softmmu|mips64el-softmmu)
|
||||||
|
# see the configure script:
|
||||||
|
# error_exit "DTC (libfdt) version >= 1.4.2 not present. Your options:"
|
||||||
|
# " (1) Preferred: Install the DTC (libfdt) devel package"
|
||||||
|
# " (2) Fetch the DTC submodule, using:"
|
||||||
|
# " git submodule update --init dtc"
|
||||||
|
- dpkg --compare-versions `dpkg-query --showformat='${Version}' --show libfdt-dev` ge 1.4.2 || git submodule update --init dtc
|
||||||
- ./configure ${QEMU_CONFIGURE_OPTS} --target-list=${TARGET_LIST}
|
- ./configure ${QEMU_CONFIGURE_OPTS} --target-list=${TARGET_LIST}
|
||||||
- make -j2
|
- make -j$(($(getconf _NPROCESSORS_ONLN) + 1))
|
||||||
|
|||||||
@@ -1411,8 +1411,7 @@ F: include/qapi/qmp/
|
|||||||
X: include/qapi/qmp/dispatch.h
|
X: include/qapi/qmp/dispatch.h
|
||||||
F: scripts/coccinelle/qobject.cocci
|
F: scripts/coccinelle/qobject.cocci
|
||||||
F: tests/check-qdict.c
|
F: tests/check-qdict.c
|
||||||
F: tests/check-qfloat.c
|
F: tests/check-qnum.c
|
||||||
F: tests/check-qint.c
|
|
||||||
F: tests/check-qjson.c
|
F: tests/check-qjson.c
|
||||||
F: tests/check-qlist.c
|
F: tests/check-qlist.c
|
||||||
F: tests/check-qstring.c
|
F: tests/check-qstring.c
|
||||||
@@ -1858,12 +1857,14 @@ Build and test automation
|
|||||||
-------------------------
|
-------------------------
|
||||||
M: Alex Bennée <alex.bennee@linaro.org>
|
M: Alex Bennée <alex.bennee@linaro.org>
|
||||||
M: Fam Zheng <famz@redhat.com>
|
M: Fam Zheng <famz@redhat.com>
|
||||||
|
R: Philippe Mathieu-Daudé <f4bug@amsat.org>
|
||||||
L: qemu-devel@nongnu.org
|
L: qemu-devel@nongnu.org
|
||||||
S: Maintained
|
S: Maintained
|
||||||
F: .travis.yml
|
F: .travis.yml
|
||||||
F: .shippable.yml
|
F: .shippable.yml
|
||||||
F: tests/docker/
|
F: tests/docker/
|
||||||
W: https://travis-ci.org/qemu/qemu
|
W: https://travis-ci.org/qemu/qemu
|
||||||
|
W: https://app.shippable.com/github/qemu/qemu
|
||||||
W: http://patchew.org/QEMU/
|
W: http://patchew.org/QEMU/
|
||||||
|
|
||||||
Documentation
|
Documentation
|
||||||
|
|||||||
@@ -523,8 +523,6 @@ static inline PageDesc *page_find(tb_page_addr_t index)
|
|||||||
# define MAX_CODE_GEN_BUFFER_SIZE (32u * 1024 * 1024)
|
# define MAX_CODE_GEN_BUFFER_SIZE (32u * 1024 * 1024)
|
||||||
#elif defined(__aarch64__)
|
#elif defined(__aarch64__)
|
||||||
# define MAX_CODE_GEN_BUFFER_SIZE (128ul * 1024 * 1024)
|
# define MAX_CODE_GEN_BUFFER_SIZE (128ul * 1024 * 1024)
|
||||||
#elif defined(__arm__)
|
|
||||||
# define MAX_CODE_GEN_BUFFER_SIZE (16u * 1024 * 1024)
|
|
||||||
#elif defined(__s390x__)
|
#elif defined(__s390x__)
|
||||||
/* We have a +- 4GB range on the branches; leave some slop. */
|
/* We have a +- 4GB range on the branches; leave some slop. */
|
||||||
# define MAX_CODE_GEN_BUFFER_SIZE (3ul * 1024 * 1024 * 1024)
|
# define MAX_CODE_GEN_BUFFER_SIZE (3ul * 1024 * 1024 * 1024)
|
||||||
@@ -781,12 +779,13 @@ static inline void code_gen_alloc(size_t tb_size)
|
|||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Estimate a good size for the number of TBs we can support. We
|
/* size this conservatively -- realloc later if needed */
|
||||||
still haven't deducted the prologue from the buffer size here,
|
tcg_ctx.tb_ctx.tbs_size =
|
||||||
but that's minimal and won't affect the estimate much. */
|
tcg_ctx.code_gen_buffer_size / CODE_GEN_AVG_BLOCK_SIZE / 8;
|
||||||
tcg_ctx.code_gen_max_blocks
|
if (unlikely(!tcg_ctx.tb_ctx.tbs_size)) {
|
||||||
= tcg_ctx.code_gen_buffer_size / CODE_GEN_AVG_BLOCK_SIZE;
|
tcg_ctx.tb_ctx.tbs_size = 64 * 1024;
|
||||||
tcg_ctx.tb_ctx.tbs = g_new(TranslationBlock, tcg_ctx.code_gen_max_blocks);
|
}
|
||||||
|
tcg_ctx.tb_ctx.tbs = g_new(TranslationBlock *, tcg_ctx.tb_ctx.tbs_size);
|
||||||
|
|
||||||
qemu_mutex_init(&tcg_ctx.tb_ctx.tb_lock);
|
qemu_mutex_init(&tcg_ctx.tb_ctx.tb_lock);
|
||||||
}
|
}
|
||||||
@@ -828,16 +827,20 @@ bool tcg_enabled(void)
|
|||||||
static TranslationBlock *tb_alloc(target_ulong pc)
|
static TranslationBlock *tb_alloc(target_ulong pc)
|
||||||
{
|
{
|
||||||
TranslationBlock *tb;
|
TranslationBlock *tb;
|
||||||
|
TBContext *ctx;
|
||||||
|
|
||||||
assert_tb_locked();
|
assert_tb_locked();
|
||||||
|
|
||||||
if (tcg_ctx.tb_ctx.nb_tbs >= tcg_ctx.code_gen_max_blocks) {
|
tb = tcg_tb_alloc(&tcg_ctx);
|
||||||
|
if (unlikely(tb == NULL)) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
tb = &tcg_ctx.tb_ctx.tbs[tcg_ctx.tb_ctx.nb_tbs++];
|
ctx = &tcg_ctx.tb_ctx;
|
||||||
tb->pc = pc;
|
if (unlikely(ctx->nb_tbs == ctx->tbs_size)) {
|
||||||
tb->cflags = 0;
|
ctx->tbs_size *= 2;
|
||||||
tb->invalid = false;
|
ctx->tbs = g_renew(TranslationBlock *, ctx->tbs, ctx->tbs_size);
|
||||||
|
}
|
||||||
|
ctx->tbs[ctx->nb_tbs++] = tb;
|
||||||
return tb;
|
return tb;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -850,8 +853,10 @@ void tb_free(TranslationBlock *tb)
|
|||||||
Ignore the hard cases and just back up if this TB happens to
|
Ignore the hard cases and just back up if this TB happens to
|
||||||
be the last one generated. */
|
be the last one generated. */
|
||||||
if (tcg_ctx.tb_ctx.nb_tbs > 0 &&
|
if (tcg_ctx.tb_ctx.nb_tbs > 0 &&
|
||||||
tb == &tcg_ctx.tb_ctx.tbs[tcg_ctx.tb_ctx.nb_tbs - 1]) {
|
tb == tcg_ctx.tb_ctx.tbs[tcg_ctx.tb_ctx.nb_tbs - 1]) {
|
||||||
tcg_ctx.code_gen_ptr = tb->tc_ptr;
|
size_t struct_size = ROUND_UP(sizeof(*tb), qemu_icache_linesize);
|
||||||
|
|
||||||
|
tcg_ctx.code_gen_ptr = tb->tc_ptr - struct_size;
|
||||||
tcg_ctx.tb_ctx.nb_tbs--;
|
tcg_ctx.tb_ctx.nb_tbs--;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1279,9 +1284,11 @@ TranslationBlock *tb_gen_code(CPUState *cpu,
|
|||||||
|
|
||||||
gen_code_buf = tcg_ctx.code_gen_ptr;
|
gen_code_buf = tcg_ctx.code_gen_ptr;
|
||||||
tb->tc_ptr = gen_code_buf;
|
tb->tc_ptr = gen_code_buf;
|
||||||
|
tb->pc = pc;
|
||||||
tb->cs_base = cs_base;
|
tb->cs_base = cs_base;
|
||||||
tb->flags = flags;
|
tb->flags = flags;
|
||||||
tb->cflags = cflags;
|
tb->cflags = cflags;
|
||||||
|
tb->invalid = false;
|
||||||
|
|
||||||
#ifdef CONFIG_PROFILER
|
#ifdef CONFIG_PROFILER
|
||||||
tcg_ctx.tb_count1++; /* includes aborted translations because of
|
tcg_ctx.tb_count1++; /* includes aborted translations because of
|
||||||
@@ -1666,7 +1673,7 @@ static TranslationBlock *tb_find_pc(uintptr_t tc_ptr)
|
|||||||
m_max = tcg_ctx.tb_ctx.nb_tbs - 1;
|
m_max = tcg_ctx.tb_ctx.nb_tbs - 1;
|
||||||
while (m_min <= m_max) {
|
while (m_min <= m_max) {
|
||||||
m = (m_min + m_max) >> 1;
|
m = (m_min + m_max) >> 1;
|
||||||
tb = &tcg_ctx.tb_ctx.tbs[m];
|
tb = tcg_ctx.tb_ctx.tbs[m];
|
||||||
v = (uintptr_t)tb->tc_ptr;
|
v = (uintptr_t)tb->tc_ptr;
|
||||||
if (v == tc_ptr) {
|
if (v == tc_ptr) {
|
||||||
return tb;
|
return tb;
|
||||||
@@ -1676,7 +1683,7 @@ static TranslationBlock *tb_find_pc(uintptr_t tc_ptr)
|
|||||||
m_min = m + 1;
|
m_min = m + 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return &tcg_ctx.tb_ctx.tbs[m_max];
|
return tcg_ctx.tb_ctx.tbs[m_max];
|
||||||
}
|
}
|
||||||
|
|
||||||
#if !defined(CONFIG_USER_ONLY)
|
#if !defined(CONFIG_USER_ONLY)
|
||||||
@@ -1874,7 +1881,7 @@ void dump_exec_info(FILE *f, fprintf_function cpu_fprintf)
|
|||||||
direct_jmp_count = 0;
|
direct_jmp_count = 0;
|
||||||
direct_jmp2_count = 0;
|
direct_jmp2_count = 0;
|
||||||
for (i = 0; i < tcg_ctx.tb_ctx.nb_tbs; i++) {
|
for (i = 0; i < tcg_ctx.tb_ctx.nb_tbs; i++) {
|
||||||
tb = &tcg_ctx.tb_ctx.tbs[i];
|
tb = tcg_ctx.tb_ctx.tbs[i];
|
||||||
target_code_size += tb->size;
|
target_code_size += tb->size;
|
||||||
if (tb->size > max_target_code_size) {
|
if (tb->size > max_target_code_size) {
|
||||||
max_target_code_size = tb->size;
|
max_target_code_size = tb->size;
|
||||||
@@ -1894,8 +1901,7 @@ void dump_exec_info(FILE *f, fprintf_function cpu_fprintf)
|
|||||||
cpu_fprintf(f, "gen code size %td/%zd\n",
|
cpu_fprintf(f, "gen code size %td/%zd\n",
|
||||||
tcg_ctx.code_gen_ptr - tcg_ctx.code_gen_buffer,
|
tcg_ctx.code_gen_ptr - tcg_ctx.code_gen_buffer,
|
||||||
tcg_ctx.code_gen_highwater - tcg_ctx.code_gen_buffer);
|
tcg_ctx.code_gen_highwater - tcg_ctx.code_gen_buffer);
|
||||||
cpu_fprintf(f, "TB count %d/%d\n",
|
cpu_fprintf(f, "TB count %d\n", tcg_ctx.tb_ctx.nb_tbs);
|
||||||
tcg_ctx.tb_ctx.nb_tbs, tcg_ctx.code_gen_max_blocks);
|
|
||||||
cpu_fprintf(f, "TB avg target size %d max=%d bytes\n",
|
cpu_fprintf(f, "TB avg target size %d max=%d bytes\n",
|
||||||
tcg_ctx.tb_ctx.nb_tbs ? target_code_size /
|
tcg_ctx.tb_ctx.nb_tbs ? target_code_size /
|
||||||
tcg_ctx.tb_ctx.nb_tbs : 0,
|
tcg_ctx.tb_ctx.nb_tbs : 0,
|
||||||
|
|||||||
@@ -222,7 +222,7 @@ cryptodev_backend_can_be_deleted(UserCreatable *uc, Error **errp)
|
|||||||
|
|
||||||
static void cryptodev_backend_instance_init(Object *obj)
|
static void cryptodev_backend_instance_init(Object *obj)
|
||||||
{
|
{
|
||||||
object_property_add(obj, "queues", "int",
|
object_property_add(obj, "queues", "uint32",
|
||||||
cryptodev_backend_get_queues,
|
cryptodev_backend_get_queues,
|
||||||
cryptodev_backend_set_queues,
|
cryptodev_backend_set_queues,
|
||||||
NULL, NULL, NULL);
|
NULL, NULL, NULL);
|
||||||
|
|||||||
@@ -31,7 +31,6 @@
|
|||||||
#include "qemu/module.h"
|
#include "qemu/module.h"
|
||||||
#include "qapi/qmp/qbool.h"
|
#include "qapi/qmp/qbool.h"
|
||||||
#include "qapi/qmp/qdict.h"
|
#include "qapi/qmp/qdict.h"
|
||||||
#include "qapi/qmp/qint.h"
|
|
||||||
#include "qapi/qmp/qstring.h"
|
#include "qapi/qmp/qstring.h"
|
||||||
#include "sysemu/qtest.h"
|
#include "sysemu/qtest.h"
|
||||||
|
|
||||||
|
|||||||
@@ -37,7 +37,6 @@
|
|||||||
#include "qapi/qobject-output-visitor.h"
|
#include "qapi/qobject-output-visitor.h"
|
||||||
#include "qapi/qmp/qdict.h"
|
#include "qapi/qmp/qdict.h"
|
||||||
#include "qapi/qmp/qjson.h"
|
#include "qapi/qmp/qjson.h"
|
||||||
#include "qapi/qmp/qint.h"
|
|
||||||
#include "qapi/qmp/qstring.h"
|
#include "qapi/qmp/qstring.h"
|
||||||
#include "qemu/cutils.h"
|
#include "qemu/cutils.h"
|
||||||
|
|
||||||
|
|||||||
@@ -36,7 +36,6 @@
|
|||||||
#include "qemu/cutils.h"
|
#include "qemu/cutils.h"
|
||||||
#include "sysemu/sysemu.h"
|
#include "sysemu/sysemu.h"
|
||||||
#include "qapi/qmp/qdict.h"
|
#include "qapi/qmp/qdict.h"
|
||||||
#include "qapi/qmp/qint.h"
|
|
||||||
#include "qapi/qmp/qstring.h"
|
#include "qapi/qmp/qstring.h"
|
||||||
#include "qapi-visit.h"
|
#include "qapi-visit.h"
|
||||||
#include "qapi/qobject-input-visitor.h"
|
#include "qapi/qobject-input-visitor.h"
|
||||||
|
|||||||
13
block/qapi.c
13
block/qapi.c
@@ -595,9 +595,11 @@ static void dump_qobject(fprintf_function func_fprintf, void *f,
|
|||||||
int comp_indent, QObject *obj)
|
int comp_indent, QObject *obj)
|
||||||
{
|
{
|
||||||
switch (qobject_type(obj)) {
|
switch (qobject_type(obj)) {
|
||||||
case QTYPE_QINT: {
|
case QTYPE_QNUM: {
|
||||||
QInt *value = qobject_to_qint(obj);
|
QNum *value = qobject_to_qnum(obj);
|
||||||
func_fprintf(f, "%" PRId64, qint_get_int(value));
|
char *tmp = qnum_to_string(value);
|
||||||
|
func_fprintf(f, "%s", tmp);
|
||||||
|
g_free(tmp);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case QTYPE_QSTRING: {
|
case QTYPE_QSTRING: {
|
||||||
@@ -615,11 +617,6 @@ static void dump_qobject(fprintf_function func_fprintf, void *f,
|
|||||||
dump_qlist(func_fprintf, f, comp_indent, value);
|
dump_qlist(func_fprintf, f, comp_indent, value);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case QTYPE_QFLOAT: {
|
|
||||||
QFloat *value = qobject_to_qfloat(obj);
|
|
||||||
func_fprintf(f, "%g", qfloat_get_double(value));
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case QTYPE_QBOOL: {
|
case QTYPE_QBOOL: {
|
||||||
QBool *value = qobject_to_qbool(obj);
|
QBool *value = qobject_to_qbool(obj);
|
||||||
func_fprintf(f, "%s", qbool_get_bool(value) ? "true" : "false");
|
func_fprintf(f, "%s", qbool_get_bool(value) ? "true" : "false");
|
||||||
|
|||||||
@@ -19,7 +19,6 @@
|
|||||||
#include "qapi/qmp/qbool.h"
|
#include "qapi/qmp/qbool.h"
|
||||||
#include "qapi/qmp/qdict.h"
|
#include "qapi/qmp/qdict.h"
|
||||||
#include "qapi/qmp/qerror.h"
|
#include "qapi/qmp/qerror.h"
|
||||||
#include "qapi/qmp/qint.h"
|
|
||||||
#include "qapi/qmp/qjson.h"
|
#include "qapi/qmp/qjson.h"
|
||||||
#include "qapi/qmp/qlist.h"
|
#include "qapi/qmp/qlist.h"
|
||||||
#include "qapi/qmp/qstring.h"
|
#include "qapi/qmp/qstring.h"
|
||||||
|
|||||||
@@ -16,7 +16,6 @@
|
|||||||
#include "qapi-visit.h"
|
#include "qapi-visit.h"
|
||||||
#include "qapi/error.h"
|
#include "qapi/error.h"
|
||||||
#include "qapi/qmp/qdict.h"
|
#include "qapi/qmp/qdict.h"
|
||||||
#include "qapi/qmp/qint.h"
|
|
||||||
#include "qapi/qobject-input-visitor.h"
|
#include "qapi/qobject-input-visitor.h"
|
||||||
#include "qemu/uri.h"
|
#include "qemu/uri.h"
|
||||||
#include "qemu/error-report.h"
|
#include "qemu/error-report.h"
|
||||||
|
|||||||
@@ -34,7 +34,6 @@
|
|||||||
#include "qemu/sockets.h"
|
#include "qemu/sockets.h"
|
||||||
#include "qemu/uri.h"
|
#include "qemu/uri.h"
|
||||||
#include "qapi-visit.h"
|
#include "qapi-visit.h"
|
||||||
#include "qapi/qmp/qint.h"
|
|
||||||
#include "qapi/qmp/qstring.h"
|
#include "qapi/qmp/qstring.h"
|
||||||
#include "qapi/qobject-input-visitor.h"
|
#include "qapi/qobject-input-visitor.h"
|
||||||
#include "qapi/qobject-output-visitor.h"
|
#include "qapi/qobject-output-visitor.h"
|
||||||
|
|||||||
@@ -29,7 +29,6 @@
|
|||||||
#include "qemu/module.h"
|
#include "qemu/module.h"
|
||||||
#include "qemu/bswap.h"
|
#include "qemu/bswap.h"
|
||||||
#include "migration/blocker.h"
|
#include "migration/blocker.h"
|
||||||
#include "qapi/qmp/qint.h"
|
|
||||||
#include "qapi/qmp/qbool.h"
|
#include "qapi/qmp/qbool.h"
|
||||||
#include "qapi/qmp/qstring.h"
|
#include "qapi/qmp/qstring.h"
|
||||||
#include "qemu/cutils.h"
|
#include "qemu/cutils.h"
|
||||||
|
|||||||
@@ -334,8 +334,9 @@ static bool parse_stats_intervals(BlockAcctStats *stats, QList *intervals,
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
case QTYPE_QINT: {
|
case QTYPE_QNUM: {
|
||||||
int64_t length = qint_get_int(qobject_to_qint(entry->value));
|
int64_t length = qnum_get_int(qobject_to_qnum(entry->value));
|
||||||
|
|
||||||
if (length > 0 && length <= UINT_MAX) {
|
if (length > 0 && length <= UINT_MAX) {
|
||||||
block_acct_add_interval(stats, (unsigned) length);
|
block_acct_add_interval(stats, (unsigned) length);
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
@@ -83,23 +83,25 @@ static uint64_t acpi_memory_hotplug_read(void *opaque, hwaddr addr,
|
|||||||
o = OBJECT(mdev->dimm);
|
o = OBJECT(mdev->dimm);
|
||||||
switch (addr) {
|
switch (addr) {
|
||||||
case 0x0: /* Lo part of phys address where DIMM is mapped */
|
case 0x0: /* Lo part of phys address where DIMM is mapped */
|
||||||
val = o ? object_property_get_int(o, PC_DIMM_ADDR_PROP, NULL) : 0;
|
val = o ? object_property_get_uint(o, PC_DIMM_ADDR_PROP, NULL) : 0;
|
||||||
trace_mhp_acpi_read_addr_lo(mem_st->selector, val);
|
trace_mhp_acpi_read_addr_lo(mem_st->selector, val);
|
||||||
break;
|
break;
|
||||||
case 0x4: /* Hi part of phys address where DIMM is mapped */
|
case 0x4: /* Hi part of phys address where DIMM is mapped */
|
||||||
val = o ? object_property_get_int(o, PC_DIMM_ADDR_PROP, NULL) >> 32 : 0;
|
val =
|
||||||
|
o ? object_property_get_uint(o, PC_DIMM_ADDR_PROP, NULL) >> 32 : 0;
|
||||||
trace_mhp_acpi_read_addr_hi(mem_st->selector, val);
|
trace_mhp_acpi_read_addr_hi(mem_st->selector, val);
|
||||||
break;
|
break;
|
||||||
case 0x8: /* Lo part of DIMM size */
|
case 0x8: /* Lo part of DIMM size */
|
||||||
val = o ? object_property_get_int(o, PC_DIMM_SIZE_PROP, NULL) : 0;
|
val = o ? object_property_get_uint(o, PC_DIMM_SIZE_PROP, NULL) : 0;
|
||||||
trace_mhp_acpi_read_size_lo(mem_st->selector, val);
|
trace_mhp_acpi_read_size_lo(mem_st->selector, val);
|
||||||
break;
|
break;
|
||||||
case 0xc: /* Hi part of DIMM size */
|
case 0xc: /* Hi part of DIMM size */
|
||||||
val = o ? object_property_get_int(o, PC_DIMM_SIZE_PROP, NULL) >> 32 : 0;
|
val =
|
||||||
|
o ? object_property_get_uint(o, PC_DIMM_SIZE_PROP, NULL) >> 32 : 0;
|
||||||
trace_mhp_acpi_read_size_hi(mem_st->selector, val);
|
trace_mhp_acpi_read_size_hi(mem_st->selector, val);
|
||||||
break;
|
break;
|
||||||
case 0x10: /* node proximity for _PXM method */
|
case 0x10: /* node proximity for _PXM method */
|
||||||
val = o ? object_property_get_int(o, PC_DIMM_NODE_PROP, NULL) : 0;
|
val = o ? object_property_get_uint(o, PC_DIMM_NODE_PROP, NULL) : 0;
|
||||||
trace_mhp_acpi_read_pxm(mem_st->selector, val);
|
trace_mhp_acpi_read_pxm(mem_st->selector, val);
|
||||||
break;
|
break;
|
||||||
case 0x14: /* pack and return is_* fields */
|
case 0x14: /* pack and return is_* fields */
|
||||||
|
|||||||
@@ -236,14 +236,14 @@ static void
|
|||||||
nvdimm_build_structure_spa(GArray *structures, DeviceState *dev)
|
nvdimm_build_structure_spa(GArray *structures, DeviceState *dev)
|
||||||
{
|
{
|
||||||
NvdimmNfitSpa *nfit_spa;
|
NvdimmNfitSpa *nfit_spa;
|
||||||
uint64_t addr = object_property_get_int(OBJECT(dev), PC_DIMM_ADDR_PROP,
|
uint64_t addr = object_property_get_uint(OBJECT(dev), PC_DIMM_ADDR_PROP,
|
||||||
NULL);
|
NULL);
|
||||||
uint64_t size = object_property_get_int(OBJECT(dev), PC_DIMM_SIZE_PROP,
|
uint64_t size = object_property_get_uint(OBJECT(dev), PC_DIMM_SIZE_PROP,
|
||||||
NULL);
|
NULL);
|
||||||
uint32_t node = object_property_get_int(OBJECT(dev), PC_DIMM_NODE_PROP,
|
uint32_t node = object_property_get_uint(OBJECT(dev), PC_DIMM_NODE_PROP,
|
||||||
NULL);
|
NULL);
|
||||||
int slot = object_property_get_int(OBJECT(dev), PC_DIMM_SLOT_PROP,
|
int slot = object_property_get_int(OBJECT(dev), PC_DIMM_SLOT_PROP,
|
||||||
NULL);
|
NULL);
|
||||||
|
|
||||||
nfit_spa = acpi_data_push(structures, sizeof(*nfit_spa));
|
nfit_spa = acpi_data_push(structures, sizeof(*nfit_spa));
|
||||||
|
|
||||||
@@ -284,8 +284,8 @@ static void
|
|||||||
nvdimm_build_structure_memdev(GArray *structures, DeviceState *dev)
|
nvdimm_build_structure_memdev(GArray *structures, DeviceState *dev)
|
||||||
{
|
{
|
||||||
NvdimmNfitMemDev *nfit_memdev;
|
NvdimmNfitMemDev *nfit_memdev;
|
||||||
uint64_t size = object_property_get_int(OBJECT(dev), PC_DIMM_SIZE_PROP,
|
uint64_t size = object_property_get_uint(OBJECT(dev), PC_DIMM_SIZE_PROP,
|
||||||
NULL);
|
NULL);
|
||||||
int slot = object_property_get_int(OBJECT(dev), PC_DIMM_SLOT_PROP,
|
int slot = object_property_get_int(OBJECT(dev), PC_DIMM_SLOT_PROP,
|
||||||
NULL);
|
NULL);
|
||||||
uint32_t handle = nvdimm_slot_to_handle(slot);
|
uint32_t handle = nvdimm_slot_to_handle(slot);
|
||||||
|
|||||||
@@ -37,7 +37,6 @@
|
|||||||
#include "hw/pci/pci_bus.h"
|
#include "hw/pci/pci_bus.h"
|
||||||
#include "qapi/error.h"
|
#include "qapi/error.h"
|
||||||
#include "qom/qom-qobject.h"
|
#include "qom/qom-qobject.h"
|
||||||
#include "qapi/qmp/qint.h"
|
|
||||||
|
|
||||||
//#define DEBUG
|
//#define DEBUG
|
||||||
|
|
||||||
@@ -63,10 +62,10 @@ typedef struct AcpiPciHpFind {
|
|||||||
static int acpi_pcihp_get_bsel(PCIBus *bus)
|
static int acpi_pcihp_get_bsel(PCIBus *bus)
|
||||||
{
|
{
|
||||||
Error *local_err = NULL;
|
Error *local_err = NULL;
|
||||||
int64_t bsel = object_property_get_int(OBJECT(bus), ACPI_PCIHP_PROP_BSEL,
|
uint64_t bsel = object_property_get_uint(OBJECT(bus), ACPI_PCIHP_PROP_BSEL,
|
||||||
&local_err);
|
&local_err);
|
||||||
|
|
||||||
if (local_err || bsel < 0 || bsel >= ACPI_PCIHP_MAX_HOTPLUG_BUS) {
|
if (local_err || bsel >= ACPI_PCIHP_MAX_HOTPLUG_BUS) {
|
||||||
if (local_err) {
|
if (local_err) {
|
||||||
error_free(local_err);
|
error_free(local_err);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -180,8 +180,8 @@ static void aspeed_board_init(MachineState *machine,
|
|||||||
|
|
||||||
sc = ASPEED_SOC_GET_CLASS(&bmc->soc);
|
sc = ASPEED_SOC_GET_CLASS(&bmc->soc);
|
||||||
|
|
||||||
object_property_set_int(OBJECT(&bmc->soc), ram_size, "ram-size",
|
object_property_set_uint(OBJECT(&bmc->soc), ram_size, "ram-size",
|
||||||
&error_abort);
|
&error_abort);
|
||||||
object_property_set_int(OBJECT(&bmc->soc), cfg->hw_strap1, "hw-strap1",
|
object_property_set_int(OBJECT(&bmc->soc), cfg->hw_strap1, "hw-strap1",
|
||||||
&error_abort);
|
&error_abort);
|
||||||
object_property_set_int(OBJECT(&bmc->soc), cfg->num_cs, "num-cs",
|
object_property_set_int(OBJECT(&bmc->soc), cfg->num_cs, "num-cs",
|
||||||
@@ -193,8 +193,8 @@ static void aspeed_board_init(MachineState *machine,
|
|||||||
* Allocate RAM after the memory controller has checked the size
|
* Allocate RAM after the memory controller has checked the size
|
||||||
* was valid. If not, a default value is used.
|
* was valid. If not, a default value is used.
|
||||||
*/
|
*/
|
||||||
ram_size = object_property_get_int(OBJECT(&bmc->soc), "ram-size",
|
ram_size = object_property_get_uint(OBJECT(&bmc->soc), "ram-size",
|
||||||
&error_abort);
|
&error_abort);
|
||||||
|
|
||||||
memory_region_allocate_system_memory(&bmc->ram, NULL, "ram", ram_size);
|
memory_region_allocate_system_memory(&bmc->ram, NULL, "ram", ram_size);
|
||||||
memory_region_add_subregion(get_system_memory(), sc->info->sdram_base,
|
memory_region_add_subregion(get_system_memory(), sc->info->sdram_base,
|
||||||
|
|||||||
@@ -125,7 +125,7 @@ static void bcm2835_peripherals_realize(DeviceState *dev, Error **errp)
|
|||||||
Object *obj;
|
Object *obj;
|
||||||
MemoryRegion *ram;
|
MemoryRegion *ram;
|
||||||
Error *err = NULL;
|
Error *err = NULL;
|
||||||
uint32_t ram_size, vcram_size;
|
uint64_t ram_size, vcram_size;
|
||||||
int n;
|
int n;
|
||||||
|
|
||||||
obj = object_property_get_link(OBJECT(dev), "ram", &err);
|
obj = object_property_get_link(OBJECT(dev), "ram", &err);
|
||||||
@@ -207,15 +207,14 @@ static void bcm2835_peripherals_realize(DeviceState *dev, Error **errp)
|
|||||||
INTERRUPT_ARM_MAILBOX));
|
INTERRUPT_ARM_MAILBOX));
|
||||||
|
|
||||||
/* Framebuffer */
|
/* Framebuffer */
|
||||||
vcram_size = (uint32_t)object_property_get_int(OBJECT(s), "vcram-size",
|
vcram_size = object_property_get_uint(OBJECT(s), "vcram-size", &err);
|
||||||
&err);
|
|
||||||
if (err) {
|
if (err) {
|
||||||
error_propagate(errp, err);
|
error_propagate(errp, err);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
object_property_set_int(OBJECT(&s->fb), ram_size - vcram_size,
|
object_property_set_uint(OBJECT(&s->fb), ram_size - vcram_size,
|
||||||
"vcram-base", &err);
|
"vcram-base", &err);
|
||||||
if (err) {
|
if (err) {
|
||||||
error_propagate(errp, err);
|
error_propagate(errp, err);
|
||||||
return;
|
return;
|
||||||
|
|||||||
@@ -153,8 +153,8 @@ static void raspi2_init(MachineState *machine)
|
|||||||
qdev_prop_set_drive(carddev, "drive", blk, &error_fatal);
|
qdev_prop_set_drive(carddev, "drive", blk, &error_fatal);
|
||||||
object_property_set_bool(OBJECT(carddev), true, "realized", &error_fatal);
|
object_property_set_bool(OBJECT(carddev), true, "realized", &error_fatal);
|
||||||
|
|
||||||
vcram_size = object_property_get_int(OBJECT(&s->soc), "vcram-size",
|
vcram_size = object_property_get_uint(OBJECT(&s->soc), "vcram-size",
|
||||||
&error_abort);
|
&error_abort);
|
||||||
setup_boot(machine, 2, machine->ram_size - vcram_size);
|
setup_boot(machine, 2, machine->ram_size - vcram_size);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -511,7 +511,7 @@ typedef struct FloppyDrive {
|
|||||||
static Property floppy_drive_properties[] = {
|
static Property floppy_drive_properties[] = {
|
||||||
DEFINE_PROP_UINT32("unit", FloppyDrive, unit, -1),
|
DEFINE_PROP_UINT32("unit", FloppyDrive, unit, -1),
|
||||||
DEFINE_BLOCK_PROPERTIES(FloppyDrive, conf),
|
DEFINE_BLOCK_PROPERTIES(FloppyDrive, conf),
|
||||||
DEFINE_PROP_DEFAULT("drive-type", FloppyDrive, type,
|
DEFINE_PROP_SIGNED("drive-type", FloppyDrive, type,
|
||||||
FLOPPY_DRIVE_TYPE_AUTO, qdev_prop_fdc_drive_type,
|
FLOPPY_DRIVE_TYPE_AUTO, qdev_prop_fdc_drive_type,
|
||||||
FloppyDriveType),
|
FloppyDriveType),
|
||||||
DEFINE_PROP_END_OF_LIST(),
|
DEFINE_PROP_END_OF_LIST(),
|
||||||
@@ -2805,13 +2805,13 @@ static Property isa_fdc_properties[] = {
|
|||||||
DEFINE_PROP_DRIVE("driveB", FDCtrlISABus, state.qdev_for_drives[1].blk),
|
DEFINE_PROP_DRIVE("driveB", FDCtrlISABus, state.qdev_for_drives[1].blk),
|
||||||
DEFINE_PROP_BIT("check_media_rate", FDCtrlISABus, state.check_media_rate,
|
DEFINE_PROP_BIT("check_media_rate", FDCtrlISABus, state.check_media_rate,
|
||||||
0, true),
|
0, true),
|
||||||
DEFINE_PROP_DEFAULT("fdtypeA", FDCtrlISABus, state.qdev_for_drives[0].type,
|
DEFINE_PROP_SIGNED("fdtypeA", FDCtrlISABus, state.qdev_for_drives[0].type,
|
||||||
FLOPPY_DRIVE_TYPE_AUTO, qdev_prop_fdc_drive_type,
|
FLOPPY_DRIVE_TYPE_AUTO, qdev_prop_fdc_drive_type,
|
||||||
FloppyDriveType),
|
FloppyDriveType),
|
||||||
DEFINE_PROP_DEFAULT("fdtypeB", FDCtrlISABus, state.qdev_for_drives[1].type,
|
DEFINE_PROP_SIGNED("fdtypeB", FDCtrlISABus, state.qdev_for_drives[1].type,
|
||||||
FLOPPY_DRIVE_TYPE_AUTO, qdev_prop_fdc_drive_type,
|
FLOPPY_DRIVE_TYPE_AUTO, qdev_prop_fdc_drive_type,
|
||||||
FloppyDriveType),
|
FloppyDriveType),
|
||||||
DEFINE_PROP_DEFAULT("fallback", FDCtrlISABus, state.fallback,
|
DEFINE_PROP_SIGNED("fallback", FDCtrlISABus, state.fallback,
|
||||||
FLOPPY_DRIVE_TYPE_288, qdev_prop_fdc_drive_type,
|
FLOPPY_DRIVE_TYPE_288, qdev_prop_fdc_drive_type,
|
||||||
FloppyDriveType),
|
FloppyDriveType),
|
||||||
DEFINE_PROP_END_OF_LIST(),
|
DEFINE_PROP_END_OF_LIST(),
|
||||||
@@ -2862,13 +2862,13 @@ static const VMStateDescription vmstate_sysbus_fdc ={
|
|||||||
static Property sysbus_fdc_properties[] = {
|
static Property sysbus_fdc_properties[] = {
|
||||||
DEFINE_PROP_DRIVE("driveA", FDCtrlSysBus, state.qdev_for_drives[0].blk),
|
DEFINE_PROP_DRIVE("driveA", FDCtrlSysBus, state.qdev_for_drives[0].blk),
|
||||||
DEFINE_PROP_DRIVE("driveB", FDCtrlSysBus, state.qdev_for_drives[1].blk),
|
DEFINE_PROP_DRIVE("driveB", FDCtrlSysBus, state.qdev_for_drives[1].blk),
|
||||||
DEFINE_PROP_DEFAULT("fdtypeA", FDCtrlSysBus, state.qdev_for_drives[0].type,
|
DEFINE_PROP_SIGNED("fdtypeA", FDCtrlSysBus, state.qdev_for_drives[0].type,
|
||||||
FLOPPY_DRIVE_TYPE_AUTO, qdev_prop_fdc_drive_type,
|
FLOPPY_DRIVE_TYPE_AUTO, qdev_prop_fdc_drive_type,
|
||||||
FloppyDriveType),
|
FloppyDriveType),
|
||||||
DEFINE_PROP_DEFAULT("fdtypeB", FDCtrlSysBus, state.qdev_for_drives[1].type,
|
DEFINE_PROP_SIGNED("fdtypeB", FDCtrlSysBus, state.qdev_for_drives[1].type,
|
||||||
FLOPPY_DRIVE_TYPE_AUTO, qdev_prop_fdc_drive_type,
|
FLOPPY_DRIVE_TYPE_AUTO, qdev_prop_fdc_drive_type,
|
||||||
FloppyDriveType),
|
FloppyDriveType),
|
||||||
DEFINE_PROP_DEFAULT("fallback", FDCtrlISABus, state.fallback,
|
DEFINE_PROP_SIGNED("fallback", FDCtrlISABus, state.fallback,
|
||||||
FLOPPY_DRIVE_TYPE_144, qdev_prop_fdc_drive_type,
|
FLOPPY_DRIVE_TYPE_144, qdev_prop_fdc_drive_type,
|
||||||
FloppyDriveType),
|
FloppyDriveType),
|
||||||
DEFINE_PROP_END_OF_LIST(),
|
DEFINE_PROP_END_OF_LIST(),
|
||||||
@@ -2891,10 +2891,10 @@ static const TypeInfo sysbus_fdc_info = {
|
|||||||
|
|
||||||
static Property sun4m_fdc_properties[] = {
|
static Property sun4m_fdc_properties[] = {
|
||||||
DEFINE_PROP_DRIVE("drive", FDCtrlSysBus, state.qdev_for_drives[0].blk),
|
DEFINE_PROP_DRIVE("drive", FDCtrlSysBus, state.qdev_for_drives[0].blk),
|
||||||
DEFINE_PROP_DEFAULT("fdtype", FDCtrlSysBus, state.qdev_for_drives[0].type,
|
DEFINE_PROP_SIGNED("fdtype", FDCtrlSysBus, state.qdev_for_drives[0].type,
|
||||||
FLOPPY_DRIVE_TYPE_AUTO, qdev_prop_fdc_drive_type,
|
FLOPPY_DRIVE_TYPE_AUTO, qdev_prop_fdc_drive_type,
|
||||||
FloppyDriveType),
|
FloppyDriveType),
|
||||||
DEFINE_PROP_DEFAULT("fallback", FDCtrlISABus, state.fallback,
|
DEFINE_PROP_SIGNED("fallback", FDCtrlISABus, state.fallback,
|
||||||
FLOPPY_DRIVE_TYPE_144, qdev_prop_fdc_drive_type,
|
FLOPPY_DRIVE_TYPE_144, qdev_prop_fdc_drive_type,
|
||||||
FloppyDriveType),
|
FloppyDriveType),
|
||||||
DEFINE_PROP_END_OF_LIST(),
|
DEFINE_PROP_END_OF_LIST(),
|
||||||
|
|||||||
@@ -71,7 +71,7 @@ hwaddr platform_bus_get_mmio_addr(PlatformBusDevice *pbus, SysBusDevice *sbdev,
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
return object_property_get_int(OBJECT(sbdev_mr), "addr", NULL);
|
return object_property_get_uint(OBJECT(sbdev_mr), "addr", NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void platform_bus_count_irqs(SysBusDevice *sbdev, void *opaque)
|
static void platform_bus_count_irqs(SysBusDevice *sbdev, void *opaque)
|
||||||
|
|||||||
@@ -69,6 +69,12 @@ static void set_enum(Object *obj, Visitor *v, const char *name, void *opaque,
|
|||||||
visit_type_enum(v, prop->name, ptr, prop->info->enum_table, errp);
|
visit_type_enum(v, prop->name, ptr, prop->info->enum_table, errp);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void set_default_value_enum(Object *obj, const Property *prop)
|
||||||
|
{
|
||||||
|
object_property_set_str(obj, prop->info->enum_table[prop->defval.i],
|
||||||
|
prop->name, &error_abort);
|
||||||
|
}
|
||||||
|
|
||||||
/* Bit */
|
/* Bit */
|
||||||
|
|
||||||
static uint32_t qdev_get_prop_mask(Property *prop)
|
static uint32_t qdev_get_prop_mask(Property *prop)
|
||||||
@@ -120,11 +126,17 @@ static void prop_set_bit(Object *obj, Visitor *v, const char *name,
|
|||||||
bit_prop_set(dev, prop, value);
|
bit_prop_set(dev, prop, value);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void set_default_value_bool(Object *obj, const Property *prop)
|
||||||
|
{
|
||||||
|
object_property_set_bool(obj, prop->defval.u, prop->name, &error_abort);
|
||||||
|
}
|
||||||
|
|
||||||
PropertyInfo qdev_prop_bit = {
|
PropertyInfo qdev_prop_bit = {
|
||||||
.name = "bool",
|
.name = "bool",
|
||||||
.description = "on/off",
|
.description = "on/off",
|
||||||
.get = prop_get_bit,
|
.get = prop_get_bit,
|
||||||
.set = prop_set_bit,
|
.set = prop_set_bit,
|
||||||
|
.set_default_value = set_default_value_bool,
|
||||||
};
|
};
|
||||||
|
|
||||||
/* Bit64 */
|
/* Bit64 */
|
||||||
@@ -183,6 +195,7 @@ PropertyInfo qdev_prop_bit64 = {
|
|||||||
.description = "on/off",
|
.description = "on/off",
|
||||||
.get = prop_get_bit64,
|
.get = prop_get_bit64,
|
||||||
.set = prop_set_bit64,
|
.set = prop_set_bit64,
|
||||||
|
.set_default_value = set_default_value_bool,
|
||||||
};
|
};
|
||||||
|
|
||||||
/* --- bool --- */
|
/* --- bool --- */
|
||||||
@@ -216,6 +229,7 @@ PropertyInfo qdev_prop_bool = {
|
|||||||
.name = "bool",
|
.name = "bool",
|
||||||
.get = get_bool,
|
.get = get_bool,
|
||||||
.set = set_bool,
|
.set = set_bool,
|
||||||
|
.set_default_value = set_default_value_bool,
|
||||||
};
|
};
|
||||||
|
|
||||||
/* --- 8bit integer --- */
|
/* --- 8bit integer --- */
|
||||||
@@ -245,10 +259,21 @@ static void set_uint8(Object *obj, Visitor *v, const char *name, void *opaque,
|
|||||||
visit_type_uint8(v, name, ptr, errp);
|
visit_type_uint8(v, name, ptr, errp);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void set_default_value_int(Object *obj, const Property *prop)
|
||||||
|
{
|
||||||
|
object_property_set_int(obj, prop->defval.i, prop->name, &error_abort);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void set_default_value_uint(Object *obj, const Property *prop)
|
||||||
|
{
|
||||||
|
object_property_set_uint(obj, prop->defval.u, prop->name, &error_abort);
|
||||||
|
}
|
||||||
|
|
||||||
PropertyInfo qdev_prop_uint8 = {
|
PropertyInfo qdev_prop_uint8 = {
|
||||||
.name = "uint8",
|
.name = "uint8",
|
||||||
.get = get_uint8,
|
.get = get_uint8,
|
||||||
.set = set_uint8,
|
.set = set_uint8,
|
||||||
|
.set_default_value = set_default_value_uint,
|
||||||
};
|
};
|
||||||
|
|
||||||
/* --- 16bit integer --- */
|
/* --- 16bit integer --- */
|
||||||
@@ -282,6 +307,7 @@ PropertyInfo qdev_prop_uint16 = {
|
|||||||
.name = "uint16",
|
.name = "uint16",
|
||||||
.get = get_uint16,
|
.get = get_uint16,
|
||||||
.set = set_uint16,
|
.set = set_uint16,
|
||||||
|
.set_default_value = set_default_value_uint,
|
||||||
};
|
};
|
||||||
|
|
||||||
/* --- 32bit integer --- */
|
/* --- 32bit integer --- */
|
||||||
@@ -340,12 +366,14 @@ PropertyInfo qdev_prop_uint32 = {
|
|||||||
.name = "uint32",
|
.name = "uint32",
|
||||||
.get = get_uint32,
|
.get = get_uint32,
|
||||||
.set = set_uint32,
|
.set = set_uint32,
|
||||||
|
.set_default_value = set_default_value_uint,
|
||||||
};
|
};
|
||||||
|
|
||||||
PropertyInfo qdev_prop_int32 = {
|
PropertyInfo qdev_prop_int32 = {
|
||||||
.name = "int32",
|
.name = "int32",
|
||||||
.get = get_int32,
|
.get = get_int32,
|
||||||
.set = set_int32,
|
.set = set_int32,
|
||||||
|
.set_default_value = set_default_value_int,
|
||||||
};
|
};
|
||||||
|
|
||||||
/* --- 64bit integer --- */
|
/* --- 64bit integer --- */
|
||||||
@@ -379,6 +407,7 @@ PropertyInfo qdev_prop_uint64 = {
|
|||||||
.name = "uint64",
|
.name = "uint64",
|
||||||
.get = get_uint64,
|
.get = get_uint64,
|
||||||
.set = set_uint64,
|
.set = set_uint64,
|
||||||
|
.set_default_value = set_default_value_uint,
|
||||||
};
|
};
|
||||||
|
|
||||||
/* --- string --- */
|
/* --- string --- */
|
||||||
@@ -526,6 +555,7 @@ PropertyInfo qdev_prop_on_off_auto = {
|
|||||||
.enum_table = OnOffAuto_lookup,
|
.enum_table = OnOffAuto_lookup,
|
||||||
.get = get_enum,
|
.get = get_enum,
|
||||||
.set = set_enum,
|
.set = set_enum,
|
||||||
|
.set_default_value = set_default_value_enum,
|
||||||
};
|
};
|
||||||
|
|
||||||
/* --- lost tick policy --- */
|
/* --- lost tick policy --- */
|
||||||
@@ -537,6 +567,7 @@ PropertyInfo qdev_prop_losttickpolicy = {
|
|||||||
.enum_table = LostTickPolicy_lookup,
|
.enum_table = LostTickPolicy_lookup,
|
||||||
.get = get_enum,
|
.get = get_enum,
|
||||||
.set = set_enum,
|
.set = set_enum,
|
||||||
|
.set_default_value = set_default_value_enum,
|
||||||
};
|
};
|
||||||
|
|
||||||
/* --- Block device error handling policy --- */
|
/* --- Block device error handling policy --- */
|
||||||
@@ -550,6 +581,7 @@ PropertyInfo qdev_prop_blockdev_on_error = {
|
|||||||
.enum_table = BlockdevOnError_lookup,
|
.enum_table = BlockdevOnError_lookup,
|
||||||
.get = get_enum,
|
.get = get_enum,
|
||||||
.set = set_enum,
|
.set = set_enum,
|
||||||
|
.set_default_value = set_default_value_enum,
|
||||||
};
|
};
|
||||||
|
|
||||||
/* --- BIOS CHS translation */
|
/* --- BIOS CHS translation */
|
||||||
@@ -563,6 +595,7 @@ PropertyInfo qdev_prop_bios_chs_trans = {
|
|||||||
.enum_table = BiosAtaTranslation_lookup,
|
.enum_table = BiosAtaTranslation_lookup,
|
||||||
.get = get_enum,
|
.get = get_enum,
|
||||||
.set = set_enum,
|
.set = set_enum,
|
||||||
|
.set_default_value = set_default_value_enum,
|
||||||
};
|
};
|
||||||
|
|
||||||
/* --- FDC default drive types */
|
/* --- FDC default drive types */
|
||||||
@@ -573,7 +606,8 @@ PropertyInfo qdev_prop_fdc_drive_type = {
|
|||||||
"144/288/120/none/auto",
|
"144/288/120/none/auto",
|
||||||
.enum_table = FloppyDriveType_lookup,
|
.enum_table = FloppyDriveType_lookup,
|
||||||
.get = get_enum,
|
.get = get_enum,
|
||||||
.set = set_enum
|
.set = set_enum,
|
||||||
|
.set_default_value = set_default_value_enum,
|
||||||
};
|
};
|
||||||
|
|
||||||
/* --- pci address --- */
|
/* --- pci address --- */
|
||||||
@@ -648,6 +682,7 @@ PropertyInfo qdev_prop_pci_devfn = {
|
|||||||
.print = print_pci_devfn,
|
.print = print_pci_devfn,
|
||||||
.get = get_int32,
|
.get = get_int32,
|
||||||
.set = set_pci_devfn,
|
.set = set_pci_devfn,
|
||||||
|
.set_default_value = set_default_value_int,
|
||||||
};
|
};
|
||||||
|
|
||||||
/* --- blocksize --- */
|
/* --- blocksize --- */
|
||||||
@@ -695,6 +730,7 @@ PropertyInfo qdev_prop_blocksize = {
|
|||||||
.description = "A power of two between 512 and 32768",
|
.description = "A power of two between 512 and 32768",
|
||||||
.get = get_uint16,
|
.get = get_uint16,
|
||||||
.set = set_blocksize,
|
.set = set_blocksize,
|
||||||
|
.set_default_value = set_default_value_uint,
|
||||||
};
|
};
|
||||||
|
|
||||||
/* --- pci host address --- */
|
/* --- pci host address --- */
|
||||||
@@ -917,6 +953,7 @@ PropertyInfo qdev_prop_arraylen = {
|
|||||||
.name = "uint32",
|
.name = "uint32",
|
||||||
.get = get_uint32,
|
.get = get_uint32,
|
||||||
.set = set_prop_arraylen,
|
.set = set_prop_arraylen,
|
||||||
|
.set_default_value = set_default_value_uint,
|
||||||
};
|
};
|
||||||
|
|
||||||
/* --- public helpers --- */
|
/* --- public helpers --- */
|
||||||
@@ -1153,4 +1190,5 @@ PropertyInfo qdev_prop_size = {
|
|||||||
.name = "size",
|
.name = "size",
|
||||||
.get = get_size,
|
.get = get_size,
|
||||||
.set = set_size,
|
.set = set_size,
|
||||||
|
.set_default_value = set_default_value_uint,
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -793,17 +793,8 @@ void qdev_property_add_static(DeviceState *dev, Property *prop,
|
|||||||
prop->info->description,
|
prop->info->description,
|
||||||
&error_abort);
|
&error_abort);
|
||||||
|
|
||||||
if (prop->qtype == QTYPE_NONE) {
|
if (prop->info->set_default_value) {
|
||||||
return;
|
prop->info->set_default_value(obj, prop);
|
||||||
}
|
|
||||||
|
|
||||||
if (prop->qtype == QTYPE_QBOOL) {
|
|
||||||
object_property_set_bool(obj, prop->defval, prop->name, &error_abort);
|
|
||||||
} else if (prop->info->enum_table) {
|
|
||||||
object_property_set_str(obj, prop->info->enum_table[prop->defval],
|
|
||||||
prop->name, &error_abort);
|
|
||||||
} else if (prop->qtype == QTYPE_QINT) {
|
|
||||||
object_property_set_int(obj, prop->defval, prop->name, &error_abort);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -57,7 +57,6 @@
|
|||||||
|
|
||||||
#include "hw/acpi/aml-build.h"
|
#include "hw/acpi/aml-build.h"
|
||||||
|
|
||||||
#include "qapi/qmp/qint.h"
|
|
||||||
#include "qom/qom-qobject.h"
|
#include "qom/qom-qobject.h"
|
||||||
#include "hw/i386/amd_iommu.h"
|
#include "hw/i386/amd_iommu.h"
|
||||||
#include "hw/i386/intel_iommu.h"
|
#include "hw/i386/intel_iommu.h"
|
||||||
@@ -137,9 +136,9 @@ static void acpi_get_pm_info(AcpiPmInfo *pm)
|
|||||||
obj = piix;
|
obj = piix;
|
||||||
pm->cpu_hp_io_base = PIIX4_CPU_HOTPLUG_IO_BASE;
|
pm->cpu_hp_io_base = PIIX4_CPU_HOTPLUG_IO_BASE;
|
||||||
pm->pcihp_io_base =
|
pm->pcihp_io_base =
|
||||||
object_property_get_int(obj, ACPI_PCIHP_IO_BASE_PROP, NULL);
|
object_property_get_uint(obj, ACPI_PCIHP_IO_BASE_PROP, NULL);
|
||||||
pm->pcihp_io_len =
|
pm->pcihp_io_len =
|
||||||
object_property_get_int(obj, ACPI_PCIHP_IO_LEN_PROP, NULL);
|
object_property_get_uint(obj, ACPI_PCIHP_IO_LEN_PROP, NULL);
|
||||||
}
|
}
|
||||||
if (lpc) {
|
if (lpc) {
|
||||||
obj = lpc;
|
obj = lpc;
|
||||||
@@ -150,41 +149,42 @@ static void acpi_get_pm_info(AcpiPmInfo *pm)
|
|||||||
/* Fill in optional s3/s4 related properties */
|
/* Fill in optional s3/s4 related properties */
|
||||||
o = object_property_get_qobject(obj, ACPI_PM_PROP_S3_DISABLED, NULL);
|
o = object_property_get_qobject(obj, ACPI_PM_PROP_S3_DISABLED, NULL);
|
||||||
if (o) {
|
if (o) {
|
||||||
pm->s3_disabled = qint_get_int(qobject_to_qint(o));
|
pm->s3_disabled = qnum_get_uint(qobject_to_qnum(o));
|
||||||
} else {
|
} else {
|
||||||
pm->s3_disabled = false;
|
pm->s3_disabled = false;
|
||||||
}
|
}
|
||||||
qobject_decref(o);
|
qobject_decref(o);
|
||||||
o = object_property_get_qobject(obj, ACPI_PM_PROP_S4_DISABLED, NULL);
|
o = object_property_get_qobject(obj, ACPI_PM_PROP_S4_DISABLED, NULL);
|
||||||
if (o) {
|
if (o) {
|
||||||
pm->s4_disabled = qint_get_int(qobject_to_qint(o));
|
pm->s4_disabled = qnum_get_uint(qobject_to_qnum(o));
|
||||||
} else {
|
} else {
|
||||||
pm->s4_disabled = false;
|
pm->s4_disabled = false;
|
||||||
}
|
}
|
||||||
qobject_decref(o);
|
qobject_decref(o);
|
||||||
o = object_property_get_qobject(obj, ACPI_PM_PROP_S4_VAL, NULL);
|
o = object_property_get_qobject(obj, ACPI_PM_PROP_S4_VAL, NULL);
|
||||||
if (o) {
|
if (o) {
|
||||||
pm->s4_val = qint_get_int(qobject_to_qint(o));
|
pm->s4_val = qnum_get_uint(qobject_to_qnum(o));
|
||||||
} else {
|
} else {
|
||||||
pm->s4_val = false;
|
pm->s4_val = false;
|
||||||
}
|
}
|
||||||
qobject_decref(o);
|
qobject_decref(o);
|
||||||
|
|
||||||
/* Fill in mandatory properties */
|
/* Fill in mandatory properties */
|
||||||
pm->sci_int = object_property_get_int(obj, ACPI_PM_PROP_SCI_INT, NULL);
|
pm->sci_int = object_property_get_uint(obj, ACPI_PM_PROP_SCI_INT, NULL);
|
||||||
|
|
||||||
pm->acpi_enable_cmd = object_property_get_int(obj,
|
pm->acpi_enable_cmd = object_property_get_uint(obj,
|
||||||
ACPI_PM_PROP_ACPI_ENABLE_CMD,
|
ACPI_PM_PROP_ACPI_ENABLE_CMD,
|
||||||
NULL);
|
NULL);
|
||||||
pm->acpi_disable_cmd = object_property_get_int(obj,
|
pm->acpi_disable_cmd =
|
||||||
ACPI_PM_PROP_ACPI_DISABLE_CMD,
|
object_property_get_uint(obj,
|
||||||
NULL);
|
ACPI_PM_PROP_ACPI_DISABLE_CMD,
|
||||||
pm->io_base = object_property_get_int(obj, ACPI_PM_PROP_PM_IO_BASE,
|
NULL);
|
||||||
NULL);
|
pm->io_base = object_property_get_uint(obj, ACPI_PM_PROP_PM_IO_BASE,
|
||||||
pm->gpe0_blk = object_property_get_int(obj, ACPI_PM_PROP_GPE0_BLK,
|
|
||||||
NULL);
|
NULL);
|
||||||
pm->gpe0_blk_len = object_property_get_int(obj, ACPI_PM_PROP_GPE0_BLK_LEN,
|
pm->gpe0_blk = object_property_get_uint(obj, ACPI_PM_PROP_GPE0_BLK,
|
||||||
NULL);
|
NULL);
|
||||||
|
pm->gpe0_blk_len = object_property_get_uint(obj, ACPI_PM_PROP_GPE0_BLK_LEN,
|
||||||
|
NULL);
|
||||||
pm->pcihp_bridge_en =
|
pm->pcihp_bridge_en =
|
||||||
object_property_get_bool(obj, "acpi-pci-hotplug-with-bridge-support",
|
object_property_get_bool(obj, "acpi-pci-hotplug-with-bridge-support",
|
||||||
NULL);
|
NULL);
|
||||||
@@ -237,19 +237,19 @@ static void acpi_get_pci_holes(Range *hole, Range *hole64)
|
|||||||
g_assert(pci_host);
|
g_assert(pci_host);
|
||||||
|
|
||||||
range_set_bounds1(hole,
|
range_set_bounds1(hole,
|
||||||
object_property_get_int(pci_host,
|
object_property_get_uint(pci_host,
|
||||||
PCI_HOST_PROP_PCI_HOLE_START,
|
PCI_HOST_PROP_PCI_HOLE_START,
|
||||||
NULL),
|
NULL),
|
||||||
object_property_get_int(pci_host,
|
object_property_get_uint(pci_host,
|
||||||
PCI_HOST_PROP_PCI_HOLE_END,
|
PCI_HOST_PROP_PCI_HOLE_END,
|
||||||
NULL));
|
NULL));
|
||||||
range_set_bounds1(hole64,
|
range_set_bounds1(hole64,
|
||||||
object_property_get_int(pci_host,
|
object_property_get_uint(pci_host,
|
||||||
PCI_HOST_PROP_PCI_HOLE64_START,
|
PCI_HOST_PROP_PCI_HOLE64_START,
|
||||||
NULL),
|
NULL),
|
||||||
object_property_get_int(pci_host,
|
object_property_get_uint(pci_host,
|
||||||
PCI_HOST_PROP_PCI_HOLE64_END,
|
PCI_HOST_PROP_PCI_HOLE64_END,
|
||||||
NULL));
|
NULL));
|
||||||
}
|
}
|
||||||
|
|
||||||
#define ACPI_PORT_SMI_CMD 0x00b2 /* TODO: this is APM_CNT_IOPORT */
|
#define ACPI_PORT_SMI_CMD 0x00b2 /* TODO: this is APM_CNT_IOPORT */
|
||||||
@@ -529,7 +529,7 @@ static void build_append_pci_bus_devices(Aml *parent_scope, PCIBus *bus,
|
|||||||
|
|
||||||
bsel = object_property_get_qobject(OBJECT(bus), ACPI_PCIHP_PROP_BSEL, NULL);
|
bsel = object_property_get_qobject(OBJECT(bus), ACPI_PCIHP_PROP_BSEL, NULL);
|
||||||
if (bsel) {
|
if (bsel) {
|
||||||
int64_t bsel_val = qint_get_int(qobject_to_qint(bsel));
|
uint64_t bsel_val = qnum_get_uint(qobject_to_qnum(bsel));
|
||||||
|
|
||||||
aml_append(parent_scope, aml_name_decl("BSEL", aml_int(bsel_val)));
|
aml_append(parent_scope, aml_name_decl("BSEL", aml_int(bsel_val)));
|
||||||
notify_method = aml_method("DVNT", 2, AML_NOTSERIALIZED);
|
notify_method = aml_method("DVNT", 2, AML_NOTSERIALIZED);
|
||||||
@@ -639,7 +639,8 @@ static void build_append_pci_bus_devices(Aml *parent_scope, PCIBus *bus,
|
|||||||
|
|
||||||
/* If bus supports hotplug select it and notify about local events */
|
/* If bus supports hotplug select it and notify about local events */
|
||||||
if (bsel) {
|
if (bsel) {
|
||||||
int64_t bsel_val = qint_get_int(qobject_to_qint(bsel));
|
uint64_t bsel_val = qnum_get_uint(qobject_to_qnum(bsel));
|
||||||
|
|
||||||
aml_append(method, aml_store(aml_int(bsel_val), aml_name("BNUM")));
|
aml_append(method, aml_store(aml_int(bsel_val), aml_name("BNUM")));
|
||||||
aml_append(method,
|
aml_append(method,
|
||||||
aml_call2("DVNT", aml_name("PCIU"), aml_int(1) /* Device Check */)
|
aml_call2("DVNT", aml_name("PCIU"), aml_int(1) /* Device Check */)
|
||||||
@@ -2614,12 +2615,12 @@ static bool acpi_get_mcfg(AcpiMcfgInfo *mcfg)
|
|||||||
if (!o) {
|
if (!o) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
mcfg->mcfg_base = qint_get_int(qobject_to_qint(o));
|
mcfg->mcfg_base = qnum_get_uint(qobject_to_qnum(o));
|
||||||
qobject_decref(o);
|
qobject_decref(o);
|
||||||
|
|
||||||
o = object_property_get_qobject(pci_host, PCIE_HOST_MCFG_SIZE, NULL);
|
o = object_property_get_qobject(pci_host, PCIE_HOST_MCFG_SIZE, NULL);
|
||||||
assert(o);
|
assert(o);
|
||||||
mcfg->mcfg_size = qint_get_int(qobject_to_qint(o));
|
mcfg->mcfg_size = qnum_get_uint(qobject_to_qnum(o));
|
||||||
qobject_decref(o);
|
qobject_decref(o);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -347,7 +347,7 @@ static int check_fdc(Object *obj, void *opaque)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
iobase = object_property_get_int(obj, "iobase", &local_err);
|
iobase = object_property_get_uint(obj, "iobase", &local_err);
|
||||||
if (local_err || iobase != 0x3f0) {
|
if (local_err || iobase != 0x3f0) {
|
||||||
error_free(local_err);
|
error_free(local_err);
|
||||||
return 0;
|
return 0;
|
||||||
@@ -1098,7 +1098,7 @@ static void pc_new_cpu(const char *typename, int64_t apic_id, Error **errp)
|
|||||||
|
|
||||||
cpu = object_new(typename);
|
cpu = object_new(typename);
|
||||||
|
|
||||||
object_property_set_int(cpu, apic_id, "apic-id", &local_err);
|
object_property_set_uint(cpu, apic_id, "apic-id", &local_err);
|
||||||
object_property_set_bool(cpu, true, "realized", &local_err);
|
object_property_set_bool(cpu, true, "realized", &local_err);
|
||||||
|
|
||||||
object_unref(cpu);
|
object_unref(cpu);
|
||||||
@@ -1558,7 +1558,7 @@ void pc_basic_device_init(ISABus *isa_bus, qemu_irq *gsi,
|
|||||||
* and earlier, use IRQ2 for compat. Otherwise, use IRQ16~23,
|
* and earlier, use IRQ2 for compat. Otherwise, use IRQ16~23,
|
||||||
* IRQ8 and IRQ2.
|
* IRQ8 and IRQ2.
|
||||||
*/
|
*/
|
||||||
uint8_t compat = object_property_get_int(OBJECT(hpet),
|
uint8_t compat = object_property_get_uint(OBJECT(hpet),
|
||||||
HPET_INTCAP, NULL);
|
HPET_INTCAP, NULL);
|
||||||
if (!compat) {
|
if (!compat) {
|
||||||
qdev_prop_set_uint32(hpet, HPET_INTCAP, hpet_irqs);
|
qdev_prop_set_uint32(hpet, HPET_INTCAP, hpet_irqs);
|
||||||
|
|||||||
@@ -182,9 +182,9 @@ static void xen_ram_init(PCMachineState *pcms,
|
|||||||
{
|
{
|
||||||
MemoryRegion *sysmem = get_system_memory();
|
MemoryRegion *sysmem = get_system_memory();
|
||||||
ram_addr_t block_len;
|
ram_addr_t block_len;
|
||||||
uint64_t user_lowmem = object_property_get_int(qdev_get_machine(),
|
uint64_t user_lowmem = object_property_get_uint(qdev_get_machine(),
|
||||||
PC_MACHINE_MAX_RAM_BELOW_4G,
|
PC_MACHINE_MAX_RAM_BELOW_4G,
|
||||||
&error_abort);
|
&error_abort);
|
||||||
|
|
||||||
/* Handle the machine opt max-ram-below-4g. It is basically doing
|
/* Handle the machine opt max-ram-below-4g. It is basically doing
|
||||||
* min(xen limit, user limit).
|
* min(xen limit, user limit).
|
||||||
|
|||||||
@@ -487,6 +487,7 @@ void hid_reset(HIDState *hs)
|
|||||||
memset(hs->kbd.keycodes, 0, sizeof(hs->kbd.keycodes));
|
memset(hs->kbd.keycodes, 0, sizeof(hs->kbd.keycodes));
|
||||||
memset(hs->kbd.key, 0, sizeof(hs->kbd.key));
|
memset(hs->kbd.key, 0, sizeof(hs->kbd.key));
|
||||||
hs->kbd.keys = 0;
|
hs->kbd.keys = 0;
|
||||||
|
hs->kbd.modifiers = 0;
|
||||||
break;
|
break;
|
||||||
case HID_MOUSE:
|
case HID_MOUSE:
|
||||||
case HID_TABLET:
|
case HID_TABLET:
|
||||||
|
|||||||
@@ -85,12 +85,12 @@ typedef struct {
|
|||||||
int rptr, wptr, count;
|
int rptr, wptr, count;
|
||||||
} PS2Queue;
|
} PS2Queue;
|
||||||
|
|
||||||
typedef struct {
|
struct PS2State {
|
||||||
PS2Queue queue;
|
PS2Queue queue;
|
||||||
int32_t write_cmd;
|
int32_t write_cmd;
|
||||||
void (*update_irq)(void *, int);
|
void (*update_irq)(void *, int);
|
||||||
void *update_arg;
|
void *update_arg;
|
||||||
} PS2State;
|
};
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
PS2State common;
|
PS2State common;
|
||||||
@@ -551,9 +551,17 @@ static uint8_t translate_table[256] = {
|
|||||||
0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff,
|
0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff,
|
||||||
};
|
};
|
||||||
|
|
||||||
void ps2_queue(void *opaque, int b)
|
static void ps2_reset_queue(PS2State *s)
|
||||||
|
{
|
||||||
|
PS2Queue *q = &s->queue;
|
||||||
|
|
||||||
|
q->rptr = 0;
|
||||||
|
q->wptr = 0;
|
||||||
|
q->count = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ps2_queue(PS2State *s, int b)
|
||||||
{
|
{
|
||||||
PS2State *s = (PS2State *)opaque;
|
|
||||||
PS2Queue *q = &s->queue;
|
PS2Queue *q = &s->queue;
|
||||||
|
|
||||||
if (q->count >= PS2_QUEUE_SIZE - 1)
|
if (q->count >= PS2_QUEUE_SIZE - 1)
|
||||||
@@ -692,13 +700,12 @@ static void ps2_keyboard_event(DeviceState *dev, QemuConsole *src,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
uint32_t ps2_read_data(void *opaque)
|
uint32_t ps2_read_data(PS2State *s)
|
||||||
{
|
{
|
||||||
PS2State *s = (PS2State *)opaque;
|
|
||||||
PS2Queue *q;
|
PS2Queue *q;
|
||||||
int val, index;
|
int val, index;
|
||||||
|
|
||||||
trace_ps2_read_data(opaque);
|
trace_ps2_read_data(s);
|
||||||
q = &s->queue;
|
q = &s->queue;
|
||||||
if (q->count == 0) {
|
if (q->count == 0) {
|
||||||
/* NOTE: if no data left, we return the last keyboard one
|
/* NOTE: if no data left, we return the last keyboard one
|
||||||
@@ -733,6 +740,7 @@ static void ps2_reset_keyboard(PS2KbdState *s)
|
|||||||
trace_ps2_reset_keyboard(s);
|
trace_ps2_reset_keyboard(s);
|
||||||
s->scan_enabled = 1;
|
s->scan_enabled = 1;
|
||||||
s->scancode_set = 2;
|
s->scancode_set = 2;
|
||||||
|
ps2_reset_queue(&s->common);
|
||||||
ps2_set_ledstate(s, 0);
|
ps2_set_ledstate(s, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1081,12 +1089,8 @@ void ps2_write_mouse(void *opaque, int val)
|
|||||||
|
|
||||||
static void ps2_common_reset(PS2State *s)
|
static void ps2_common_reset(PS2State *s)
|
||||||
{
|
{
|
||||||
PS2Queue *q;
|
|
||||||
s->write_cmd = -1;
|
s->write_cmd = -1;
|
||||||
q = &s->queue;
|
ps2_reset_queue(s);
|
||||||
q->rptr = 0;
|
|
||||||
q->wptr = 0;
|
|
||||||
q->count = 0;
|
|
||||||
s->update_irq(s->update_arg, 0);
|
s->update_irq(s->update_arg, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -450,10 +450,10 @@ static void apic_common_get_id(Object *obj, Visitor *v, const char *name,
|
|||||||
void *opaque, Error **errp)
|
void *opaque, Error **errp)
|
||||||
{
|
{
|
||||||
APICCommonState *s = APIC_COMMON(obj);
|
APICCommonState *s = APIC_COMMON(obj);
|
||||||
int64_t value;
|
uint32_t value;
|
||||||
|
|
||||||
value = s->apicbase & MSR_IA32_APICBASE_EXTD ? s->initial_apic_id : s->id;
|
value = s->apicbase & MSR_IA32_APICBASE_EXTD ? s->initial_apic_id : s->id;
|
||||||
visit_type_int(v, name, &value, errp);
|
visit_type_uint32(v, name, &value, errp);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void apic_common_set_id(Object *obj, Visitor *v, const char *name,
|
static void apic_common_set_id(Object *obj, Visitor *v, const char *name,
|
||||||
@@ -462,14 +462,14 @@ static void apic_common_set_id(Object *obj, Visitor *v, const char *name,
|
|||||||
APICCommonState *s = APIC_COMMON(obj);
|
APICCommonState *s = APIC_COMMON(obj);
|
||||||
DeviceState *dev = DEVICE(obj);
|
DeviceState *dev = DEVICE(obj);
|
||||||
Error *local_err = NULL;
|
Error *local_err = NULL;
|
||||||
int64_t value;
|
uint32_t value;
|
||||||
|
|
||||||
if (dev->realized) {
|
if (dev->realized) {
|
||||||
qdev_prop_set_after_realize(dev, name, errp);
|
qdev_prop_set_after_realize(dev, name, errp);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
visit_type_int(v, name, &value, &local_err);
|
visit_type_uint32(v, name, &value, &local_err);
|
||||||
if (local_err) {
|
if (local_err) {
|
||||||
error_propagate(errp, local_err);
|
error_propagate(errp, local_err);
|
||||||
return;
|
return;
|
||||||
@@ -484,7 +484,7 @@ static void apic_common_initfn(Object *obj)
|
|||||||
APICCommonState *s = APIC_COMMON(obj);
|
APICCommonState *s = APIC_COMMON(obj);
|
||||||
|
|
||||||
s->id = s->initial_apic_id = -1;
|
s->id = s->initial_apic_id = -1;
|
||||||
object_property_add(obj, "id", "int",
|
object_property_add(obj, "id", "uint32",
|
||||||
apic_common_get_id,
|
apic_common_get_id,
|
||||||
apic_common_set_id, NULL, NULL, NULL);
|
apic_common_set_id, NULL, NULL, NULL);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -268,7 +268,7 @@ static void arm_gicv3_common_realize(DeviceState *dev, Error **errp)
|
|||||||
* VLPIS == 0 (virtual LPIs not supported)
|
* VLPIS == 0 (virtual LPIs not supported)
|
||||||
* PLPIS == 0 (physical LPIs not supported)
|
* PLPIS == 0 (physical LPIs not supported)
|
||||||
*/
|
*/
|
||||||
cpu_affid = object_property_get_int(OBJECT(cpu), "mp-affinity", NULL);
|
cpu_affid = object_property_get_uint(OBJECT(cpu), "mp-affinity", NULL);
|
||||||
last = (i == s->num_cpu - 1);
|
last = (i == s->num_cpu - 1);
|
||||||
|
|
||||||
/* The CPU mp-affinity property is in MPIDR register format; squash
|
/* The CPU mp-affinity property is in MPIDR register format; squash
|
||||||
|
|||||||
@@ -46,7 +46,8 @@ void pc_dimm_memory_plug(DeviceState *dev, MemoryHotplugState *hpms,
|
|||||||
uint64_t existing_dimms_capacity = 0;
|
uint64_t existing_dimms_capacity = 0;
|
||||||
uint64_t addr;
|
uint64_t addr;
|
||||||
|
|
||||||
addr = object_property_get_int(OBJECT(dimm), PC_DIMM_ADDR_PROP, &local_err);
|
addr = object_property_get_uint(OBJECT(dimm),
|
||||||
|
PC_DIMM_ADDR_PROP, &local_err);
|
||||||
if (local_err) {
|
if (local_err) {
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
@@ -73,7 +74,7 @@ void pc_dimm_memory_plug(DeviceState *dev, MemoryHotplugState *hpms,
|
|||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
object_property_set_int(OBJECT(dev), addr, PC_DIMM_ADDR_PROP, &local_err);
|
object_property_set_uint(OBJECT(dev), addr, PC_DIMM_ADDR_PROP, &local_err);
|
||||||
if (local_err) {
|
if (local_err) {
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
@@ -135,7 +136,7 @@ static int pc_existing_dimms_capacity_internal(Object *obj, void *opaque)
|
|||||||
DeviceState *dev = DEVICE(obj);
|
DeviceState *dev = DEVICE(obj);
|
||||||
|
|
||||||
if (dev->realized) {
|
if (dev->realized) {
|
||||||
(*size) += object_property_get_int(obj, PC_DIMM_SIZE_PROP,
|
(*size) += object_property_get_uint(obj, PC_DIMM_SIZE_PROP,
|
||||||
cap->errp);
|
cap->errp);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -181,8 +182,8 @@ int qmp_pc_dimm_device_list(Object *obj, void *opaque)
|
|||||||
di->addr = dimm->addr;
|
di->addr = dimm->addr;
|
||||||
di->slot = dimm->slot;
|
di->slot = dimm->slot;
|
||||||
di->node = dimm->node;
|
di->node = dimm->node;
|
||||||
di->size = object_property_get_int(OBJECT(dimm), PC_DIMM_SIZE_PROP,
|
di->size = object_property_get_uint(OBJECT(dimm), PC_DIMM_SIZE_PROP,
|
||||||
NULL);
|
NULL);
|
||||||
di->memdev = object_get_canonical_path(OBJECT(dimm->hostmem));
|
di->memdev = object_get_canonical_path(OBJECT(dimm->hostmem));
|
||||||
|
|
||||||
info->u.dimm.data = di;
|
info->u.dimm.data = di;
|
||||||
@@ -313,9 +314,9 @@ uint64_t pc_dimm_get_free_addr(uint64_t address_space_start,
|
|||||||
/* find address range that will fit new DIMM */
|
/* find address range that will fit new DIMM */
|
||||||
for (item = list; item; item = g_slist_next(item)) {
|
for (item = list; item; item = g_slist_next(item)) {
|
||||||
PCDIMMDevice *dimm = item->data;
|
PCDIMMDevice *dimm = item->data;
|
||||||
uint64_t dimm_size = object_property_get_int(OBJECT(dimm),
|
uint64_t dimm_size = object_property_get_uint(OBJECT(dimm),
|
||||||
PC_DIMM_SIZE_PROP,
|
PC_DIMM_SIZE_PROP,
|
||||||
errp);
|
errp);
|
||||||
if (errp && *errp) {
|
if (errp && *errp) {
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
@@ -355,7 +356,7 @@ static Property pc_dimm_properties[] = {
|
|||||||
static void pc_dimm_get_size(Object *obj, Visitor *v, const char *name,
|
static void pc_dimm_get_size(Object *obj, Visitor *v, const char *name,
|
||||||
void *opaque, Error **errp)
|
void *opaque, Error **errp)
|
||||||
{
|
{
|
||||||
int64_t value;
|
uint64_t value;
|
||||||
MemoryRegion *mr;
|
MemoryRegion *mr;
|
||||||
PCDIMMDevice *dimm = PC_DIMM(obj);
|
PCDIMMDevice *dimm = PC_DIMM(obj);
|
||||||
PCDIMMDeviceClass *ddc = PC_DIMM_GET_CLASS(obj);
|
PCDIMMDeviceClass *ddc = PC_DIMM_GET_CLASS(obj);
|
||||||
@@ -363,7 +364,7 @@ static void pc_dimm_get_size(Object *obj, Visitor *v, const char *name,
|
|||||||
mr = ddc->get_memory_region(dimm);
|
mr = ddc->get_memory_region(dimm);
|
||||||
value = memory_region_size(mr);
|
value = memory_region_size(mr);
|
||||||
|
|
||||||
visit_type_int(v, name, &value, errp);
|
visit_type_uint64(v, name, &value, errp);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void pc_dimm_check_memdev_is_busy(Object *obj, const char *name,
|
static void pc_dimm_check_memdev_is_busy(Object *obj, const char *name,
|
||||||
@@ -386,7 +387,7 @@ static void pc_dimm_init(Object *obj)
|
|||||||
{
|
{
|
||||||
PCDIMMDevice *dimm = PC_DIMM(obj);
|
PCDIMMDevice *dimm = PC_DIMM(obj);
|
||||||
|
|
||||||
object_property_add(obj, PC_DIMM_SIZE_PROP, "int", pc_dimm_get_size,
|
object_property_add(obj, PC_DIMM_SIZE_PROP, "uint64", pc_dimm_get_size,
|
||||||
NULL, NULL, NULL, &error_abort);
|
NULL, NULL, NULL, &error_abort);
|
||||||
object_property_add_link(obj, PC_DIMM_MEMDEV_PROP, TYPE_MEMORY_BACKEND,
|
object_property_add_link(obj, PC_DIMM_MEMDEV_PROP, TYPE_MEMORY_BACKEND,
|
||||||
(Object **)&dimm->hostmem,
|
(Object **)&dimm->hostmem,
|
||||||
|
|||||||
@@ -244,7 +244,7 @@ static void aux_slave_dev_print(Monitor *mon, DeviceState *dev, int indent)
|
|||||||
|
|
||||||
monitor_printf(mon, "%*smemory " TARGET_FMT_plx "/" TARGET_FMT_plx "\n",
|
monitor_printf(mon, "%*smemory " TARGET_FMT_plx "/" TARGET_FMT_plx "\n",
|
||||||
indent, "",
|
indent, "",
|
||||||
object_property_get_int(OBJECT(s->mmio), "addr", NULL),
|
object_property_get_uint(OBJECT(s->mmio), "addr", NULL),
|
||||||
memory_region_size(s->mmio));
|
memory_region_size(s->mmio));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -111,7 +111,7 @@ uint16_t pvpanic_port(void)
|
|||||||
if (!o) {
|
if (!o) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
return object_property_get_int(o, PVPANIC_IOPORT_PROP, NULL);
|
return object_property_get_uint(o, PVPANIC_IOPORT_PROP, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
static Property pvpanic_isa_properties[] = {
|
static Property pvpanic_isa_properties[] = {
|
||||||
|
|||||||
@@ -645,12 +645,12 @@ static PropertyInfo e1000e_prop_disable_vnet,
|
|||||||
|
|
||||||
static Property e1000e_properties[] = {
|
static Property e1000e_properties[] = {
|
||||||
DEFINE_NIC_PROPERTIES(E1000EState, conf),
|
DEFINE_NIC_PROPERTIES(E1000EState, conf),
|
||||||
DEFINE_PROP_DEFAULT("disable_vnet_hdr", E1000EState, disable_vnet, false,
|
DEFINE_PROP_SIGNED("disable_vnet_hdr", E1000EState, disable_vnet, false,
|
||||||
e1000e_prop_disable_vnet, bool),
|
e1000e_prop_disable_vnet, bool),
|
||||||
DEFINE_PROP_DEFAULT("subsys_ven", E1000EState, subsys_ven,
|
DEFINE_PROP_SIGNED("subsys_ven", E1000EState, subsys_ven,
|
||||||
PCI_VENDOR_ID_INTEL,
|
PCI_VENDOR_ID_INTEL,
|
||||||
e1000e_prop_subsys_ven, uint16_t),
|
e1000e_prop_subsys_ven, uint16_t),
|
||||||
DEFINE_PROP_DEFAULT("subsys", E1000EState, subsys, 0,
|
DEFINE_PROP_SIGNED("subsys", E1000EState, subsys, 0,
|
||||||
e1000e_prop_subsys, uint16_t),
|
e1000e_prop_subsys, uint16_t),
|
||||||
DEFINE_PROP_END_OF_LIST(),
|
DEFINE_PROP_END_OF_LIST(),
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -94,7 +94,7 @@ static void gpex_host_initfn(Object *obj)
|
|||||||
|
|
||||||
object_initialize(root, sizeof(*root), TYPE_GPEX_ROOT_DEVICE);
|
object_initialize(root, sizeof(*root), TYPE_GPEX_ROOT_DEVICE);
|
||||||
object_property_add_child(obj, "gpex_root", OBJECT(root), NULL);
|
object_property_add_child(obj, "gpex_root", OBJECT(root), NULL);
|
||||||
qdev_prop_set_uint32(DEVICE(root), "addr", PCI_DEVFN(0, 0));
|
qdev_prop_set_int32(DEVICE(root), "addr", PCI_DEVFN(0, 0));
|
||||||
qdev_prop_set_bit(DEVICE(root), "multifunction", false);
|
qdev_prop_set_bit(DEVICE(root), "multifunction", false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -273,19 +273,19 @@ static void i440fx_pcihost_initfn(Object *obj)
|
|||||||
memory_region_init_io(&s->data_mem, obj, &pci_host_data_le_ops, s,
|
memory_region_init_io(&s->data_mem, obj, &pci_host_data_le_ops, s,
|
||||||
"pci-conf-data", 4);
|
"pci-conf-data", 4);
|
||||||
|
|
||||||
object_property_add(obj, PCI_HOST_PROP_PCI_HOLE_START, "int",
|
object_property_add(obj, PCI_HOST_PROP_PCI_HOLE_START, "uint32",
|
||||||
i440fx_pcihost_get_pci_hole_start,
|
i440fx_pcihost_get_pci_hole_start,
|
||||||
NULL, NULL, NULL, NULL);
|
NULL, NULL, NULL, NULL);
|
||||||
|
|
||||||
object_property_add(obj, PCI_HOST_PROP_PCI_HOLE_END, "int",
|
object_property_add(obj, PCI_HOST_PROP_PCI_HOLE_END, "uint32",
|
||||||
i440fx_pcihost_get_pci_hole_end,
|
i440fx_pcihost_get_pci_hole_end,
|
||||||
NULL, NULL, NULL, NULL);
|
NULL, NULL, NULL, NULL);
|
||||||
|
|
||||||
object_property_add(obj, PCI_HOST_PROP_PCI_HOLE64_START, "int",
|
object_property_add(obj, PCI_HOST_PROP_PCI_HOLE64_START, "uint64",
|
||||||
i440fx_pcihost_get_pci_hole64_start,
|
i440fx_pcihost_get_pci_hole64_start,
|
||||||
NULL, NULL, NULL, NULL);
|
NULL, NULL, NULL, NULL);
|
||||||
|
|
||||||
object_property_add(obj, PCI_HOST_PROP_PCI_HOLE64_END, "int",
|
object_property_add(obj, PCI_HOST_PROP_PCI_HOLE64_END, "uint64",
|
||||||
i440fx_pcihost_get_pci_hole64_end,
|
i440fx_pcihost_get_pci_hole64_end,
|
||||||
NULL, NULL, NULL, NULL);
|
NULL, NULL, NULL, NULL);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -129,9 +129,8 @@ static void q35_host_get_mmcfg_size(Object *obj, Visitor *v, const char *name,
|
|||||||
void *opaque, Error **errp)
|
void *opaque, Error **errp)
|
||||||
{
|
{
|
||||||
PCIExpressHost *e = PCIE_HOST_BRIDGE(obj);
|
PCIExpressHost *e = PCIE_HOST_BRIDGE(obj);
|
||||||
uint32_t value = e->size;
|
|
||||||
|
|
||||||
visit_type_uint32(v, name, &value, errp);
|
visit_type_uint64(v, name, &e->size, errp);
|
||||||
}
|
}
|
||||||
|
|
||||||
static Property q35_host_props[] = {
|
static Property q35_host_props[] = {
|
||||||
@@ -173,26 +172,26 @@ static void q35_host_initfn(Object *obj)
|
|||||||
|
|
||||||
object_initialize(&s->mch, sizeof(s->mch), TYPE_MCH_PCI_DEVICE);
|
object_initialize(&s->mch, sizeof(s->mch), TYPE_MCH_PCI_DEVICE);
|
||||||
object_property_add_child(OBJECT(s), "mch", OBJECT(&s->mch), NULL);
|
object_property_add_child(OBJECT(s), "mch", OBJECT(&s->mch), NULL);
|
||||||
qdev_prop_set_uint32(DEVICE(&s->mch), "addr", PCI_DEVFN(0, 0));
|
qdev_prop_set_int32(DEVICE(&s->mch), "addr", PCI_DEVFN(0, 0));
|
||||||
qdev_prop_set_bit(DEVICE(&s->mch), "multifunction", false);
|
qdev_prop_set_bit(DEVICE(&s->mch), "multifunction", false);
|
||||||
|
|
||||||
object_property_add(obj, PCI_HOST_PROP_PCI_HOLE_START, "int",
|
object_property_add(obj, PCI_HOST_PROP_PCI_HOLE_START, "uint32",
|
||||||
q35_host_get_pci_hole_start,
|
q35_host_get_pci_hole_start,
|
||||||
NULL, NULL, NULL, NULL);
|
NULL, NULL, NULL, NULL);
|
||||||
|
|
||||||
object_property_add(obj, PCI_HOST_PROP_PCI_HOLE_END, "int",
|
object_property_add(obj, PCI_HOST_PROP_PCI_HOLE_END, "uint32",
|
||||||
q35_host_get_pci_hole_end,
|
q35_host_get_pci_hole_end,
|
||||||
NULL, NULL, NULL, NULL);
|
NULL, NULL, NULL, NULL);
|
||||||
|
|
||||||
object_property_add(obj, PCI_HOST_PROP_PCI_HOLE64_START, "int",
|
object_property_add(obj, PCI_HOST_PROP_PCI_HOLE64_START, "uint64",
|
||||||
q35_host_get_pci_hole64_start,
|
q35_host_get_pci_hole64_start,
|
||||||
NULL, NULL, NULL, NULL);
|
NULL, NULL, NULL, NULL);
|
||||||
|
|
||||||
object_property_add(obj, PCI_HOST_PROP_PCI_HOLE64_END, "int",
|
object_property_add(obj, PCI_HOST_PROP_PCI_HOLE64_END, "uint64",
|
||||||
q35_host_get_pci_hole64_end,
|
q35_host_get_pci_hole64_end,
|
||||||
NULL, NULL, NULL, NULL);
|
NULL, NULL, NULL, NULL);
|
||||||
|
|
||||||
object_property_add(obj, PCIE_HOST_MCFG_SIZE, "int",
|
object_property_add(obj, PCIE_HOST_MCFG_SIZE, "uint64",
|
||||||
q35_host_get_mmcfg_size,
|
q35_host_get_mmcfg_size,
|
||||||
NULL, NULL, NULL, NULL);
|
NULL, NULL, NULL, NULL);
|
||||||
|
|
||||||
|
|||||||
@@ -150,7 +150,7 @@ static void xilinx_pcie_host_init(Object *obj)
|
|||||||
|
|
||||||
object_initialize(root, sizeof(*root), TYPE_XILINX_PCIE_ROOT);
|
object_initialize(root, sizeof(*root), TYPE_XILINX_PCIE_ROOT);
|
||||||
object_property_add_child(obj, "root", OBJECT(root), NULL);
|
object_property_add_child(obj, "root", OBJECT(root), NULL);
|
||||||
qdev_prop_set_uint32(DEVICE(root), "addr", PCI_DEVFN(0, 0));
|
qdev_prop_set_int32(DEVICE(root), "addr", PCI_DEVFN(0, 0));
|
||||||
qdev_prop_set_bit(DEVICE(root), "multifunction", false);
|
qdev_prop_set_bit(DEVICE(root), "multifunction", false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1111,7 +1111,7 @@ static void powernv_machine_initfn(Object *obj)
|
|||||||
|
|
||||||
static void powernv_machine_class_props_init(ObjectClass *oc)
|
static void powernv_machine_class_props_init(ObjectClass *oc)
|
||||||
{
|
{
|
||||||
object_class_property_add(oc, "num-chips", "uint32_t",
|
object_class_property_add(oc, "num-chips", "uint32",
|
||||||
pnv_get_num_chips, pnv_set_num_chips,
|
pnv_get_num_chips, pnv_set_num_chips,
|
||||||
NULL, NULL, NULL);
|
NULL, NULL, NULL);
|
||||||
object_class_property_set_description(oc, "num-chips",
|
object_class_property_set_description(oc, "num-chips",
|
||||||
|
|||||||
@@ -51,7 +51,7 @@ static void powernv_cpu_init(PowerPCCPU *cpu, Error **errp)
|
|||||||
int thread_index = 0; /* TODO: TCG supports only one thread */
|
int thread_index = 0; /* TODO: TCG supports only one thread */
|
||||||
ppc_spr_t *pir = &env->spr_cb[SPR_PIR];
|
ppc_spr_t *pir = &env->spr_cb[SPR_PIR];
|
||||||
|
|
||||||
core_pir = object_property_get_int(OBJECT(cpu), "core-pir", &error_abort);
|
core_pir = object_property_get_uint(OBJECT(cpu), "core-pir", &error_abort);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* The PIR of a thread is the core PIR + the thread index. We will
|
* The PIR of a thread is the core PIR + the thread index. We will
|
||||||
|
|||||||
@@ -2589,7 +2589,8 @@ static void spapr_memory_plug(HotplugHandler *hotplug_dev, DeviceState *dev,
|
|||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
addr = object_property_get_int(OBJECT(dimm), PC_DIMM_ADDR_PROP, &local_err);
|
addr = object_property_get_uint(OBJECT(dimm),
|
||||||
|
PC_DIMM_ADDR_PROP, &local_err);
|
||||||
if (local_err) {
|
if (local_err) {
|
||||||
pc_dimm_memory_unplug(dev, &ms->hotplug_memory, mr);
|
pc_dimm_memory_unplug(dev, &ms->hotplug_memory, mr);
|
||||||
goto out;
|
goto out;
|
||||||
@@ -2751,7 +2752,7 @@ static void spapr_memory_unplug_request(HotplugHandler *hotplug_dev,
|
|||||||
sPAPRDRConnector *drc;
|
sPAPRDRConnector *drc;
|
||||||
sPAPRDIMMState *ds;
|
sPAPRDIMMState *ds;
|
||||||
|
|
||||||
addr_start = object_property_get_int(OBJECT(dimm), PC_DIMM_ADDR_PROP,
|
addr_start = object_property_get_uint(OBJECT(dimm), PC_DIMM_ADDR_PROP,
|
||||||
&local_err);
|
&local_err);
|
||||||
if (local_err) {
|
if (local_err) {
|
||||||
goto out;
|
goto out;
|
||||||
@@ -2986,7 +2987,7 @@ static void spapr_machine_device_plug(HotplugHandler *hotplug_dev,
|
|||||||
error_setg(errp, "Memory hotplug not supported for this machine");
|
error_setg(errp, "Memory hotplug not supported for this machine");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
node = object_property_get_int(OBJECT(dev), PC_DIMM_NODE_PROP, errp);
|
node = object_property_get_uint(OBJECT(dev), PC_DIMM_NODE_PROP, errp);
|
||||||
if (*errp) {
|
if (*errp) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1107,7 +1107,7 @@ static void usb_host_detach_kernel(USBHostDevice *s)
|
|||||||
if (rc != 0) {
|
if (rc != 0) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
for (i = 0; i < conf->bNumInterfaces; i++) {
|
for (i = 0; i < USB_MAX_INTERFACES; i++) {
|
||||||
rc = libusb_kernel_driver_active(s->dh, i);
|
rc = libusb_kernel_driver_active(s->dh, i);
|
||||||
usb_host_libusb_error("libusb_kernel_driver_active", rc);
|
usb_host_libusb_error("libusb_kernel_driver_active", rc);
|
||||||
if (rc != 1) {
|
if (rc != 1) {
|
||||||
@@ -1130,7 +1130,7 @@ static void usb_host_attach_kernel(USBHostDevice *s)
|
|||||||
if (rc != 0) {
|
if (rc != 0) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
for (i = 0; i < conf->bNumInterfaces; i++) {
|
for (i = 0; i < USB_MAX_INTERFACES; i++) {
|
||||||
if (!s->ifs[i].detached) {
|
if (!s->ifs[i].detached) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
@@ -1145,7 +1145,7 @@ static int usb_host_claim_interfaces(USBHostDevice *s, int configuration)
|
|||||||
{
|
{
|
||||||
USBDevice *udev = USB_DEVICE(s);
|
USBDevice *udev = USB_DEVICE(s);
|
||||||
struct libusb_config_descriptor *conf;
|
struct libusb_config_descriptor *conf;
|
||||||
int rc, i;
|
int rc, i, claimed;
|
||||||
|
|
||||||
for (i = 0; i < USB_MAX_INTERFACES; i++) {
|
for (i = 0; i < USB_MAX_INTERFACES; i++) {
|
||||||
udev->altsetting[i] = 0;
|
udev->altsetting[i] = 0;
|
||||||
@@ -1164,14 +1164,19 @@ static int usb_host_claim_interfaces(USBHostDevice *s, int configuration)
|
|||||||
return USB_RET_STALL;
|
return USB_RET_STALL;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (i = 0; i < conf->bNumInterfaces; i++) {
|
claimed = 0;
|
||||||
|
for (i = 0; i < USB_MAX_INTERFACES; i++) {
|
||||||
trace_usb_host_claim_interface(s->bus_num, s->addr, configuration, i);
|
trace_usb_host_claim_interface(s->bus_num, s->addr, configuration, i);
|
||||||
rc = libusb_claim_interface(s->dh, i);
|
rc = libusb_claim_interface(s->dh, i);
|
||||||
usb_host_libusb_error("libusb_claim_interface", rc);
|
if (rc == 0) {
|
||||||
if (rc != 0) {
|
s->ifs[i].claimed = true;
|
||||||
return USB_RET_STALL;
|
if (++claimed == conf->bNumInterfaces) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
s->ifs[i].claimed = true;
|
}
|
||||||
|
if (claimed != conf->bNumInterfaces) {
|
||||||
|
return USB_RET_STALL;
|
||||||
}
|
}
|
||||||
|
|
||||||
udev->ninterfaces = conf->bNumInterfaces;
|
udev->ninterfaces = conf->bNumInterfaces;
|
||||||
@@ -1183,10 +1188,9 @@ static int usb_host_claim_interfaces(USBHostDevice *s, int configuration)
|
|||||||
|
|
||||||
static void usb_host_release_interfaces(USBHostDevice *s)
|
static void usb_host_release_interfaces(USBHostDevice *s)
|
||||||
{
|
{
|
||||||
USBDevice *udev = USB_DEVICE(s);
|
|
||||||
int i, rc;
|
int i, rc;
|
||||||
|
|
||||||
for (i = 0; i < udev->ninterfaces; i++) {
|
for (i = 0; i < USB_MAX_INTERFACES; i++) {
|
||||||
if (!s->ifs[i].claimed) {
|
if (!s->ifs[i].claimed) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -30,7 +30,6 @@
|
|||||||
#include "hw/xen/xen_backend.h"
|
#include "hw/xen/xen_backend.h"
|
||||||
#include "monitor/qdev.h"
|
#include "monitor/qdev.h"
|
||||||
#include "qapi/qmp/qbool.h"
|
#include "qapi/qmp/qbool.h"
|
||||||
#include "qapi/qmp/qint.h"
|
|
||||||
#include "qapi/qmp/qstring.h"
|
#include "qapi/qmp/qstring.h"
|
||||||
|
|
||||||
#include "hw/xen/io/ring.h"
|
#include "hw/xen/io/ring.h"
|
||||||
|
|||||||
@@ -301,7 +301,7 @@ static inline void tlb_flush_by_mmuidx_all_cpus_synced(CPUState *cpu,
|
|||||||
#define CODE_GEN_AVG_BLOCK_SIZE 150
|
#define CODE_GEN_AVG_BLOCK_SIZE 150
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(__arm__) || defined(_ARCH_PPC) \
|
#if defined(_ARCH_PPC) \
|
||||||
|| defined(__x86_64__) || defined(__i386__) \
|
|| defined(__x86_64__) || defined(__i386__) \
|
||||||
|| defined(__sparc__) || defined(__aarch64__) \
|
|| defined(__sparc__) || defined(__aarch64__) \
|
||||||
|| defined(__s390x__) || defined(__mips__) \
|
|| defined(__s390x__) || defined(__mips__) \
|
||||||
@@ -401,9 +401,6 @@ static inline void tb_set_jmp_target1(uintptr_t jmp_addr, uintptr_t addr)
|
|||||||
#elif defined(__aarch64__)
|
#elif defined(__aarch64__)
|
||||||
void aarch64_tb_set_jmp_target(uintptr_t jmp_addr, uintptr_t addr);
|
void aarch64_tb_set_jmp_target(uintptr_t jmp_addr, uintptr_t addr);
|
||||||
#define tb_set_jmp_target1 aarch64_tb_set_jmp_target
|
#define tb_set_jmp_target1 aarch64_tb_set_jmp_target
|
||||||
#elif defined(__arm__)
|
|
||||||
void arm_tb_set_jmp_target(uintptr_t jmp_addr, uintptr_t addr);
|
|
||||||
#define tb_set_jmp_target1 arm_tb_set_jmp_target
|
|
||||||
#elif defined(__sparc__) || defined(__mips__)
|
#elif defined(__sparc__) || defined(__mips__)
|
||||||
void tb_set_jmp_target1(uintptr_t jmp_addr, uintptr_t addr);
|
void tb_set_jmp_target1(uintptr_t jmp_addr, uintptr_t addr);
|
||||||
#else
|
#else
|
||||||
|
|||||||
@@ -31,8 +31,9 @@ typedef struct TBContext TBContext;
|
|||||||
|
|
||||||
struct TBContext {
|
struct TBContext {
|
||||||
|
|
||||||
TranslationBlock *tbs;
|
TranslationBlock **tbs;
|
||||||
struct qht htable;
|
struct qht htable;
|
||||||
|
size_t tbs_size;
|
||||||
int nb_tbs;
|
int nb_tbs;
|
||||||
/* any access to the tbs or the page table must use this lock */
|
/* any access to the tbs or the page table must use this lock */
|
||||||
QemuMutex tb_lock;
|
QemuMutex tb_lock;
|
||||||
|
|||||||
@@ -36,8 +36,8 @@ void *ps2_kbd_init(void (*update_irq)(void *, int), void *update_arg);
|
|||||||
void *ps2_mouse_init(void (*update_irq)(void *, int), void *update_arg);
|
void *ps2_mouse_init(void (*update_irq)(void *, int), void *update_arg);
|
||||||
void ps2_write_mouse(void *, int val);
|
void ps2_write_mouse(void *, int val);
|
||||||
void ps2_write_keyboard(void *, int val);
|
void ps2_write_keyboard(void *, int val);
|
||||||
uint32_t ps2_read_data(void *);
|
uint32_t ps2_read_data(PS2State *s);
|
||||||
void ps2_queue(void *, int b);
|
void ps2_queue(PS2State *s, int b);
|
||||||
void ps2_keyboard_set_translation(void *opaque, int mode);
|
void ps2_keyboard_set_translation(void *opaque, int mode);
|
||||||
void ps2_mouse_fake_event(void *opaque);
|
void ps2_mouse_fake_event(void *opaque);
|
||||||
|
|
||||||
|
|||||||
@@ -29,7 +29,7 @@ static inline uint16_t applesmc_port(void)
|
|||||||
Object *obj = object_resolve_path_type("", TYPE_APPLE_SMC, NULL);
|
Object *obj = object_resolve_path_type("", TYPE_APPLE_SMC, NULL);
|
||||||
|
|
||||||
if (obj) {
|
if (obj) {
|
||||||
return object_property_get_int(obj, APPLESMC_PROP_IO_BASE, NULL);
|
return object_property_get_uint(obj, APPLESMC_PROP_IO_BASE, NULL);
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -226,8 +226,10 @@ struct Property {
|
|||||||
PropertyInfo *info;
|
PropertyInfo *info;
|
||||||
ptrdiff_t offset;
|
ptrdiff_t offset;
|
||||||
uint8_t bitnr;
|
uint8_t bitnr;
|
||||||
QType qtype;
|
union {
|
||||||
int64_t defval;
|
int64_t i;
|
||||||
|
uint64_t u;
|
||||||
|
} defval;
|
||||||
int arrayoffset;
|
int arrayoffset;
|
||||||
PropertyInfo *arrayinfo;
|
PropertyInfo *arrayinfo;
|
||||||
int arrayfieldsize;
|
int arrayfieldsize;
|
||||||
@@ -238,6 +240,7 @@ struct PropertyInfo {
|
|||||||
const char *description;
|
const char *description;
|
||||||
const char * const *enum_table;
|
const char * const *enum_table;
|
||||||
int (*print)(DeviceState *dev, Property *prop, char *dest, size_t len);
|
int (*print)(DeviceState *dev, Property *prop, char *dest, size_t len);
|
||||||
|
void (*set_default_value)(Object *obj, const Property *prop);
|
||||||
ObjectPropertyAccessor *get;
|
ObjectPropertyAccessor *get;
|
||||||
ObjectPropertyAccessor *set;
|
ObjectPropertyAccessor *set;
|
||||||
ObjectPropertyRelease *release;
|
ObjectPropertyRelease *release;
|
||||||
|
|||||||
@@ -37,31 +37,39 @@ extern PropertyInfo qdev_prop_arraylen;
|
|||||||
.offset = offsetof(_state, _field) \
|
.offset = offsetof(_state, _field) \
|
||||||
+ type_check(_type, typeof_field(_state, _field)), \
|
+ type_check(_type, typeof_field(_state, _field)), \
|
||||||
}
|
}
|
||||||
#define DEFINE_PROP_DEFAULT(_name, _state, _field, _defval, _prop, _type) { \
|
|
||||||
|
#define DEFINE_PROP_SIGNED(_name, _state, _field, _defval, _prop, _type) { \
|
||||||
.name = (_name), \
|
.name = (_name), \
|
||||||
.info = &(_prop), \
|
.info = &(_prop), \
|
||||||
.offset = offsetof(_state, _field) \
|
.offset = offsetof(_state, _field) \
|
||||||
+ type_check(_type,typeof_field(_state, _field)), \
|
+ type_check(_type,typeof_field(_state, _field)), \
|
||||||
.qtype = QTYPE_QINT, \
|
.defval.i = (_type)_defval, \
|
||||||
.defval = (_type)_defval, \
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#define DEFINE_PROP_BIT(_name, _state, _field, _bit, _defval) { \
|
#define DEFINE_PROP_BIT(_name, _state, _field, _bit, _defval) { \
|
||||||
.name = (_name), \
|
.name = (_name), \
|
||||||
.info = &(qdev_prop_bit), \
|
.info = &(qdev_prop_bit), \
|
||||||
.bitnr = (_bit), \
|
.bitnr = (_bit), \
|
||||||
.offset = offsetof(_state, _field) \
|
.offset = offsetof(_state, _field) \
|
||||||
+ type_check(uint32_t,typeof_field(_state, _field)), \
|
+ type_check(uint32_t,typeof_field(_state, _field)), \
|
||||||
.qtype = QTYPE_QBOOL, \
|
.defval.u = (bool)_defval, \
|
||||||
.defval = (bool)_defval, \
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#define DEFINE_PROP_UNSIGNED(_name, _state, _field, _defval, _prop, _type) { \
|
||||||
|
.name = (_name), \
|
||||||
|
.info = &(_prop), \
|
||||||
|
.offset = offsetof(_state, _field) \
|
||||||
|
+ type_check(_type, typeof_field(_state, _field)), \
|
||||||
|
.defval.u = (_type)_defval, \
|
||||||
|
}
|
||||||
|
|
||||||
#define DEFINE_PROP_BIT64(_name, _state, _field, _bit, _defval) { \
|
#define DEFINE_PROP_BIT64(_name, _state, _field, _bit, _defval) { \
|
||||||
.name = (_name), \
|
.name = (_name), \
|
||||||
.info = &(qdev_prop_bit64), \
|
.info = &(qdev_prop_bit64), \
|
||||||
.bitnr = (_bit), \
|
.bitnr = (_bit), \
|
||||||
.offset = offsetof(_state, _field) \
|
.offset = offsetof(_state, _field) \
|
||||||
+ type_check(uint64_t, typeof_field(_state, _field)), \
|
+ type_check(uint64_t, typeof_field(_state, _field)), \
|
||||||
.qtype = QTYPE_QBOOL, \
|
.defval.u = (bool)_defval, \
|
||||||
.defval = (bool)_defval, \
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#define DEFINE_PROP_BOOL(_name, _state, _field, _defval) { \
|
#define DEFINE_PROP_BOOL(_name, _state, _field, _defval) { \
|
||||||
@@ -69,8 +77,7 @@ extern PropertyInfo qdev_prop_arraylen;
|
|||||||
.info = &(qdev_prop_bool), \
|
.info = &(qdev_prop_bool), \
|
||||||
.offset = offsetof(_state, _field) \
|
.offset = offsetof(_state, _field) \
|
||||||
+ type_check(bool, typeof_field(_state, _field)), \
|
+ type_check(bool, typeof_field(_state, _field)), \
|
||||||
.qtype = QTYPE_QBOOL, \
|
.defval.u = (bool)_defval, \
|
||||||
.defval = (bool)_defval, \
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#define PROP_ARRAY_LEN_PREFIX "len-"
|
#define PROP_ARRAY_LEN_PREFIX "len-"
|
||||||
@@ -105,26 +112,25 @@ extern PropertyInfo qdev_prop_arraylen;
|
|||||||
.info = &(qdev_prop_arraylen), \
|
.info = &(qdev_prop_arraylen), \
|
||||||
.offset = offsetof(_state, _field) \
|
.offset = offsetof(_state, _field) \
|
||||||
+ type_check(uint32_t, typeof_field(_state, _field)), \
|
+ type_check(uint32_t, typeof_field(_state, _field)), \
|
||||||
.qtype = QTYPE_QINT, \
|
|
||||||
.arrayinfo = &(_arrayprop), \
|
.arrayinfo = &(_arrayprop), \
|
||||||
.arrayfieldsize = sizeof(_arraytype), \
|
.arrayfieldsize = sizeof(_arraytype), \
|
||||||
.arrayoffset = offsetof(_state, _arrayfield), \
|
.arrayoffset = offsetof(_state, _arrayfield), \
|
||||||
}
|
}
|
||||||
|
|
||||||
#define DEFINE_PROP_UINT8(_n, _s, _f, _d) \
|
#define DEFINE_PROP_UINT8(_n, _s, _f, _d) \
|
||||||
DEFINE_PROP_DEFAULT(_n, _s, _f, _d, qdev_prop_uint8, uint8_t)
|
DEFINE_PROP_UNSIGNED(_n, _s, _f, _d, qdev_prop_uint8, uint8_t)
|
||||||
#define DEFINE_PROP_UINT16(_n, _s, _f, _d) \
|
#define DEFINE_PROP_UINT16(_n, _s, _f, _d) \
|
||||||
DEFINE_PROP_DEFAULT(_n, _s, _f, _d, qdev_prop_uint16, uint16_t)
|
DEFINE_PROP_UNSIGNED(_n, _s, _f, _d, qdev_prop_uint16, uint16_t)
|
||||||
#define DEFINE_PROP_UINT32(_n, _s, _f, _d) \
|
#define DEFINE_PROP_UINT32(_n, _s, _f, _d) \
|
||||||
DEFINE_PROP_DEFAULT(_n, _s, _f, _d, qdev_prop_uint32, uint32_t)
|
DEFINE_PROP_UNSIGNED(_n, _s, _f, _d, qdev_prop_uint32, uint32_t)
|
||||||
#define DEFINE_PROP_INT32(_n, _s, _f, _d) \
|
#define DEFINE_PROP_INT32(_n, _s, _f, _d) \
|
||||||
DEFINE_PROP_DEFAULT(_n, _s, _f, _d, qdev_prop_int32, int32_t)
|
DEFINE_PROP_SIGNED(_n, _s, _f, _d, qdev_prop_int32, int32_t)
|
||||||
#define DEFINE_PROP_UINT64(_n, _s, _f, _d) \
|
#define DEFINE_PROP_UINT64(_n, _s, _f, _d) \
|
||||||
DEFINE_PROP_DEFAULT(_n, _s, _f, _d, qdev_prop_uint64, uint64_t)
|
DEFINE_PROP_UNSIGNED(_n, _s, _f, _d, qdev_prop_uint64, uint64_t)
|
||||||
#define DEFINE_PROP_SIZE(_n, _s, _f, _d) \
|
#define DEFINE_PROP_SIZE(_n, _s, _f, _d) \
|
||||||
DEFINE_PROP_DEFAULT(_n, _s, _f, _d, qdev_prop_size, uint64_t)
|
DEFINE_PROP_UNSIGNED(_n, _s, _f, _d, qdev_prop_size, uint64_t)
|
||||||
#define DEFINE_PROP_PCI_DEVFN(_n, _s, _f, _d) \
|
#define DEFINE_PROP_PCI_DEVFN(_n, _s, _f, _d) \
|
||||||
DEFINE_PROP_DEFAULT(_n, _s, _f, _d, qdev_prop_pci_devfn, int32_t)
|
DEFINE_PROP_SIGNED(_n, _s, _f, _d, qdev_prop_pci_devfn, int32_t)
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Please avoid pointer properties. If you must use them, you must
|
* Please avoid pointer properties. If you must use them, you must
|
||||||
@@ -158,17 +164,17 @@ extern PropertyInfo qdev_prop_arraylen;
|
|||||||
#define DEFINE_PROP_MACADDR(_n, _s, _f) \
|
#define DEFINE_PROP_MACADDR(_n, _s, _f) \
|
||||||
DEFINE_PROP(_n, _s, _f, qdev_prop_macaddr, MACAddr)
|
DEFINE_PROP(_n, _s, _f, qdev_prop_macaddr, MACAddr)
|
||||||
#define DEFINE_PROP_ON_OFF_AUTO(_n, _s, _f, _d) \
|
#define DEFINE_PROP_ON_OFF_AUTO(_n, _s, _f, _d) \
|
||||||
DEFINE_PROP_DEFAULT(_n, _s, _f, _d, qdev_prop_on_off_auto, OnOffAuto)
|
DEFINE_PROP_SIGNED(_n, _s, _f, _d, qdev_prop_on_off_auto, OnOffAuto)
|
||||||
#define DEFINE_PROP_LOSTTICKPOLICY(_n, _s, _f, _d) \
|
#define DEFINE_PROP_LOSTTICKPOLICY(_n, _s, _f, _d) \
|
||||||
DEFINE_PROP_DEFAULT(_n, _s, _f, _d, qdev_prop_losttickpolicy, \
|
DEFINE_PROP_SIGNED(_n, _s, _f, _d, qdev_prop_losttickpolicy, \
|
||||||
LostTickPolicy)
|
LostTickPolicy)
|
||||||
#define DEFINE_PROP_BLOCKDEV_ON_ERROR(_n, _s, _f, _d) \
|
#define DEFINE_PROP_BLOCKDEV_ON_ERROR(_n, _s, _f, _d) \
|
||||||
DEFINE_PROP_DEFAULT(_n, _s, _f, _d, qdev_prop_blockdev_on_error, \
|
DEFINE_PROP_SIGNED(_n, _s, _f, _d, qdev_prop_blockdev_on_error, \
|
||||||
BlockdevOnError)
|
BlockdevOnError)
|
||||||
#define DEFINE_PROP_BIOS_CHS_TRANS(_n, _s, _f, _d) \
|
#define DEFINE_PROP_BIOS_CHS_TRANS(_n, _s, _f, _d) \
|
||||||
DEFINE_PROP_DEFAULT(_n, _s, _f, _d, qdev_prop_bios_chs_trans, int)
|
DEFINE_PROP_SIGNED(_n, _s, _f, _d, qdev_prop_bios_chs_trans, int)
|
||||||
#define DEFINE_PROP_BLOCKSIZE(_n, _s, _f) \
|
#define DEFINE_PROP_BLOCKSIZE(_n, _s, _f) \
|
||||||
DEFINE_PROP_DEFAULT(_n, _s, _f, 0, qdev_prop_blocksize, uint16_t)
|
DEFINE_PROP_UNSIGNED(_n, _s, _f, 0, qdev_prop_blocksize, uint16_t)
|
||||||
#define DEFINE_PROP_PCI_HOST_DEVADDR(_n, _s, _f) \
|
#define DEFINE_PROP_PCI_HOST_DEVADDR(_n, _s, _f) \
|
||||||
DEFINE_PROP(_n, _s, _f, qdev_prop_pci_host_devaddr, PCIHostDeviceAddress)
|
DEFINE_PROP(_n, _s, _f, qdev_prop_pci_host_devaddr, PCIHostDeviceAddress)
|
||||||
|
|
||||||
|
|||||||
@@ -15,6 +15,7 @@
|
|||||||
|
|
||||||
#include "qapi/qmp/qobject.h"
|
#include "qapi/qmp/qobject.h"
|
||||||
#include "qapi/qmp/qlist.h"
|
#include "qapi/qmp/qlist.h"
|
||||||
|
#include "qapi/qmp/qnum.h"
|
||||||
#include "qemu/queue.h"
|
#include "qemu/queue.h"
|
||||||
|
|
||||||
#define QDICT_BUCKET_MAX 512
|
#define QDICT_BUCKET_MAX 512
|
||||||
@@ -54,7 +55,7 @@ void qdict_destroy_obj(QObject *obj);
|
|||||||
|
|
||||||
/* Helpers for int, bool, and string */
|
/* Helpers for int, bool, and string */
|
||||||
#define qdict_put_int(qdict, key, value) \
|
#define qdict_put_int(qdict, key, value) \
|
||||||
qdict_put(qdict, key, qint_from_int(value))
|
qdict_put(qdict, key, qnum_from_int(value))
|
||||||
#define qdict_put_bool(qdict, key, value) \
|
#define qdict_put_bool(qdict, key, value) \
|
||||||
qdict_put(qdict, key, qbool_from_bool(value))
|
qdict_put(qdict, key, qbool_from_bool(value))
|
||||||
#define qdict_put_str(qdict, key, value) \
|
#define qdict_put_str(qdict, key, value) \
|
||||||
|
|||||||
@@ -1,29 +0,0 @@
|
|||||||
/*
|
|
||||||
* QFloat Module
|
|
||||||
*
|
|
||||||
* Copyright IBM, Corp. 2009
|
|
||||||
*
|
|
||||||
* Authors:
|
|
||||||
* Anthony Liguori <aliguori@us.ibm.com>
|
|
||||||
*
|
|
||||||
* This work is licensed under the terms of the GNU LGPL, version 2.1 or later.
|
|
||||||
* See the COPYING.LIB file in the top-level directory.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef QFLOAT_H
|
|
||||||
#define QFLOAT_H
|
|
||||||
|
|
||||||
#include "qapi/qmp/qobject.h"
|
|
||||||
|
|
||||||
typedef struct QFloat {
|
|
||||||
QObject base;
|
|
||||||
double value;
|
|
||||||
} QFloat;
|
|
||||||
|
|
||||||
QFloat *qfloat_from_double(double value);
|
|
||||||
double qfloat_get_double(const QFloat *qi);
|
|
||||||
QFloat *qobject_to_qfloat(const QObject *obj);
|
|
||||||
void qfloat_destroy_obj(QObject *obj);
|
|
||||||
|
|
||||||
#endif /* QFLOAT_H */
|
|
||||||
@@ -1,28 +0,0 @@
|
|||||||
/*
|
|
||||||
* QInt Module
|
|
||||||
*
|
|
||||||
* Copyright (C) 2009 Red Hat Inc.
|
|
||||||
*
|
|
||||||
* Authors:
|
|
||||||
* Luiz Capitulino <lcapitulino@redhat.com>
|
|
||||||
*
|
|
||||||
* This work is licensed under the terms of the GNU LGPL, version 2.1 or later.
|
|
||||||
* See the COPYING.LIB file in the top-level directory.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef QINT_H
|
|
||||||
#define QINT_H
|
|
||||||
|
|
||||||
#include "qapi/qmp/qobject.h"
|
|
||||||
|
|
||||||
typedef struct QInt {
|
|
||||||
QObject base;
|
|
||||||
int64_t value;
|
|
||||||
} QInt;
|
|
||||||
|
|
||||||
QInt *qint_from_int(int64_t value);
|
|
||||||
int64_t qint_get_int(const QInt *qi);
|
|
||||||
QInt *qobject_to_qint(const QObject *obj);
|
|
||||||
void qint_destroy_obj(QObject *obj);
|
|
||||||
|
|
||||||
#endif /* QINT_H */
|
|
||||||
@@ -14,6 +14,7 @@
|
|||||||
#define QLIST_H
|
#define QLIST_H
|
||||||
|
|
||||||
#include "qapi/qmp/qobject.h"
|
#include "qapi/qmp/qobject.h"
|
||||||
|
#include "qapi/qmp/qnum.h"
|
||||||
#include "qemu/queue.h"
|
#include "qemu/queue.h"
|
||||||
|
|
||||||
typedef struct QListEntry {
|
typedef struct QListEntry {
|
||||||
@@ -31,7 +32,7 @@ typedef struct QList {
|
|||||||
|
|
||||||
/* Helpers for int, bool, and string */
|
/* Helpers for int, bool, and string */
|
||||||
#define qlist_append_int(qlist, value) \
|
#define qlist_append_int(qlist, value) \
|
||||||
qlist_append(qlist, qint_from_int(value))
|
qlist_append(qlist, qnum_from_int(value))
|
||||||
#define qlist_append_bool(qlist, value) \
|
#define qlist_append_bool(qlist, value) \
|
||||||
qlist_append(qlist, qbool_from_bool(value))
|
qlist_append(qlist, qbool_from_bool(value))
|
||||||
#define qlist_append_str(qlist, value) \
|
#define qlist_append_str(qlist, value) \
|
||||||
|
|||||||
53
include/qapi/qmp/qnum.h
Normal file
53
include/qapi/qmp/qnum.h
Normal file
@@ -0,0 +1,53 @@
|
|||||||
|
/*
|
||||||
|
* QNum Module
|
||||||
|
*
|
||||||
|
* Copyright (C) 2009 Red Hat Inc.
|
||||||
|
*
|
||||||
|
* Authors:
|
||||||
|
* Luiz Capitulino <lcapitulino@redhat.com>
|
||||||
|
* Anthony Liguori <aliguori@us.ibm.com>
|
||||||
|
* Marc-André Lureau <marcandre.lureau@redhat.com>
|
||||||
|
*
|
||||||
|
* This work is licensed under the terms of the GNU LGPL, version 2.1 or later.
|
||||||
|
* See the COPYING.LIB file in the top-level directory.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef QNUM_H
|
||||||
|
#define QNUM_H
|
||||||
|
|
||||||
|
#include "qapi/qmp/qobject.h"
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
QNUM_I64,
|
||||||
|
QNUM_U64,
|
||||||
|
QNUM_DOUBLE
|
||||||
|
} QNumKind;
|
||||||
|
|
||||||
|
typedef struct QNum {
|
||||||
|
QObject base;
|
||||||
|
QNumKind kind;
|
||||||
|
union {
|
||||||
|
int64_t i64;
|
||||||
|
uint64_t u64;
|
||||||
|
double dbl;
|
||||||
|
} u;
|
||||||
|
} QNum;
|
||||||
|
|
||||||
|
QNum *qnum_from_int(int64_t value);
|
||||||
|
QNum *qnum_from_uint(uint64_t value);
|
||||||
|
QNum *qnum_from_double(double value);
|
||||||
|
|
||||||
|
bool qnum_get_try_int(const QNum *qn, int64_t *val);
|
||||||
|
int64_t qnum_get_int(const QNum *qn);
|
||||||
|
|
||||||
|
bool qnum_get_try_uint(const QNum *qn, uint64_t *val);
|
||||||
|
uint64_t qnum_get_uint(const QNum *qn);
|
||||||
|
|
||||||
|
double qnum_get_double(QNum *qn);
|
||||||
|
|
||||||
|
char *qnum_to_string(QNum *qn);
|
||||||
|
|
||||||
|
QNum *qobject_to_qnum(const QObject *obj);
|
||||||
|
void qnum_destroy_obj(QObject *obj);
|
||||||
|
|
||||||
|
#endif /* QNUM_H */
|
||||||
@@ -14,8 +14,7 @@
|
|||||||
#define QAPI_QMP_TYPES_H
|
#define QAPI_QMP_TYPES_H
|
||||||
|
|
||||||
#include "qapi/qmp/qobject.h"
|
#include "qapi/qmp/qobject.h"
|
||||||
#include "qapi/qmp/qint.h"
|
#include "qapi/qmp/qnum.h"
|
||||||
#include "qapi/qmp/qfloat.h"
|
|
||||||
#include "qapi/qmp/qbool.h"
|
#include "qapi/qmp/qbool.h"
|
||||||
#include "qapi/qmp/qstring.h"
|
#include "qapi/qmp/qstring.h"
|
||||||
#include "qapi/qmp/qdict.h"
|
#include "qapi/qmp/qdict.h"
|
||||||
|
|||||||
@@ -30,9 +30,9 @@ typedef struct QObjectInputVisitor QObjectInputVisitor;
|
|||||||
* visit_type_FOO() creates an instance of QAPI type FOO. The visited
|
* visit_type_FOO() creates an instance of QAPI type FOO. The visited
|
||||||
* QObject must match FOO. QDict matches struct/union types, QList
|
* QObject must match FOO. QDict matches struct/union types, QList
|
||||||
* matches list types, QString matches type 'str' and enumeration
|
* matches list types, QString matches type 'str' and enumeration
|
||||||
* types, QInt matches integer types, QFloat matches type 'number',
|
* types, QNum matches integer and float types, QBool matches type
|
||||||
* QBool matches type 'bool'. Type 'any' is matched by QObject. A
|
* 'bool'. Type 'any' is matched by QObject. A QAPI alternate type
|
||||||
* QAPI alternate type is matched when one of its member types is.
|
* is matched when one of its member types is.
|
||||||
*
|
*
|
||||||
* visit_start_struct() ... visit_end_struct() visits a QDict and
|
* visit_start_struct() ... visit_end_struct() visits a QDict and
|
||||||
* creates a QAPI struct/union. Visits in between visit the
|
* creates a QAPI struct/union. Visits in between visit the
|
||||||
|
|||||||
@@ -28,10 +28,10 @@ typedef struct QObjectOutputVisitor QObjectOutputVisitor;
|
|||||||
*
|
*
|
||||||
* visit_type_FOO() creates a QObject for QAPI type FOO. It creates a
|
* visit_type_FOO() creates a QObject for QAPI type FOO. It creates a
|
||||||
* QDict for struct/union types, a QList for list types, QString for
|
* QDict for struct/union types, a QList for list types, QString for
|
||||||
* type 'str' and enumeration types, QInt for integer types, QFloat
|
* type 'str' and enumeration types, QNum for integer and float
|
||||||
* for type 'number', QBool for type 'bool'. For type 'any', it
|
* types, QBool for type 'bool'. For type 'any', it increments the
|
||||||
* increments the QObject's reference count. For QAPI alternate
|
* QObject's reference count. For QAPI alternate types, it creates
|
||||||
* types, it creates the QObject for the member that is in use.
|
* the QObject for the member that is in use.
|
||||||
*
|
*
|
||||||
* visit_start_struct() ... visit_end_struct() visits a QAPI
|
* visit_start_struct() ... visit_end_struct() visits a QAPI
|
||||||
* struct/union and creates a QDict. Visits in between visit the
|
* struct/union and creates a QDict. Visits in between visit the
|
||||||
|
|||||||
@@ -71,7 +71,7 @@ struct Visitor
|
|||||||
* optional for output visitors. */
|
* optional for output visitors. */
|
||||||
void (*start_alternate)(Visitor *v, const char *name,
|
void (*start_alternate)(Visitor *v, const char *name,
|
||||||
GenericAlternate **obj, size_t size,
|
GenericAlternate **obj, size_t size,
|
||||||
bool promote_int, Error **errp);
|
Error **errp);
|
||||||
|
|
||||||
/* Optional, needed for dealloc visitor */
|
/* Optional, needed for dealloc visitor */
|
||||||
void (*end_alternate)(Visitor *v, void **obj);
|
void (*end_alternate)(Visitor *v, void **obj);
|
||||||
|
|||||||
@@ -410,15 +410,13 @@ void visit_end_list(Visitor *v, void **list);
|
|||||||
* the qtype of the next thing to be visited, stored in (*@obj)->type.
|
* the qtype of the next thing to be visited, stored in (*@obj)->type.
|
||||||
* Other visitors will leave @obj unchanged.
|
* Other visitors will leave @obj unchanged.
|
||||||
*
|
*
|
||||||
* If @promote_int, treat integers as QTYPE_FLOAT.
|
|
||||||
*
|
|
||||||
* If successful, this must be paired with visit_end_alternate() with
|
* If successful, this must be paired with visit_end_alternate() with
|
||||||
* the same @obj to clean up, even if visiting the contents of the
|
* the same @obj to clean up, even if visiting the contents of the
|
||||||
* alternate fails.
|
* alternate fails.
|
||||||
*/
|
*/
|
||||||
void visit_start_alternate(Visitor *v, const char *name,
|
void visit_start_alternate(Visitor *v, const char *name,
|
||||||
GenericAlternate **obj, size_t size,
|
GenericAlternate **obj, size_t size,
|
||||||
bool promote_int, Error **errp);
|
Error **errp);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Finish visiting an alternate type.
|
* Finish visiting an alternate type.
|
||||||
|
|||||||
@@ -483,4 +483,7 @@ char *qemu_get_pid_name(pid_t pid);
|
|||||||
*/
|
*/
|
||||||
pid_t qemu_fork(Error **errp);
|
pid_t qemu_fork(Error **errp);
|
||||||
|
|
||||||
|
extern int qemu_icache_linesize;
|
||||||
|
extern int qemu_dcache_linesize;
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -76,6 +76,7 @@ typedef struct PixelFormat PixelFormat;
|
|||||||
typedef struct PostcopyDiscardState PostcopyDiscardState;
|
typedef struct PostcopyDiscardState PostcopyDiscardState;
|
||||||
typedef struct Property Property;
|
typedef struct Property Property;
|
||||||
typedef struct PropertyInfo PropertyInfo;
|
typedef struct PropertyInfo PropertyInfo;
|
||||||
|
typedef struct PS2State PS2State;
|
||||||
typedef struct QEMUBH QEMUBH;
|
typedef struct QEMUBH QEMUBH;
|
||||||
typedef struct QemuConsole QemuConsole;
|
typedef struct QemuConsole QemuConsole;
|
||||||
typedef struct QEMUFile QEMUFile;
|
typedef struct QEMUFile QEMUFile;
|
||||||
|
|||||||
@@ -1093,6 +1093,29 @@ void object_property_set_int(Object *obj, int64_t value,
|
|||||||
int64_t object_property_get_int(Object *obj, const char *name,
|
int64_t object_property_get_int(Object *obj, const char *name,
|
||||||
Error **errp);
|
Error **errp);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* object_property_set_uint:
|
||||||
|
* @value: the value to be written to the property
|
||||||
|
* @name: the name of the property
|
||||||
|
* @errp: returns an error if this function fails
|
||||||
|
*
|
||||||
|
* Writes an unsigned integer value to a property.
|
||||||
|
*/
|
||||||
|
void object_property_set_uint(Object *obj, uint64_t value,
|
||||||
|
const char *name, Error **errp);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* object_property_get_uint:
|
||||||
|
* @obj: the object
|
||||||
|
* @name: the name of the property
|
||||||
|
* @errp: returns an error if this function fails
|
||||||
|
*
|
||||||
|
* Returns: the value of the property, converted to an unsigned integer, or 0
|
||||||
|
* an error occurs (including when the property value is not an integer).
|
||||||
|
*/
|
||||||
|
uint64_t object_property_get_uint(Object *obj, const char *name,
|
||||||
|
Error **errp);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* object_property_get_enum:
|
* object_property_get_enum:
|
||||||
* @obj: the object
|
* @obj: the object
|
||||||
|
|||||||
@@ -2974,7 +2974,7 @@ static QDict *monitor_parse_arguments(Monitor *mon,
|
|||||||
monitor_printf(mon, "Unknown unit suffix\n");
|
monitor_printf(mon, "Unknown unit suffix\n");
|
||||||
goto fail;
|
goto fail;
|
||||||
}
|
}
|
||||||
qdict_put(qdict, key, qfloat_from_double(val));
|
qdict_put(qdict, key, qnum_from_double(val));
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 'b':
|
case 'b':
|
||||||
|
|||||||
@@ -328,7 +328,7 @@ static void filter_dump_instance_init(Object *obj)
|
|||||||
|
|
||||||
nfds->maxlen = 65536;
|
nfds->maxlen = 65536;
|
||||||
|
|
||||||
object_property_add(obj, "maxlen", "int", filter_dump_get_maxlen,
|
object_property_add(obj, "maxlen", "uint32", filter_dump_get_maxlen,
|
||||||
filter_dump_set_maxlen, NULL, NULL, NULL);
|
filter_dump_set_maxlen, NULL, NULL, NULL);
|
||||||
object_property_add_str(obj, "file", file_dump_get_filename,
|
object_property_add_str(obj, "file", file_dump_get_filename,
|
||||||
file_dump_set_filename, NULL);
|
file_dump_set_filename, NULL);
|
||||||
|
|||||||
@@ -191,7 +191,7 @@ out:
|
|||||||
|
|
||||||
static void filter_buffer_init(Object *obj)
|
static void filter_buffer_init(Object *obj)
|
||||||
{
|
{
|
||||||
object_property_add(obj, "interval", "int",
|
object_property_add(obj, "interval", "uint32",
|
||||||
filter_buffer_get_interval,
|
filter_buffer_get_interval,
|
||||||
filter_buffer_set_interval, NULL, NULL, NULL);
|
filter_buffer_set_interval, NULL, NULL, NULL);
|
||||||
}
|
}
|
||||||
|
|||||||
6
numa.c
6
numa.c
@@ -216,7 +216,7 @@ static void parse_numa_node(MachineState *ms, NumaNodeOptions *node,
|
|||||||
}
|
}
|
||||||
|
|
||||||
object_ref(o);
|
object_ref(o);
|
||||||
numa_info[nodenr].node_mem = object_property_get_int(o, "size", NULL);
|
numa_info[nodenr].node_mem = object_property_get_uint(o, "size", NULL);
|
||||||
numa_info[nodenr].node_memdev = MEMORY_BACKEND(o);
|
numa_info[nodenr].node_memdev = MEMORY_BACKEND(o);
|
||||||
}
|
}
|
||||||
numa_info[nodenr].present = true;
|
numa_info[nodenr].present = true;
|
||||||
@@ -641,8 +641,8 @@ static int query_memdev(Object *obj, void *opaque)
|
|||||||
m->value->id = object_property_get_str(obj, "id", NULL);
|
m->value->id = object_property_get_str(obj, "id", NULL);
|
||||||
m->value->has_id = !!m->value->id;
|
m->value->has_id = !!m->value->id;
|
||||||
|
|
||||||
m->value->size = object_property_get_int(obj, "size",
|
m->value->size = object_property_get_uint(obj, "size",
|
||||||
&error_abort);
|
&error_abort);
|
||||||
m->value->merge = object_property_get_bool(obj, "merge",
|
m->value->merge = object_property_get_bool(obj, "merge",
|
||||||
&error_abort);
|
&error_abort);
|
||||||
m->value->dump = object_property_get_bool(obj, "dump",
|
m->value->dump = object_property_get_bool(obj, "dump",
|
||||||
|
|||||||
@@ -70,7 +70,7 @@ static GenericList *qapi_clone_next_list(Visitor *v, GenericList *tail,
|
|||||||
|
|
||||||
static void qapi_clone_start_alternate(Visitor *v, const char *name,
|
static void qapi_clone_start_alternate(Visitor *v, const char *name,
|
||||||
GenericAlternate **obj, size_t size,
|
GenericAlternate **obj, size_t size,
|
||||||
bool promote_int, Error **errp)
|
Error **errp)
|
||||||
{
|
{
|
||||||
qapi_clone_start_struct(v, name, (void **)obj, size, errp);
|
qapi_clone_start_struct(v, name, (void **)obj, size, errp);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -38,7 +38,7 @@ static void qapi_dealloc_end_struct(Visitor *v, void **obj)
|
|||||||
|
|
||||||
static void qapi_dealloc_start_alternate(Visitor *v, const char *name,
|
static void qapi_dealloc_start_alternate(Visitor *v, const char *name,
|
||||||
GenericAlternate **obj, size_t size,
|
GenericAlternate **obj, size_t size,
|
||||||
bool promote_int, Error **errp)
|
Error **errp)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -106,15 +106,15 @@ void visit_end_list(Visitor *v, void **obj)
|
|||||||
|
|
||||||
void visit_start_alternate(Visitor *v, const char *name,
|
void visit_start_alternate(Visitor *v, const char *name,
|
||||||
GenericAlternate **obj, size_t size,
|
GenericAlternate **obj, size_t size,
|
||||||
bool promote_int, Error **errp)
|
Error **errp)
|
||||||
{
|
{
|
||||||
Error *err = NULL;
|
Error *err = NULL;
|
||||||
|
|
||||||
assert(obj && size >= sizeof(GenericAlternate));
|
assert(obj && size >= sizeof(GenericAlternate));
|
||||||
assert(!(v->type & VISITOR_OUTPUT) || *obj);
|
assert(!(v->type & VISITOR_OUTPUT) || *obj);
|
||||||
trace_visit_start_alternate(v, name, obj, size, promote_int);
|
trace_visit_start_alternate(v, name, obj, size);
|
||||||
if (v->start_alternate) {
|
if (v->start_alternate) {
|
||||||
v->start_alternate(v, name, obj, size, promote_int, &err);
|
v->start_alternate(v, name, obj, size, &err);
|
||||||
}
|
}
|
||||||
if (v->type & VISITOR_INPUT) {
|
if (v->type & VISITOR_INPUT) {
|
||||||
assert(v->start_alternate && !err != !*obj);
|
assert(v->start_alternate && !err != !*obj);
|
||||||
|
|||||||
@@ -367,7 +367,7 @@ static void qobject_input_end_list(Visitor *v, void **obj)
|
|||||||
|
|
||||||
static void qobject_input_start_alternate(Visitor *v, const char *name,
|
static void qobject_input_start_alternate(Visitor *v, const char *name,
|
||||||
GenericAlternate **obj, size_t size,
|
GenericAlternate **obj, size_t size,
|
||||||
bool promote_int, Error **errp)
|
Error **errp)
|
||||||
{
|
{
|
||||||
QObjectInputVisitor *qiv = to_qiv(v);
|
QObjectInputVisitor *qiv = to_qiv(v);
|
||||||
QObject *qobj = qobject_input_get_object(qiv, name, false, errp);
|
QObject *qobj = qobject_input_get_object(qiv, name, false, errp);
|
||||||
@@ -378,9 +378,6 @@ static void qobject_input_start_alternate(Visitor *v, const char *name,
|
|||||||
}
|
}
|
||||||
*obj = g_malloc0(size);
|
*obj = g_malloc0(size);
|
||||||
(*obj)->type = qobject_type(qobj);
|
(*obj)->type = qobject_type(qobj);
|
||||||
if (promote_int && (*obj)->type == QTYPE_QINT) {
|
|
||||||
(*obj)->type = QTYPE_QFLOAT;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void qobject_input_type_int64(Visitor *v, const char *name, int64_t *obj,
|
static void qobject_input_type_int64(Visitor *v, const char *name, int64_t *obj,
|
||||||
@@ -388,22 +385,18 @@ static void qobject_input_type_int64(Visitor *v, const char *name, int64_t *obj,
|
|||||||
{
|
{
|
||||||
QObjectInputVisitor *qiv = to_qiv(v);
|
QObjectInputVisitor *qiv = to_qiv(v);
|
||||||
QObject *qobj = qobject_input_get_object(qiv, name, true, errp);
|
QObject *qobj = qobject_input_get_object(qiv, name, true, errp);
|
||||||
QInt *qint;
|
QNum *qnum;
|
||||||
|
|
||||||
if (!qobj) {
|
if (!qobj) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
qint = qobject_to_qint(qobj);
|
qnum = qobject_to_qnum(qobj);
|
||||||
if (!qint) {
|
if (!qnum || !qnum_get_try_int(qnum, obj)) {
|
||||||
error_setg(errp, QERR_INVALID_PARAMETER_TYPE,
|
error_setg(errp, QERR_INVALID_PARAMETER_TYPE,
|
||||||
full_name(qiv, name), "integer");
|
full_name(qiv, name), "integer");
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
*obj = qint_get_int(qint);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static void qobject_input_type_int64_keyval(Visitor *v, const char *name,
|
static void qobject_input_type_int64_keyval(Visitor *v, const char *name,
|
||||||
int64_t *obj, Error **errp)
|
int64_t *obj, Error **errp)
|
||||||
{
|
{
|
||||||
@@ -424,22 +417,32 @@ static void qobject_input_type_int64_keyval(Visitor *v, const char *name,
|
|||||||
static void qobject_input_type_uint64(Visitor *v, const char *name,
|
static void qobject_input_type_uint64(Visitor *v, const char *name,
|
||||||
uint64_t *obj, Error **errp)
|
uint64_t *obj, Error **errp)
|
||||||
{
|
{
|
||||||
/* FIXME: qobject_to_qint mishandles values over INT64_MAX */
|
|
||||||
QObjectInputVisitor *qiv = to_qiv(v);
|
QObjectInputVisitor *qiv = to_qiv(v);
|
||||||
QObject *qobj = qobject_input_get_object(qiv, name, true, errp);
|
QObject *qobj = qobject_input_get_object(qiv, name, true, errp);
|
||||||
QInt *qint;
|
QNum *qnum;
|
||||||
|
int64_t val;
|
||||||
|
|
||||||
if (!qobj) {
|
if (!qobj) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
qint = qobject_to_qint(qobj);
|
qnum = qobject_to_qnum(qobj);
|
||||||
if (!qint) {
|
if (!qnum) {
|
||||||
error_setg(errp, QERR_INVALID_PARAMETER_TYPE,
|
goto err;
|
||||||
full_name(qiv, name), "integer");
|
}
|
||||||
|
|
||||||
|
if (qnum_get_try_uint(qnum, obj)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
*obj = qint_get_int(qint);
|
/* Need to accept negative values for backward compatibility */
|
||||||
|
if (qnum_get_try_int(qnum, &val)) {
|
||||||
|
*obj = val;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
err:
|
||||||
|
error_setg(errp, QERR_INVALID_PARAMETER_VALUE,
|
||||||
|
full_name(qiv, name), "uint64");
|
||||||
}
|
}
|
||||||
|
|
||||||
static void qobject_input_type_uint64_keyval(Visitor *v, const char *name,
|
static void qobject_input_type_uint64_keyval(Visitor *v, const char *name,
|
||||||
@@ -534,26 +537,19 @@ static void qobject_input_type_number(Visitor *v, const char *name, double *obj,
|
|||||||
{
|
{
|
||||||
QObjectInputVisitor *qiv = to_qiv(v);
|
QObjectInputVisitor *qiv = to_qiv(v);
|
||||||
QObject *qobj = qobject_input_get_object(qiv, name, true, errp);
|
QObject *qobj = qobject_input_get_object(qiv, name, true, errp);
|
||||||
QInt *qint;
|
QNum *qnum;
|
||||||
QFloat *qfloat;
|
|
||||||
|
|
||||||
if (!qobj) {
|
if (!qobj) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
qint = qobject_to_qint(qobj);
|
qnum = qobject_to_qnum(qobj);
|
||||||
if (qint) {
|
if (!qnum) {
|
||||||
*obj = qint_get_int(qobject_to_qint(qobj));
|
error_setg(errp, QERR_INVALID_PARAMETER_TYPE,
|
||||||
|
full_name(qiv, name), "number");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
qfloat = qobject_to_qfloat(qobj);
|
*obj = qnum_get_double(qnum);
|
||||||
if (qfloat) {
|
|
||||||
*obj = qfloat_get_double(qobject_to_qfloat(qobj));
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
error_setg(errp, QERR_INVALID_PARAMETER_TYPE,
|
|
||||||
full_name(qiv, name), "number");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void qobject_input_type_number_keyval(Visitor *v, const char *name,
|
static void qobject_input_type_number_keyval(Visitor *v, const char *name,
|
||||||
|
|||||||
@@ -144,15 +144,14 @@ static void qobject_output_type_int64(Visitor *v, const char *name,
|
|||||||
int64_t *obj, Error **errp)
|
int64_t *obj, Error **errp)
|
||||||
{
|
{
|
||||||
QObjectOutputVisitor *qov = to_qov(v);
|
QObjectOutputVisitor *qov = to_qov(v);
|
||||||
qobject_output_add(qov, name, qint_from_int(*obj));
|
qobject_output_add(qov, name, qnum_from_int(*obj));
|
||||||
}
|
}
|
||||||
|
|
||||||
static void qobject_output_type_uint64(Visitor *v, const char *name,
|
static void qobject_output_type_uint64(Visitor *v, const char *name,
|
||||||
uint64_t *obj, Error **errp)
|
uint64_t *obj, Error **errp)
|
||||||
{
|
{
|
||||||
/* FIXME values larger than INT64_MAX become negative */
|
|
||||||
QObjectOutputVisitor *qov = to_qov(v);
|
QObjectOutputVisitor *qov = to_qov(v);
|
||||||
qobject_output_add(qov, name, qint_from_int(*obj));
|
qobject_output_add(qov, name, qnum_from_uint(*obj));
|
||||||
}
|
}
|
||||||
|
|
||||||
static void qobject_output_type_bool(Visitor *v, const char *name, bool *obj,
|
static void qobject_output_type_bool(Visitor *v, const char *name, bool *obj,
|
||||||
@@ -177,7 +176,7 @@ static void qobject_output_type_number(Visitor *v, const char *name,
|
|||||||
double *obj, Error **errp)
|
double *obj, Error **errp)
|
||||||
{
|
{
|
||||||
QObjectOutputVisitor *qov = to_qov(v);
|
QObjectOutputVisitor *qov = to_qov(v);
|
||||||
qobject_output_add(qov, name, qfloat_from_double(*obj));
|
qobject_output_add(qov, name, qnum_from_double(*obj));
|
||||||
}
|
}
|
||||||
|
|
||||||
static void qobject_output_type_any(Visitor *v, const char *name,
|
static void qobject_output_type_any(Visitor *v, const char *name,
|
||||||
|
|||||||
@@ -11,7 +11,7 @@ visit_next_list(void *v, void *tail, size_t size) "v=%p tail=%p size=%zu"
|
|||||||
visit_check_list(void *v) "v=%p"
|
visit_check_list(void *v) "v=%p"
|
||||||
visit_end_list(void *v, void *obj) "v=%p obj=%p"
|
visit_end_list(void *v, void *obj) "v=%p obj=%p"
|
||||||
|
|
||||||
visit_start_alternate(void *v, const char *name, void *obj, size_t size, bool promote_int) "v=%p name=%s obj=%p size=%zu promote_int=%d"
|
visit_start_alternate(void *v, const char *name, void *obj, size_t size) "v=%p name=%s obj=%p size=%zu"
|
||||||
visit_end_alternate(void *v, void *obj) "v=%p obj=%p"
|
visit_end_alternate(void *v, void *obj) "v=%p obj=%p"
|
||||||
|
|
||||||
visit_optional(void *v, const char *name, bool *present) "v=%p name=%s present=%p"
|
visit_optional(void *v, const char *name, bool *present) "v=%p name=%s present=%p"
|
||||||
|
|||||||
@@ -485,7 +485,7 @@ int ga_parse_whence(GuestFileWhence *whence, Error **errp)
|
|||||||
{
|
{
|
||||||
/* Exploit the fact that we picked values to match QGA_SEEK_*. */
|
/* Exploit the fact that we picked values to match QGA_SEEK_*. */
|
||||||
if (whence->type == QTYPE_QSTRING) {
|
if (whence->type == QTYPE_QSTRING) {
|
||||||
whence->type = QTYPE_QINT;
|
whence->type = QTYPE_QNUM;
|
||||||
whence->u.value = whence->u.name;
|
whence->u.value = whence->u.name;
|
||||||
}
|
}
|
||||||
switch (whence->u.value) {
|
switch (whence->u.value) {
|
||||||
|
|||||||
@@ -19,7 +19,6 @@
|
|||||||
#endif
|
#endif
|
||||||
#include "qapi/qmp/json-streamer.h"
|
#include "qapi/qmp/json-streamer.h"
|
||||||
#include "qapi/qmp/json-parser.h"
|
#include "qapi/qmp/json-parser.h"
|
||||||
#include "qapi/qmp/qint.h"
|
|
||||||
#include "qapi/qmp/qjson.h"
|
#include "qapi/qmp/qjson.h"
|
||||||
#include "qga/guest-agent-core.h"
|
#include "qga/guest-agent-core.h"
|
||||||
#include "qemu/module.h"
|
#include "qemu/module.h"
|
||||||
|
|||||||
@@ -1,2 +1,2 @@
|
|||||||
util-obj-y = qnull.o qint.o qstring.o qdict.o qlist.o qfloat.o qbool.o
|
util-obj-y = qnull.o qnum.o qstring.o qdict.o qlist.o qbool.o
|
||||||
util-obj-y += qjson.o qobject.o json-lexer.o json-streamer.o json-parser.o
|
util-obj-y += qjson.o qobject.o json-lexer.o json-streamer.o json-parser.o
|
||||||
|
|||||||
@@ -227,15 +227,18 @@ static const uint8_t json_lexer[][256] = {
|
|||||||
/* escape */
|
/* escape */
|
||||||
[IN_ESCAPE_LL] = {
|
[IN_ESCAPE_LL] = {
|
||||||
['d'] = JSON_ESCAPE,
|
['d'] = JSON_ESCAPE,
|
||||||
|
['u'] = JSON_ESCAPE,
|
||||||
},
|
},
|
||||||
|
|
||||||
[IN_ESCAPE_L] = {
|
[IN_ESCAPE_L] = {
|
||||||
['d'] = JSON_ESCAPE,
|
['d'] = JSON_ESCAPE,
|
||||||
['l'] = IN_ESCAPE_LL,
|
['l'] = IN_ESCAPE_LL,
|
||||||
|
['u'] = JSON_ESCAPE,
|
||||||
},
|
},
|
||||||
|
|
||||||
[IN_ESCAPE_I64] = {
|
[IN_ESCAPE_I64] = {
|
||||||
['d'] = JSON_ESCAPE,
|
['d'] = JSON_ESCAPE,
|
||||||
|
['u'] = JSON_ESCAPE,
|
||||||
},
|
},
|
||||||
|
|
||||||
[IN_ESCAPE_I6] = {
|
[IN_ESCAPE_I6] = {
|
||||||
@@ -251,6 +254,7 @@ static const uint8_t json_lexer[][256] = {
|
|||||||
['i'] = JSON_ESCAPE,
|
['i'] = JSON_ESCAPE,
|
||||||
['p'] = JSON_ESCAPE,
|
['p'] = JSON_ESCAPE,
|
||||||
['s'] = JSON_ESCAPE,
|
['s'] = JSON_ESCAPE,
|
||||||
|
['u'] = JSON_ESCAPE,
|
||||||
['f'] = JSON_ESCAPE,
|
['f'] = JSON_ESCAPE,
|
||||||
['l'] = IN_ESCAPE_L,
|
['l'] = IN_ESCAPE_L,
|
||||||
['I'] = IN_ESCAPE_I,
|
['I'] = IN_ESCAPE_I,
|
||||||
|
|||||||
@@ -12,6 +12,7 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#include "qemu/osdep.h"
|
#include "qemu/osdep.h"
|
||||||
|
#include "qemu/cutils.h"
|
||||||
#include "qapi/error.h"
|
#include "qapi/error.h"
|
||||||
#include "qemu-common.h"
|
#include "qemu-common.h"
|
||||||
#include "qapi/qmp/types.h"
|
#include "qapi/qmp/types.h"
|
||||||
@@ -466,16 +467,23 @@ static QObject *parse_escape(JSONParserContext *ctxt, va_list *ap)
|
|||||||
} else if (!strcmp(token->str, "%i")) {
|
} else if (!strcmp(token->str, "%i")) {
|
||||||
return QOBJECT(qbool_from_bool(va_arg(*ap, int)));
|
return QOBJECT(qbool_from_bool(va_arg(*ap, int)));
|
||||||
} else if (!strcmp(token->str, "%d")) {
|
} else if (!strcmp(token->str, "%d")) {
|
||||||
return QOBJECT(qint_from_int(va_arg(*ap, int)));
|
return QOBJECT(qnum_from_int(va_arg(*ap, int)));
|
||||||
} else if (!strcmp(token->str, "%ld")) {
|
} else if (!strcmp(token->str, "%ld")) {
|
||||||
return QOBJECT(qint_from_int(va_arg(*ap, long)));
|
return QOBJECT(qnum_from_int(va_arg(*ap, long)));
|
||||||
} else if (!strcmp(token->str, "%lld") ||
|
} else if (!strcmp(token->str, "%lld") ||
|
||||||
!strcmp(token->str, "%I64d")) {
|
!strcmp(token->str, "%I64d")) {
|
||||||
return QOBJECT(qint_from_int(va_arg(*ap, long long)));
|
return QOBJECT(qnum_from_int(va_arg(*ap, long long)));
|
||||||
|
} else if (!strcmp(token->str, "%u")) {
|
||||||
|
return QOBJECT(qnum_from_uint(va_arg(*ap, unsigned int)));
|
||||||
|
} else if (!strcmp(token->str, "%lu")) {
|
||||||
|
return QOBJECT(qnum_from_uint(va_arg(*ap, unsigned long)));
|
||||||
|
} else if (!strcmp(token->str, "%llu") ||
|
||||||
|
!strcmp(token->str, "%I64u")) {
|
||||||
|
return QOBJECT(qnum_from_uint(va_arg(*ap, unsigned long long)));
|
||||||
} else if (!strcmp(token->str, "%s")) {
|
} else if (!strcmp(token->str, "%s")) {
|
||||||
return QOBJECT(qstring_from_str(va_arg(*ap, const char *)));
|
return QOBJECT(qstring_from_str(va_arg(*ap, const char *)));
|
||||||
} else if (!strcmp(token->str, "%f")) {
|
} else if (!strcmp(token->str, "%f")) {
|
||||||
return QOBJECT(qfloat_from_double(va_arg(*ap, double)));
|
return QOBJECT(qnum_from_double(va_arg(*ap, double)));
|
||||||
}
|
}
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
@@ -491,24 +499,34 @@ static QObject *parse_literal(JSONParserContext *ctxt)
|
|||||||
case JSON_STRING:
|
case JSON_STRING:
|
||||||
return QOBJECT(qstring_from_escaped_str(ctxt, token));
|
return QOBJECT(qstring_from_escaped_str(ctxt, token));
|
||||||
case JSON_INTEGER: {
|
case JSON_INTEGER: {
|
||||||
/* A possibility exists that this is a whole-valued float where the
|
/*
|
||||||
* fractional part was left out due to being 0 (.0). It's not a big
|
* Represent JSON_INTEGER as QNUM_I64 if possible, else as
|
||||||
* deal to treat these as ints in the parser, so long as users of the
|
* QNUM_U64, else as QNUM_DOUBLE. Note that qemu_strtoi64()
|
||||||
* resulting QObject know to expect a QInt in place of a QFloat in
|
* and qemu_strtou64() fail with ERANGE when it's not
|
||||||
* cases like these.
|
* possible.
|
||||||
*
|
*
|
||||||
* However, in some cases these values will overflow/underflow a
|
* qnum_get_int() will then work for any signed 64-bit
|
||||||
* QInt/int64 container, thus we should assume these are to be handled
|
* JSON_INTEGER, qnum_get_uint() for any unsigned 64-bit
|
||||||
* as QFloats/doubles rather than silently changing their values.
|
* integer, and qnum_get_double() both for any JSON_INTEGER
|
||||||
*
|
* and any JSON_FLOAT (with precision loss for integers beyond
|
||||||
* strtoll() indicates these instances by setting errno to ERANGE
|
* 53 bits)
|
||||||
*/
|
*/
|
||||||
|
int ret;
|
||||||
int64_t value;
|
int64_t value;
|
||||||
|
uint64_t uvalue;
|
||||||
|
|
||||||
errno = 0; /* strtoll doesn't set errno on success */
|
ret = qemu_strtoi64(token->str, NULL, 10, &value);
|
||||||
value = strtoll(token->str, NULL, 10);
|
if (!ret) {
|
||||||
if (errno != ERANGE) {
|
return QOBJECT(qnum_from_int(value));
|
||||||
return QOBJECT(qint_from_int(value));
|
}
|
||||||
|
assert(ret == -ERANGE);
|
||||||
|
|
||||||
|
if (token->str[0] != '-') {
|
||||||
|
ret = qemu_strtou64(token->str, NULL, 10, &uvalue);
|
||||||
|
if (!ret) {
|
||||||
|
return QOBJECT(qnum_from_uint(uvalue));
|
||||||
|
}
|
||||||
|
assert(ret == -ERANGE);
|
||||||
}
|
}
|
||||||
/* fall through to JSON_FLOAT */
|
/* fall through to JSON_FLOAT */
|
||||||
}
|
}
|
||||||
@@ -516,7 +534,7 @@ static QObject *parse_literal(JSONParserContext *ctxt)
|
|||||||
/* FIXME dependent on locale; a pervasive issue in QEMU */
|
/* FIXME dependent on locale; a pervasive issue in QEMU */
|
||||||
/* FIXME our lexer matches RFC 7159 in forbidding Inf or NaN,
|
/* FIXME our lexer matches RFC 7159 in forbidding Inf or NaN,
|
||||||
* but those might be useful extensions beyond JSON */
|
* but those might be useful extensions beyond JSON */
|
||||||
return QOBJECT(qfloat_from_double(strtod(token->str, NULL)));
|
return QOBJECT(qnum_from_double(strtod(token->str, NULL)));
|
||||||
default:
|
default:
|
||||||
abort();
|
abort();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -11,8 +11,7 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#include "qemu/osdep.h"
|
#include "qemu/osdep.h"
|
||||||
#include "qapi/qmp/qint.h"
|
#include "qapi/qmp/qnum.h"
|
||||||
#include "qapi/qmp/qfloat.h"
|
|
||||||
#include "qapi/qmp/qdict.h"
|
#include "qapi/qmp/qdict.h"
|
||||||
#include "qapi/qmp/qbool.h"
|
#include "qapi/qmp/qbool.h"
|
||||||
#include "qapi/qmp/qstring.h"
|
#include "qapi/qmp/qstring.h"
|
||||||
@@ -180,37 +179,26 @@ size_t qdict_size(const QDict *qdict)
|
|||||||
/**
|
/**
|
||||||
* qdict_get_double(): Get an number mapped by 'key'
|
* qdict_get_double(): Get an number mapped by 'key'
|
||||||
*
|
*
|
||||||
* This function assumes that 'key' exists and it stores a
|
* This function assumes that 'key' exists and it stores a QNum.
|
||||||
* QFloat or QInt object.
|
|
||||||
*
|
*
|
||||||
* Return number mapped by 'key'.
|
* Return number mapped by 'key'.
|
||||||
*/
|
*/
|
||||||
double qdict_get_double(const QDict *qdict, const char *key)
|
double qdict_get_double(const QDict *qdict, const char *key)
|
||||||
{
|
{
|
||||||
QObject *obj = qdict_get(qdict, key);
|
return qnum_get_double(qobject_to_qnum(qdict_get(qdict, key)));
|
||||||
|
|
||||||
assert(obj);
|
|
||||||
switch (qobject_type(obj)) {
|
|
||||||
case QTYPE_QFLOAT:
|
|
||||||
return qfloat_get_double(qobject_to_qfloat(obj));
|
|
||||||
case QTYPE_QINT:
|
|
||||||
return qint_get_int(qobject_to_qint(obj));
|
|
||||||
default:
|
|
||||||
abort();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* qdict_get_int(): Get an integer mapped by 'key'
|
* qdict_get_int(): Get an integer mapped by 'key'
|
||||||
*
|
*
|
||||||
* This function assumes that 'key' exists and it stores a
|
* This function assumes that 'key' exists and it stores a
|
||||||
* QInt object.
|
* QNum representable as int.
|
||||||
*
|
*
|
||||||
* Return integer mapped by 'key'.
|
* Return integer mapped by 'key'.
|
||||||
*/
|
*/
|
||||||
int64_t qdict_get_int(const QDict *qdict, const char *key)
|
int64_t qdict_get_int(const QDict *qdict, const char *key)
|
||||||
{
|
{
|
||||||
return qint_get_int(qobject_to_qint(qdict_get(qdict, key)));
|
return qnum_get_int(qobject_to_qnum(qdict_get(qdict, key)));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -259,16 +247,21 @@ const char *qdict_get_str(const QDict *qdict, const char *key)
|
|||||||
/**
|
/**
|
||||||
* qdict_get_try_int(): Try to get integer mapped by 'key'
|
* qdict_get_try_int(): Try to get integer mapped by 'key'
|
||||||
*
|
*
|
||||||
* Return integer mapped by 'key', if it is not present in
|
* Return integer mapped by 'key', if it is not present in the
|
||||||
* the dictionary or if the stored object is not of QInt type
|
* dictionary or if the stored object is not a QNum representing an
|
||||||
* 'def_value' will be returned.
|
* integer, 'def_value' will be returned.
|
||||||
*/
|
*/
|
||||||
int64_t qdict_get_try_int(const QDict *qdict, const char *key,
|
int64_t qdict_get_try_int(const QDict *qdict, const char *key,
|
||||||
int64_t def_value)
|
int64_t def_value)
|
||||||
{
|
{
|
||||||
QInt *qint = qobject_to_qint(qdict_get(qdict, key));
|
QNum *qnum = qobject_to_qnum(qdict_get(qdict, key));
|
||||||
|
int64_t val;
|
||||||
|
|
||||||
return qint ? qint_get_int(qint) : def_value;
|
if (!qnum || !qnum_get_try_int(qnum, &val)) {
|
||||||
|
return def_value;
|
||||||
|
}
|
||||||
|
|
||||||
|
return val;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -1,62 +0,0 @@
|
|||||||
/*
|
|
||||||
* QFloat Module
|
|
||||||
*
|
|
||||||
* Copyright IBM, Corp. 2009
|
|
||||||
*
|
|
||||||
* Authors:
|
|
||||||
* Anthony Liguori <aliguori@us.ibm.com>
|
|
||||||
*
|
|
||||||
* This work is licensed under the terms of the GNU LGPL, version 2.1 or later.
|
|
||||||
* See the COPYING.LIB file in the top-level directory.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "qemu/osdep.h"
|
|
||||||
#include "qapi/qmp/qfloat.h"
|
|
||||||
#include "qapi/qmp/qobject.h"
|
|
||||||
#include "qemu-common.h"
|
|
||||||
|
|
||||||
/**
|
|
||||||
* qfloat_from_int(): Create a new QFloat from a float
|
|
||||||
*
|
|
||||||
* Return strong reference.
|
|
||||||
*/
|
|
||||||
QFloat *qfloat_from_double(double value)
|
|
||||||
{
|
|
||||||
QFloat *qf;
|
|
||||||
|
|
||||||
qf = g_malloc(sizeof(*qf));
|
|
||||||
qobject_init(QOBJECT(qf), QTYPE_QFLOAT);
|
|
||||||
qf->value = value;
|
|
||||||
|
|
||||||
return qf;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* qfloat_get_double(): Get the stored float
|
|
||||||
*/
|
|
||||||
double qfloat_get_double(const QFloat *qf)
|
|
||||||
{
|
|
||||||
return qf->value;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* qobject_to_qfloat(): Convert a QObject into a QFloat
|
|
||||||
*/
|
|
||||||
QFloat *qobject_to_qfloat(const QObject *obj)
|
|
||||||
{
|
|
||||||
if (!obj || qobject_type(obj) != QTYPE_QFLOAT) {
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
return container_of(obj, QFloat, base);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* qfloat_destroy_obj(): Free all memory allocated by a
|
|
||||||
* QFloat object
|
|
||||||
*/
|
|
||||||
void qfloat_destroy_obj(QObject *obj)
|
|
||||||
{
|
|
||||||
assert(obj != NULL);
|
|
||||||
g_free(qobject_to_qfloat(obj));
|
|
||||||
}
|
|
||||||
@@ -1,61 +0,0 @@
|
|||||||
/*
|
|
||||||
* QInt Module
|
|
||||||
*
|
|
||||||
* Copyright (C) 2009 Red Hat Inc.
|
|
||||||
*
|
|
||||||
* Authors:
|
|
||||||
* Luiz Capitulino <lcapitulino@redhat.com>
|
|
||||||
*
|
|
||||||
* This work is licensed under the terms of the GNU LGPL, version 2.1 or later.
|
|
||||||
* See the COPYING.LIB file in the top-level directory.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "qemu/osdep.h"
|
|
||||||
#include "qapi/qmp/qint.h"
|
|
||||||
#include "qapi/qmp/qobject.h"
|
|
||||||
#include "qemu-common.h"
|
|
||||||
|
|
||||||
/**
|
|
||||||
* qint_from_int(): Create a new QInt from an int64_t
|
|
||||||
*
|
|
||||||
* Return strong reference.
|
|
||||||
*/
|
|
||||||
QInt *qint_from_int(int64_t value)
|
|
||||||
{
|
|
||||||
QInt *qi;
|
|
||||||
|
|
||||||
qi = g_malloc(sizeof(*qi));
|
|
||||||
qobject_init(QOBJECT(qi), QTYPE_QINT);
|
|
||||||
qi->value = value;
|
|
||||||
|
|
||||||
return qi;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* qint_get_int(): Get the stored integer
|
|
||||||
*/
|
|
||||||
int64_t qint_get_int(const QInt *qi)
|
|
||||||
{
|
|
||||||
return qi->value;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* qobject_to_qint(): Convert a QObject into a QInt
|
|
||||||
*/
|
|
||||||
QInt *qobject_to_qint(const QObject *obj)
|
|
||||||
{
|
|
||||||
if (!obj || qobject_type(obj) != QTYPE_QINT) {
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
return container_of(obj, QInt, base);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* qint_destroy_obj(): Free all memory allocated by a
|
|
||||||
* QInt object
|
|
||||||
*/
|
|
||||||
void qint_destroy_obj(QObject *obj)
|
|
||||||
{
|
|
||||||
assert(obj != NULL);
|
|
||||||
g_free(qobject_to_qint(obj));
|
|
||||||
}
|
|
||||||
@@ -132,12 +132,11 @@ static void to_json(const QObject *obj, QString *str, int pretty, int indent)
|
|||||||
case QTYPE_QNULL:
|
case QTYPE_QNULL:
|
||||||
qstring_append(str, "null");
|
qstring_append(str, "null");
|
||||||
break;
|
break;
|
||||||
case QTYPE_QINT: {
|
case QTYPE_QNUM: {
|
||||||
QInt *val = qobject_to_qint(obj);
|
QNum *val = qobject_to_qnum(obj);
|
||||||
char buffer[1024];
|
char *buffer = qnum_to_string(val);
|
||||||
|
|
||||||
snprintf(buffer, sizeof(buffer), "%" PRId64, qint_get_int(val));
|
|
||||||
qstring_append(str, buffer);
|
qstring_append(str, buffer);
|
||||||
|
g_free(buffer);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case QTYPE_QSTRING: {
|
case QTYPE_QSTRING: {
|
||||||
@@ -234,34 +233,6 @@ static void to_json(const QObject *obj, QString *str, int pretty, int indent)
|
|||||||
qstring_append(str, "]");
|
qstring_append(str, "]");
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case QTYPE_QFLOAT: {
|
|
||||||
QFloat *val = qobject_to_qfloat(obj);
|
|
||||||
char buffer[1024];
|
|
||||||
int len;
|
|
||||||
|
|
||||||
/* FIXME: snprintf() is locale dependent; but JSON requires
|
|
||||||
* numbers to be formatted as if in the C locale. Dependence
|
|
||||||
* on C locale is a pervasive issue in QEMU. */
|
|
||||||
/* FIXME: This risks printing Inf or NaN, which are not valid
|
|
||||||
* JSON values. */
|
|
||||||
/* FIXME: the default precision of 6 for %f often causes
|
|
||||||
* rounding errors; we should be using DBL_DECIMAL_DIG (17),
|
|
||||||
* and only rounding to a shorter number if the result would
|
|
||||||
* still produce the same floating point value. */
|
|
||||||
len = snprintf(buffer, sizeof(buffer), "%f", qfloat_get_double(val));
|
|
||||||
while (len > 0 && buffer[len - 1] == '0') {
|
|
||||||
len--;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (len && buffer[len - 1] == '.') {
|
|
||||||
buffer[len - 1] = 0;
|
|
||||||
} else {
|
|
||||||
buffer[len] = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
qstring_append(str, buffer);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case QTYPE_QBOOL: {
|
case QTYPE_QBOOL: {
|
||||||
QBool *val = qobject_to_qbool(obj);
|
QBool *val = qobject_to_qbool(obj);
|
||||||
|
|
||||||
|
|||||||
223
qobject/qnum.c
Normal file
223
qobject/qnum.c
Normal file
@@ -0,0 +1,223 @@
|
|||||||
|
/*
|
||||||
|
* QNum Module
|
||||||
|
*
|
||||||
|
* Copyright (C) 2009 Red Hat Inc.
|
||||||
|
*
|
||||||
|
* Authors:
|
||||||
|
* Luiz Capitulino <lcapitulino@redhat.com>
|
||||||
|
* Anthony Liguori <aliguori@us.ibm.com>
|
||||||
|
* Marc-André Lureau <marcandre.lureau@redhat.com>
|
||||||
|
*
|
||||||
|
* This work is licensed under the terms of the GNU LGPL, version 2.1 or later.
|
||||||
|
* See the COPYING.LIB file in the top-level directory.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "qemu/osdep.h"
|
||||||
|
#include "qapi/error.h"
|
||||||
|
#include "qapi/qmp/qnum.h"
|
||||||
|
#include "qapi/qmp/qobject.h"
|
||||||
|
#include "qemu-common.h"
|
||||||
|
|
||||||
|
/**
|
||||||
|
* qnum_from_int(): Create a new QNum from an int64_t
|
||||||
|
*
|
||||||
|
* Return strong reference.
|
||||||
|
*/
|
||||||
|
QNum *qnum_from_int(int64_t value)
|
||||||
|
{
|
||||||
|
QNum *qn = g_new(QNum, 1);
|
||||||
|
|
||||||
|
qobject_init(QOBJECT(qn), QTYPE_QNUM);
|
||||||
|
qn->kind = QNUM_I64;
|
||||||
|
qn->u.i64 = value;
|
||||||
|
|
||||||
|
return qn;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* qnum_from_uint(): Create a new QNum from an uint64_t
|
||||||
|
*
|
||||||
|
* Return strong reference.
|
||||||
|
*/
|
||||||
|
QNum *qnum_from_uint(uint64_t value)
|
||||||
|
{
|
||||||
|
QNum *qn = g_new(QNum, 1);
|
||||||
|
|
||||||
|
qobject_init(QOBJECT(qn), QTYPE_QNUM);
|
||||||
|
qn->kind = QNUM_U64;
|
||||||
|
qn->u.u64 = value;
|
||||||
|
|
||||||
|
return qn;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* qnum_from_double(): Create a new QNum from a double
|
||||||
|
*
|
||||||
|
* Return strong reference.
|
||||||
|
*/
|
||||||
|
QNum *qnum_from_double(double value)
|
||||||
|
{
|
||||||
|
QNum *qn = g_new(QNum, 1);
|
||||||
|
|
||||||
|
qobject_init(QOBJECT(qn), QTYPE_QNUM);
|
||||||
|
qn->kind = QNUM_DOUBLE;
|
||||||
|
qn->u.dbl = value;
|
||||||
|
|
||||||
|
return qn;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* qnum_get_try_int(): Get an integer representation of the number
|
||||||
|
*
|
||||||
|
* Return true on success.
|
||||||
|
*/
|
||||||
|
bool qnum_get_try_int(const QNum *qn, int64_t *val)
|
||||||
|
{
|
||||||
|
switch (qn->kind) {
|
||||||
|
case QNUM_I64:
|
||||||
|
*val = qn->u.i64;
|
||||||
|
return true;
|
||||||
|
case QNUM_U64:
|
||||||
|
if (qn->u.u64 > INT64_MAX) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
*val = qn->u.u64;
|
||||||
|
return true;
|
||||||
|
case QNUM_DOUBLE:
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
assert(0);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* qnum_get_int(): Get an integer representation of the number
|
||||||
|
*
|
||||||
|
* assert() on failure.
|
||||||
|
*/
|
||||||
|
int64_t qnum_get_int(const QNum *qn)
|
||||||
|
{
|
||||||
|
int64_t val;
|
||||||
|
bool success = qnum_get_try_int(qn, &val);
|
||||||
|
assert(success);
|
||||||
|
return val;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* qnum_get_uint(): Get an unsigned integer from the number
|
||||||
|
*
|
||||||
|
* Return true on success.
|
||||||
|
*/
|
||||||
|
bool qnum_get_try_uint(const QNum *qn, uint64_t *val)
|
||||||
|
{
|
||||||
|
switch (qn->kind) {
|
||||||
|
case QNUM_I64:
|
||||||
|
if (qn->u.i64 < 0) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
*val = qn->u.i64;
|
||||||
|
return true;
|
||||||
|
case QNUM_U64:
|
||||||
|
*val = qn->u.u64;
|
||||||
|
return true;
|
||||||
|
case QNUM_DOUBLE:
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
assert(0);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* qnum_get_uint(): Get an unsigned integer from the number
|
||||||
|
*
|
||||||
|
* assert() on failure.
|
||||||
|
*/
|
||||||
|
uint64_t qnum_get_uint(const QNum *qn)
|
||||||
|
{
|
||||||
|
uint64_t val;
|
||||||
|
bool success = qnum_get_try_uint(qn, &val);
|
||||||
|
assert(success);
|
||||||
|
return val;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* qnum_get_double(): Get a float representation of the number
|
||||||
|
*
|
||||||
|
* qnum_get_double() loses precision for integers beyond 53 bits.
|
||||||
|
*/
|
||||||
|
double qnum_get_double(QNum *qn)
|
||||||
|
{
|
||||||
|
switch (qn->kind) {
|
||||||
|
case QNUM_I64:
|
||||||
|
return qn->u.i64;
|
||||||
|
case QNUM_U64:
|
||||||
|
return qn->u.u64;
|
||||||
|
case QNUM_DOUBLE:
|
||||||
|
return qn->u.dbl;
|
||||||
|
}
|
||||||
|
|
||||||
|
assert(0);
|
||||||
|
return 0.0;
|
||||||
|
}
|
||||||
|
|
||||||
|
char *qnum_to_string(QNum *qn)
|
||||||
|
{
|
||||||
|
char *buffer;
|
||||||
|
int len;
|
||||||
|
|
||||||
|
switch (qn->kind) {
|
||||||
|
case QNUM_I64:
|
||||||
|
return g_strdup_printf("%" PRId64, qn->u.i64);
|
||||||
|
case QNUM_U64:
|
||||||
|
return g_strdup_printf("%" PRIu64, qn->u.u64);
|
||||||
|
case QNUM_DOUBLE:
|
||||||
|
/* FIXME: snprintf() is locale dependent; but JSON requires
|
||||||
|
* numbers to be formatted as if in the C locale. Dependence
|
||||||
|
* on C locale is a pervasive issue in QEMU. */
|
||||||
|
/* FIXME: This risks printing Inf or NaN, which are not valid
|
||||||
|
* JSON values. */
|
||||||
|
/* FIXME: the default precision of 6 for %f often causes
|
||||||
|
* rounding errors; we should be using DBL_DECIMAL_DIG (17),
|
||||||
|
* and only rounding to a shorter number if the result would
|
||||||
|
* still produce the same floating point value. */
|
||||||
|
buffer = g_strdup_printf("%f" , qn->u.dbl);
|
||||||
|
len = strlen(buffer);
|
||||||
|
while (len > 0 && buffer[len - 1] == '0') {
|
||||||
|
len--;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (len && buffer[len - 1] == '.') {
|
||||||
|
buffer[len - 1] = 0;
|
||||||
|
} else {
|
||||||
|
buffer[len] = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
return buffer;
|
||||||
|
}
|
||||||
|
|
||||||
|
assert(0);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* qobject_to_qnum(): Convert a QObject into a QNum
|
||||||
|
*/
|
||||||
|
QNum *qobject_to_qnum(const QObject *obj)
|
||||||
|
{
|
||||||
|
if (!obj || qobject_type(obj) != QTYPE_QNUM) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
return container_of(obj, QNum, base);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* qnum_destroy_obj(): Free all memory allocated by a
|
||||||
|
* QNum object
|
||||||
|
*/
|
||||||
|
void qnum_destroy_obj(QObject *obj)
|
||||||
|
{
|
||||||
|
assert(obj != NULL);
|
||||||
|
g_free(qobject_to_qnum(obj));
|
||||||
|
}
|
||||||
@@ -14,11 +14,10 @@
|
|||||||
static void (*qdestroy[QTYPE__MAX])(QObject *) = {
|
static void (*qdestroy[QTYPE__MAX])(QObject *) = {
|
||||||
[QTYPE_NONE] = NULL, /* No such object exists */
|
[QTYPE_NONE] = NULL, /* No such object exists */
|
||||||
[QTYPE_QNULL] = NULL, /* qnull_ is indestructible */
|
[QTYPE_QNULL] = NULL, /* qnull_ is indestructible */
|
||||||
[QTYPE_QINT] = qint_destroy_obj,
|
[QTYPE_QNUM] = qnum_destroy_obj,
|
||||||
[QTYPE_QSTRING] = qstring_destroy_obj,
|
[QTYPE_QSTRING] = qstring_destroy_obj,
|
||||||
[QTYPE_QDICT] = qdict_destroy_obj,
|
[QTYPE_QDICT] = qdict_destroy_obj,
|
||||||
[QTYPE_QLIST] = qlist_destroy_obj,
|
[QTYPE_QLIST] = qlist_destroy_obj,
|
||||||
[QTYPE_QFLOAT] = qfloat_destroy_obj,
|
|
||||||
[QTYPE_QBOOL] = qbool_destroy_obj,
|
[QTYPE_QBOOL] = qbool_destroy_obj,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
51
qom/object.c
51
qom/object.c
@@ -27,7 +27,6 @@
|
|||||||
#include "qom/qom-qobject.h"
|
#include "qom/qom-qobject.h"
|
||||||
#include "qapi/qmp/qobject.h"
|
#include "qapi/qmp/qobject.h"
|
||||||
#include "qapi/qmp/qbool.h"
|
#include "qapi/qmp/qbool.h"
|
||||||
#include "qapi/qmp/qint.h"
|
|
||||||
#include "qapi/qmp/qstring.h"
|
#include "qapi/qmp/qstring.h"
|
||||||
|
|
||||||
#define MAX_INTERFACES 32
|
#define MAX_INTERFACES 32
|
||||||
@@ -1122,7 +1121,7 @@ char *object_property_get_str(Object *obj, const char *name,
|
|||||||
retval = g_strdup(qstring_get_str(qstring));
|
retval = g_strdup(qstring_get_str(qstring));
|
||||||
}
|
}
|
||||||
|
|
||||||
QDECREF(qstring);
|
qobject_decref(ret);
|
||||||
return retval;
|
return retval;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1183,38 +1182,66 @@ bool object_property_get_bool(Object *obj, const char *name,
|
|||||||
retval = qbool_get_bool(qbool);
|
retval = qbool_get_bool(qbool);
|
||||||
}
|
}
|
||||||
|
|
||||||
QDECREF(qbool);
|
qobject_decref(ret);
|
||||||
return retval;
|
return retval;
|
||||||
}
|
}
|
||||||
|
|
||||||
void object_property_set_int(Object *obj, int64_t value,
|
void object_property_set_int(Object *obj, int64_t value,
|
||||||
const char *name, Error **errp)
|
const char *name, Error **errp)
|
||||||
{
|
{
|
||||||
QInt *qint = qint_from_int(value);
|
QNum *qnum = qnum_from_int(value);
|
||||||
object_property_set_qobject(obj, QOBJECT(qint), name, errp);
|
object_property_set_qobject(obj, QOBJECT(qnum), name, errp);
|
||||||
|
|
||||||
QDECREF(qint);
|
QDECREF(qnum);
|
||||||
}
|
}
|
||||||
|
|
||||||
int64_t object_property_get_int(Object *obj, const char *name,
|
int64_t object_property_get_int(Object *obj, const char *name,
|
||||||
Error **errp)
|
Error **errp)
|
||||||
{
|
{
|
||||||
QObject *ret = object_property_get_qobject(obj, name, errp);
|
QObject *ret = object_property_get_qobject(obj, name, errp);
|
||||||
QInt *qint;
|
QNum *qnum;
|
||||||
int64_t retval;
|
int64_t retval;
|
||||||
|
|
||||||
if (!ret) {
|
if (!ret) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
qint = qobject_to_qint(ret);
|
|
||||||
if (!qint) {
|
qnum = qobject_to_qnum(ret);
|
||||||
|
if (!qnum || !qnum_get_try_int(qnum, &retval)) {
|
||||||
error_setg(errp, QERR_INVALID_PARAMETER_TYPE, name, "int");
|
error_setg(errp, QERR_INVALID_PARAMETER_TYPE, name, "int");
|
||||||
retval = -1;
|
retval = -1;
|
||||||
} else {
|
|
||||||
retval = qint_get_int(qint);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
QDECREF(qint);
|
qobject_decref(ret);
|
||||||
|
return retval;
|
||||||
|
}
|
||||||
|
|
||||||
|
void object_property_set_uint(Object *obj, uint64_t value,
|
||||||
|
const char *name, Error **errp)
|
||||||
|
{
|
||||||
|
QNum *qnum = qnum_from_uint(value);
|
||||||
|
|
||||||
|
object_property_set_qobject(obj, QOBJECT(qnum), name, errp);
|
||||||
|
QDECREF(qnum);
|
||||||
|
}
|
||||||
|
|
||||||
|
uint64_t object_property_get_uint(Object *obj, const char *name,
|
||||||
|
Error **errp)
|
||||||
|
{
|
||||||
|
QObject *ret = object_property_get_qobject(obj, name, errp);
|
||||||
|
QNum *qnum;
|
||||||
|
uint64_t retval;
|
||||||
|
|
||||||
|
if (!ret) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
qnum = qobject_to_qnum(ret);
|
||||||
|
if (!qnum || !qnum_get_try_uint(qnum, &retval)) {
|
||||||
|
error_setg(errp, QERR_INVALID_PARAMETER_TYPE, name, "uint");
|
||||||
|
retval = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
qobject_decref(ret);
|
||||||
return retval;
|
return retval;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ expression Obj, Key, E;
|
|||||||
- qdict_put_obj(Obj, Key, QOBJECT(E));
|
- qdict_put_obj(Obj, Key, QOBJECT(E));
|
||||||
+ qdict_put(Obj, Key, E);
|
+ qdict_put(Obj, Key, E);
|
||||||
|
|
|
|
||||||
- qdict_put(Obj, Key, qint_from_int(E));
|
- qdict_put(Obj, Key, qnum_from_int(E));
|
||||||
+ qdict_put_int(Obj, Key, E);
|
+ qdict_put_int(Obj, Key, E);
|
||||||
|
|
|
|
||||||
- qdict_put(Obj, Key, qbool_from_bool(E));
|
- qdict_put(Obj, Key, qbool_from_bool(E));
|
||||||
@@ -24,7 +24,7 @@ expression Obj, E;
|
|||||||
- qlist_append_obj(Obj, QOBJECT(E));
|
- qlist_append_obj(Obj, QOBJECT(E));
|
||||||
+ qlist_append(Obj, E);
|
+ qlist_append(Obj, E);
|
||||||
|
|
|
|
||||||
- qlist_append(Obj, qint_from_int(E));
|
- qlist_append(Obj, qnum_from_int(E));
|
||||||
+ qlist_append_int(Obj, E);
|
+ qlist_append_int(Obj, E);
|
||||||
|
|
|
|
||||||
- qlist_append(Obj, qbool_from_bool(E));
|
- qlist_append(Obj, qbool_from_bool(E));
|
||||||
|
|||||||
@@ -161,20 +161,14 @@ void visit_type_%(c_name)s(Visitor *v, const char *name, %(c_name)s *obj, Error
|
|||||||
|
|
||||||
|
|
||||||
def gen_visit_alternate(name, variants):
|
def gen_visit_alternate(name, variants):
|
||||||
promote_int = 'true'
|
ret = mcgen('''
|
||||||
ret = ''
|
|
||||||
for var in variants.variants:
|
|
||||||
if var.type.alternate_qtype() == 'QTYPE_QINT':
|
|
||||||
promote_int = 'false'
|
|
||||||
|
|
||||||
ret += mcgen('''
|
|
||||||
|
|
||||||
void visit_type_%(c_name)s(Visitor *v, const char *name, %(c_name)s **obj, Error **errp)
|
void visit_type_%(c_name)s(Visitor *v, const char *name, %(c_name)s **obj, Error **errp)
|
||||||
{
|
{
|
||||||
Error *err = NULL;
|
Error *err = NULL;
|
||||||
|
|
||||||
visit_start_alternate(v, name, (GenericAlternate **)obj, sizeof(**obj),
|
visit_start_alternate(v, name, (GenericAlternate **)obj, sizeof(**obj),
|
||||||
%(promote_int)s, &err);
|
&err);
|
||||||
if (err) {
|
if (err) {
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
@@ -183,7 +177,7 @@ void visit_type_%(c_name)s(Visitor *v, const char *name, %(c_name)s **obj, Error
|
|||||||
}
|
}
|
||||||
switch ((*obj)->type) {
|
switch ((*obj)->type) {
|
||||||
''',
|
''',
|
||||||
c_name=c_name(name), promote_int=promote_int)
|
c_name=c_name(name))
|
||||||
|
|
||||||
for var in variants.variants:
|
for var in variants.variants:
|
||||||
ret += mcgen('''
|
ret += mcgen('''
|
||||||
|
|||||||
@@ -21,18 +21,18 @@ from ordereddict import OrderedDict
|
|||||||
|
|
||||||
builtin_types = {
|
builtin_types = {
|
||||||
'str': 'QTYPE_QSTRING',
|
'str': 'QTYPE_QSTRING',
|
||||||
'int': 'QTYPE_QINT',
|
'int': 'QTYPE_QNUM',
|
||||||
'number': 'QTYPE_QFLOAT',
|
'number': 'QTYPE_QNUM',
|
||||||
'bool': 'QTYPE_QBOOL',
|
'bool': 'QTYPE_QBOOL',
|
||||||
'int8': 'QTYPE_QINT',
|
'int8': 'QTYPE_QNUM',
|
||||||
'int16': 'QTYPE_QINT',
|
'int16': 'QTYPE_QNUM',
|
||||||
'int32': 'QTYPE_QINT',
|
'int32': 'QTYPE_QNUM',
|
||||||
'int64': 'QTYPE_QINT',
|
'int64': 'QTYPE_QNUM',
|
||||||
'uint8': 'QTYPE_QINT',
|
'uint8': 'QTYPE_QNUM',
|
||||||
'uint16': 'QTYPE_QINT',
|
'uint16': 'QTYPE_QNUM',
|
||||||
'uint32': 'QTYPE_QINT',
|
'uint32': 'QTYPE_QNUM',
|
||||||
'uint64': 'QTYPE_QINT',
|
'uint64': 'QTYPE_QNUM',
|
||||||
'size': 'QTYPE_QINT',
|
'size': 'QTYPE_QNUM',
|
||||||
'any': None, # any QType possible, actually
|
'any': None, # any QType possible, actually
|
||||||
'QType': 'QTYPE_QSTRING',
|
'QType': 'QTYPE_QSTRING',
|
||||||
}
|
}
|
||||||
@@ -820,11 +820,9 @@ def check_alternate(expr, info):
|
|||||||
if v in ['on', 'off']:
|
if v in ['on', 'off']:
|
||||||
conflicting.add('QTYPE_QBOOL')
|
conflicting.add('QTYPE_QBOOL')
|
||||||
if re.match(r'[-+0-9.]', v): # lazy, could be tightened
|
if re.match(r'[-+0-9.]', v): # lazy, could be tightened
|
||||||
conflicting.add('QTYPE_QINT')
|
conflicting.add('QTYPE_QNUM')
|
||||||
conflicting.add('QTYPE_QFLOAT')
|
|
||||||
else:
|
else:
|
||||||
conflicting.add('QTYPE_QINT')
|
conflicting.add('QTYPE_QNUM')
|
||||||
conflicting.add('QTYPE_QFLOAT')
|
|
||||||
conflicting.add('QTYPE_QBOOL')
|
conflicting.add('QTYPE_QBOOL')
|
||||||
if conflicting & set(types_seen):
|
if conflicting & set(types_seen):
|
||||||
raise QAPISemError(info, "Alternate '%s' member '%s' can't "
|
raise QAPISemError(info, "Alternate '%s' member '%s' can't "
|
||||||
@@ -1059,8 +1057,8 @@ class QAPISchemaType(QAPISchemaEntity):
|
|||||||
def alternate_qtype(self):
|
def alternate_qtype(self):
|
||||||
json2qtype = {
|
json2qtype = {
|
||||||
'string': 'QTYPE_QSTRING',
|
'string': 'QTYPE_QSTRING',
|
||||||
'number': 'QTYPE_QFLOAT',
|
'number': 'QTYPE_QNUM',
|
||||||
'int': 'QTYPE_QINT',
|
'int': 'QTYPE_QNUM',
|
||||||
'boolean': 'QTYPE_QBOOL',
|
'boolean': 'QTYPE_QBOOL',
|
||||||
'object': 'QTYPE_QDICT'
|
'object': 'QTYPE_QDICT'
|
||||||
}
|
}
|
||||||
@@ -1522,9 +1520,9 @@ class QAPISchema(object):
|
|||||||
self.the_empty_object_type = QAPISchemaObjectType(
|
self.the_empty_object_type = QAPISchemaObjectType(
|
||||||
'q_empty', None, None, None, [], None)
|
'q_empty', None, None, None, [], None)
|
||||||
self._def_entity(self.the_empty_object_type)
|
self._def_entity(self.the_empty_object_type)
|
||||||
qtype_values = self._make_enum_members(['none', 'qnull', 'qint',
|
qtype_values = self._make_enum_members(['none', 'qnull', 'qnum',
|
||||||
'qstring', 'qdict', 'qlist',
|
'qstring', 'qdict', 'qlist',
|
||||||
'qfloat', 'qbool'])
|
'qbool'])
|
||||||
self._def_entity(QAPISchemaEnumType('QType', None, None,
|
self._def_entity(QAPISchemaEnumType('QType', None, None,
|
||||||
qtype_values, 'QTYPE'))
|
qtype_values, 'QTYPE'))
|
||||||
|
|
||||||
|
|||||||
@@ -84,6 +84,7 @@ typedef enum {
|
|||||||
the PC (for whatever reason), so there's no need to do it again on
|
the PC (for whatever reason), so there's no need to do it again on
|
||||||
exiting the TB. */
|
exiting the TB. */
|
||||||
EXIT_PC_UPDATED,
|
EXIT_PC_UPDATED,
|
||||||
|
EXIT_PC_UPDATED_NOCHAIN,
|
||||||
|
|
||||||
/* We are exiting the TB, but have neither emitted a goto_tb, nor
|
/* We are exiting the TB, but have neither emitted a goto_tb, nor
|
||||||
updated the PC for the next instruction to be executed. */
|
updated the PC for the next instruction to be executed. */
|
||||||
@@ -458,11 +459,17 @@ static bool in_superpage(DisasContext *ctx, int64_t addr)
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static bool use_exit_tb(DisasContext *ctx)
|
||||||
|
{
|
||||||
|
return ((ctx->tb->cflags & CF_LAST_IO)
|
||||||
|
|| ctx->singlestep_enabled
|
||||||
|
|| singlestep);
|
||||||
|
}
|
||||||
|
|
||||||
static bool use_goto_tb(DisasContext *ctx, uint64_t dest)
|
static bool use_goto_tb(DisasContext *ctx, uint64_t dest)
|
||||||
{
|
{
|
||||||
/* Suppress goto_tb in the case of single-steping and IO. */
|
/* Suppress goto_tb in the case of single-steping and IO. */
|
||||||
if ((ctx->tb->cflags & CF_LAST_IO)
|
if (unlikely(use_exit_tb(ctx))) {
|
||||||
|| ctx->singlestep_enabled || singlestep) {
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
#ifndef CONFIG_USER_ONLY
|
#ifndef CONFIG_USER_ONLY
|
||||||
@@ -1198,7 +1205,10 @@ static ExitStatus gen_call_pal(DisasContext *ctx, int palcode)
|
|||||||
tcg_gen_andi_i64(tmp, ctx->ir[IR_A0], PS_INT_MASK);
|
tcg_gen_andi_i64(tmp, ctx->ir[IR_A0], PS_INT_MASK);
|
||||||
tcg_gen_st8_i64(tmp, cpu_env, offsetof(CPUAlphaState, ps));
|
tcg_gen_st8_i64(tmp, cpu_env, offsetof(CPUAlphaState, ps));
|
||||||
tcg_temp_free(tmp);
|
tcg_temp_free(tmp);
|
||||||
break;
|
|
||||||
|
/* Allow interrupts to be recognized right away. */
|
||||||
|
tcg_gen_movi_i64(cpu_pc, ctx->pc);
|
||||||
|
return EXIT_PC_UPDATED_NOCHAIN;
|
||||||
|
|
||||||
case 0x36:
|
case 0x36:
|
||||||
/* RDPS */
|
/* RDPS */
|
||||||
@@ -1266,7 +1276,7 @@ static ExitStatus gen_call_pal(DisasContext *ctx, int palcode)
|
|||||||
need the page permissions check. We'll see the existence of
|
need the page permissions check. We'll see the existence of
|
||||||
the page when we create the TB, and we'll flush all TBs if
|
the page when we create the TB, and we'll flush all TBs if
|
||||||
we change the PAL base register. */
|
we change the PAL base register. */
|
||||||
if (!ctx->singlestep_enabled && !(ctx->tb->cflags & CF_LAST_IO)) {
|
if (!use_exit_tb(ctx)) {
|
||||||
tcg_gen_goto_tb(0);
|
tcg_gen_goto_tb(0);
|
||||||
tcg_gen_movi_i64(cpu_pc, entry);
|
tcg_gen_movi_i64(cpu_pc, entry);
|
||||||
tcg_gen_exit_tb((uintptr_t)ctx->tb);
|
tcg_gen_exit_tb((uintptr_t)ctx->tb);
|
||||||
@@ -2686,7 +2696,8 @@ static ExitStatus translate_one(DisasContext *ctx, uint32_t insn)
|
|||||||
tcg_gen_andi_i64(tmp, vb, 1);
|
tcg_gen_andi_i64(tmp, vb, 1);
|
||||||
tcg_gen_st8_i64(tmp, cpu_env, offsetof(CPUAlphaState, pal_mode));
|
tcg_gen_st8_i64(tmp, cpu_env, offsetof(CPUAlphaState, pal_mode));
|
||||||
tcg_gen_andi_i64(cpu_pc, vb, ~3);
|
tcg_gen_andi_i64(cpu_pc, vb, ~3);
|
||||||
ret = EXIT_PC_UPDATED;
|
/* Allow interrupts to be recognized right away. */
|
||||||
|
ret = EXIT_PC_UPDATED_NOCHAIN;
|
||||||
break;
|
break;
|
||||||
#else
|
#else
|
||||||
goto invalid_opc;
|
goto invalid_opc;
|
||||||
@@ -3010,6 +3021,12 @@ void gen_intermediate_code(CPUAlphaState *env, struct TranslationBlock *tb)
|
|||||||
tcg_gen_movi_i64(cpu_pc, ctx.pc);
|
tcg_gen_movi_i64(cpu_pc, ctx.pc);
|
||||||
/* FALLTHRU */
|
/* FALLTHRU */
|
||||||
case EXIT_PC_UPDATED:
|
case EXIT_PC_UPDATED:
|
||||||
|
if (!use_exit_tb(&ctx)) {
|
||||||
|
tcg_gen_lookup_and_goto_ptr(cpu_pc);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
/* FALLTHRU */
|
||||||
|
case EXIT_PC_UPDATED_NOCHAIN:
|
||||||
if (ctx.singlestep_enabled) {
|
if (ctx.singlestep_enabled) {
|
||||||
gen_excp_1(EXCP_DEBUG, 0);
|
gen_excp_1(EXCP_DEBUG, 0);
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
@@ -1422,7 +1422,9 @@ static void handle_msr_i(DisasContext *s, uint32_t insn,
|
|||||||
gen_helper_msr_i_pstate(cpu_env, tcg_op, tcg_imm);
|
gen_helper_msr_i_pstate(cpu_env, tcg_op, tcg_imm);
|
||||||
tcg_temp_free_i32(tcg_imm);
|
tcg_temp_free_i32(tcg_imm);
|
||||||
tcg_temp_free_i32(tcg_op);
|
tcg_temp_free_i32(tcg_op);
|
||||||
s->is_jmp = DISAS_UPDATE;
|
/* For DAIFClear, exit the cpu loop to re-evaluate pending IRQs. */
|
||||||
|
gen_a64_set_pc_im(s->pc);
|
||||||
|
s->is_jmp = (op == 0x1f ? DISAS_EXIT : DISAS_JUMP);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
default:
|
default:
|
||||||
@@ -11369,6 +11371,9 @@ void gen_intermediate_code_a64(ARMCPU *cpu, TranslationBlock *tb)
|
|||||||
case DISAS_JUMP:
|
case DISAS_JUMP:
|
||||||
tcg_gen_lookup_and_goto_ptr(cpu_pc);
|
tcg_gen_lookup_and_goto_ptr(cpu_pc);
|
||||||
break;
|
break;
|
||||||
|
case DISAS_EXIT:
|
||||||
|
tcg_gen_exit_tb(0);
|
||||||
|
break;
|
||||||
case DISAS_TB_JUMP:
|
case DISAS_TB_JUMP:
|
||||||
case DISAS_EXC:
|
case DISAS_EXC:
|
||||||
case DISAS_SWI:
|
case DISAS_SWI:
|
||||||
|
|||||||
@@ -29,11 +29,7 @@
|
|||||||
#include "qemu/option.h"
|
#include "qemu/option.h"
|
||||||
#include "qemu/config-file.h"
|
#include "qemu/config-file.h"
|
||||||
#include "qapi/qmp/qerror.h"
|
#include "qapi/qmp/qerror.h"
|
||||||
#include "qapi/qmp/qstring.h"
|
#include "qapi/qmp/types.h"
|
||||||
#include "qapi/qmp/qdict.h"
|
|
||||||
#include "qapi/qmp/qbool.h"
|
|
||||||
#include "qapi/qmp/qint.h"
|
|
||||||
#include "qapi/qmp/qfloat.h"
|
|
||||||
|
|
||||||
#include "qapi-types.h"
|
#include "qapi-types.h"
|
||||||
#include "qapi-visit.h"
|
#include "qapi-visit.h"
|
||||||
@@ -2328,8 +2324,8 @@ static void x86_cpu_load_def(X86CPU *cpu, X86CPUDefinition *def, Error **errp)
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
/* CPU models only set _minimum_ values for level/xlevel: */
|
/* CPU models only set _minimum_ values for level/xlevel: */
|
||||||
object_property_set_int(OBJECT(cpu), def->level, "min-level", errp);
|
object_property_set_uint(OBJECT(cpu), def->level, "min-level", errp);
|
||||||
object_property_set_int(OBJECT(cpu), def->xlevel, "min-xlevel", errp);
|
object_property_set_uint(OBJECT(cpu), def->xlevel, "min-xlevel", errp);
|
||||||
|
|
||||||
object_property_set_int(OBJECT(cpu), def->family, "family", errp);
|
object_property_set_int(OBJECT(cpu), def->family, "family", errp);
|
||||||
object_property_set_int(OBJECT(cpu), def->model, "model", errp);
|
object_property_set_int(OBJECT(cpu), def->model, "model", errp);
|
||||||
|
|||||||
@@ -1173,6 +1173,8 @@ typedef enum {
|
|||||||
/* We are exiting the TB, but have neither emitted a goto_tb, nor
|
/* We are exiting the TB, but have neither emitted a goto_tb, nor
|
||||||
updated the PC for the next instruction to be executed. */
|
updated the PC for the next instruction to be executed. */
|
||||||
EXIT_PC_STALE,
|
EXIT_PC_STALE,
|
||||||
|
/* We are exiting the TB to the main loop. */
|
||||||
|
EXIT_PC_STALE_NOCHAIN,
|
||||||
/* We are ending the TB with a noreturn function call, e.g. longjmp.
|
/* We are ending the TB with a noreturn function call, e.g. longjmp.
|
||||||
No following code will be executed. */
|
No following code will be executed. */
|
||||||
EXIT_NORETURN,
|
EXIT_NORETURN,
|
||||||
@@ -3795,7 +3797,8 @@ static ExitStatus op_ssm(DisasContext *s, DisasOps *o)
|
|||||||
{
|
{
|
||||||
check_privileged(s);
|
check_privileged(s);
|
||||||
tcg_gen_deposit_i64(psw_mask, psw_mask, o->in2, 56, 8);
|
tcg_gen_deposit_i64(psw_mask, psw_mask, o->in2, 56, 8);
|
||||||
return NO_EXIT;
|
/* Exit to main loop to reevaluate s390_cpu_exec_interrupt. */
|
||||||
|
return EXIT_PC_STALE_NOCHAIN;
|
||||||
}
|
}
|
||||||
|
|
||||||
static ExitStatus op_stap(DisasContext *s, DisasOps *o)
|
static ExitStatus op_stap(DisasContext *s, DisasOps *o)
|
||||||
@@ -4038,7 +4041,9 @@ static ExitStatus op_stnosm(DisasContext *s, DisasOps *o)
|
|||||||
} else {
|
} else {
|
||||||
tcg_gen_ori_i64(psw_mask, psw_mask, i2 << 56);
|
tcg_gen_ori_i64(psw_mask, psw_mask, i2 << 56);
|
||||||
}
|
}
|
||||||
return NO_EXIT;
|
|
||||||
|
/* Exit to main loop to reevaluate s390_cpu_exec_interrupt. */
|
||||||
|
return EXIT_PC_STALE_NOCHAIN;
|
||||||
}
|
}
|
||||||
|
|
||||||
static ExitStatus op_stura(DisasContext *s, DisasOps *o)
|
static ExitStatus op_stura(DisasContext *s, DisasOps *o)
|
||||||
@@ -5788,6 +5793,7 @@ void gen_intermediate_code(CPUS390XState *env, struct TranslationBlock *tb)
|
|||||||
case EXIT_NORETURN:
|
case EXIT_NORETURN:
|
||||||
break;
|
break;
|
||||||
case EXIT_PC_STALE:
|
case EXIT_PC_STALE:
|
||||||
|
case EXIT_PC_STALE_NOCHAIN:
|
||||||
update_psw_addr(&dc);
|
update_psw_addr(&dc);
|
||||||
/* FALLTHRU */
|
/* FALLTHRU */
|
||||||
case EXIT_PC_UPDATED:
|
case EXIT_PC_UPDATED:
|
||||||
@@ -5799,14 +5805,14 @@ void gen_intermediate_code(CPUS390XState *env, struct TranslationBlock *tb)
|
|||||||
/* Exit the TB, either by raising a debug exception or by return. */
|
/* Exit the TB, either by raising a debug exception or by return. */
|
||||||
if (do_debug) {
|
if (do_debug) {
|
||||||
gen_exception(EXCP_DEBUG);
|
gen_exception(EXCP_DEBUG);
|
||||||
} else if (use_exit_tb(&dc)) {
|
} else if (use_exit_tb(&dc) || status == EXIT_PC_STALE_NOCHAIN) {
|
||||||
tcg_gen_exit_tb(0);
|
tcg_gen_exit_tb(0);
|
||||||
} else {
|
} else {
|
||||||
tcg_gen_lookup_and_goto_ptr(psw_addr);
|
tcg_gen_lookup_and_goto_ptr(psw_addr);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
abort();
|
g_assert_not_reached();
|
||||||
}
|
}
|
||||||
|
|
||||||
gen_tb_end(tb, num_insns);
|
gen_tb_end(tb, num_insns);
|
||||||
|
|||||||
@@ -616,7 +616,12 @@ static void tcg_out_movi(TCGContext *s, TCGType type, TCGReg rd,
|
|||||||
/* Look for host pointer values within 4G of the PC. This happens
|
/* Look for host pointer values within 4G of the PC. This happens
|
||||||
often when loading pointers to QEMU's own data structures. */
|
often when loading pointers to QEMU's own data structures. */
|
||||||
if (type == TCG_TYPE_I64) {
|
if (type == TCG_TYPE_I64) {
|
||||||
tcg_target_long disp = (value >> 12) - ((intptr_t)s->code_ptr >> 12);
|
tcg_target_long disp = value - (intptr_t)s->code_ptr;
|
||||||
|
if (disp == sextract64(disp, 0, 21)) {
|
||||||
|
tcg_out_insn(s, 3406, ADR, rd, disp);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
disp = (value >> 12) - ((intptr_t)s->code_ptr >> 12);
|
||||||
if (disp == sextract64(disp, 0, 21)) {
|
if (disp == sextract64(disp, 0, 21)) {
|
||||||
tcg_out_insn(s, 3406, ADRP, rd, disp);
|
tcg_out_insn(s, 3406, ADRP, rd, disp);
|
||||||
if (value & 0xfff) {
|
if (value & 0xfff) {
|
||||||
|
|||||||
@@ -418,23 +418,37 @@ static inline void tcg_out_dat_imm(TCGContext *s,
|
|||||||
|
|
||||||
static void tcg_out_movi32(TCGContext *s, int cond, int rd, uint32_t arg)
|
static void tcg_out_movi32(TCGContext *s, int cond, int rd, uint32_t arg)
|
||||||
{
|
{
|
||||||
int rot, opc, rn;
|
int rot, opc, rn, diff;
|
||||||
|
|
||||||
/* For armv7, make sure not to use movw+movt when mov/mvn would do.
|
/* Check a single MOV/MVN before anything else. */
|
||||||
Speed things up by only checking when movt would be required.
|
rot = encode_imm(arg);
|
||||||
Prior to armv7, have one go at fully rotated immediates before
|
if (rot >= 0) {
|
||||||
doing the decomposition thing below. */
|
tcg_out_dat_imm(s, cond, ARITH_MOV, rd, 0,
|
||||||
if (!use_armv7_instructions || (arg & 0xffff0000)) {
|
rotl(arg, rot) | (rot << 7));
|
||||||
rot = encode_imm(arg);
|
return;
|
||||||
|
}
|
||||||
|
rot = encode_imm(~arg);
|
||||||
|
if (rot >= 0) {
|
||||||
|
tcg_out_dat_imm(s, cond, ARITH_MVN, rd, 0,
|
||||||
|
rotl(~arg, rot) | (rot << 7));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Check for a pc-relative address. This will usually be the TB,
|
||||||
|
or within the TB, which is immediately before the code block. */
|
||||||
|
diff = arg - ((intptr_t)s->code_ptr + 8);
|
||||||
|
if (diff >= 0) {
|
||||||
|
rot = encode_imm(diff);
|
||||||
if (rot >= 0) {
|
if (rot >= 0) {
|
||||||
tcg_out_dat_imm(s, cond, ARITH_MOV, rd, 0,
|
tcg_out_dat_imm(s, cond, ARITH_ADD, rd, TCG_REG_PC,
|
||||||
rotl(arg, rot) | (rot << 7));
|
rotl(diff, rot) | (rot << 7));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
rot = encode_imm(~arg);
|
} else {
|
||||||
|
rot = encode_imm(-diff);
|
||||||
if (rot >= 0) {
|
if (rot >= 0) {
|
||||||
tcg_out_dat_imm(s, cond, ARITH_MVN, rd, 0,
|
tcg_out_dat_imm(s, cond, ARITH_SUB, rd, TCG_REG_PC,
|
||||||
rotl(~arg, rot) | (rot << 7));
|
rotl(-diff, rot) | (rot << 7));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1026,16 +1040,6 @@ static void tcg_out_call(TCGContext *s, tcg_insn_unit *addr)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void arm_tb_set_jmp_target(uintptr_t jmp_addr, uintptr_t addr)
|
|
||||||
{
|
|
||||||
tcg_insn_unit *code_ptr = (tcg_insn_unit *)jmp_addr;
|
|
||||||
tcg_insn_unit *target = (tcg_insn_unit *)addr;
|
|
||||||
|
|
||||||
/* we could use a ldr pc, [pc, #-4] kind of branch and avoid the flush */
|
|
||||||
reloc_pc24_atomic(code_ptr, target);
|
|
||||||
flush_icache_range(jmp_addr, jmp_addr + 4);
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline void tcg_out_goto_label(TCGContext *s, int cond, TCGLabel *l)
|
static inline void tcg_out_goto_label(TCGContext *s, int cond, TCGLabel *l)
|
||||||
{
|
{
|
||||||
if (l->has_value) {
|
if (l->has_value) {
|
||||||
@@ -1665,17 +1669,27 @@ static inline void tcg_out_op(TCGContext *s, TCGOpcode opc,
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case INDEX_op_goto_tb:
|
case INDEX_op_goto_tb:
|
||||||
if (s->tb_jmp_insn_offset) {
|
{
|
||||||
/* Direct jump method */
|
|
||||||
s->tb_jmp_insn_offset[args[0]] = tcg_current_code_size(s);
|
|
||||||
tcg_out_b_noaddr(s, COND_AL);
|
|
||||||
} else {
|
|
||||||
/* Indirect jump method */
|
/* Indirect jump method */
|
||||||
intptr_t ptr = (intptr_t)(s->tb_jmp_target_addr + args[0]);
|
intptr_t ptr, dif, dil;
|
||||||
tcg_out_movi32(s, COND_AL, TCG_REG_R0, ptr & ~0xfff);
|
TCGReg base = TCG_REG_PC;
|
||||||
tcg_out_ld32_12(s, COND_AL, TCG_REG_PC, TCG_REG_R0, ptr & 0xfff);
|
|
||||||
|
tcg_debug_assert(s->tb_jmp_insn_offset == 0);
|
||||||
|
ptr = (intptr_t)(s->tb_jmp_target_addr + args[0]);
|
||||||
|
dif = ptr - ((intptr_t)s->code_ptr + 8);
|
||||||
|
dil = sextract32(dif, 0, 12);
|
||||||
|
if (dif != dil) {
|
||||||
|
/* The TB is close, but outside the 12 bits addressable by
|
||||||
|
the load. We can extend this to 20 bits with a sub of a
|
||||||
|
shifted immediate from pc. In the vastly unlikely event
|
||||||
|
the code requires more than 1MB, we'll use 2 insns and
|
||||||
|
be no worse off. */
|
||||||
|
base = TCG_REG_R0;
|
||||||
|
tcg_out_movi32(s, COND_AL, base, ptr - dil);
|
||||||
|
}
|
||||||
|
tcg_out_ld32_12(s, COND_AL, TCG_REG_PC, base, dil);
|
||||||
|
s->tb_jmp_reset_offset[args[0]] = tcg_current_code_size(s);
|
||||||
}
|
}
|
||||||
s->tb_jmp_reset_offset[args[0]] = tcg_current_code_size(s);
|
|
||||||
break;
|
break;
|
||||||
case INDEX_op_goto_ptr:
|
case INDEX_op_goto_ptr:
|
||||||
tcg_out_bx(s, COND_AL, args[0]);
|
tcg_out_bx(s, COND_AL, args[0]);
|
||||||
|
|||||||
@@ -2820,14 +2820,11 @@ void tcg_register_jit(void *buf, size_t buf_size)
|
|||||||
}
|
}
|
||||||
#endif /* __ELF__ */
|
#endif /* __ELF__ */
|
||||||
|
|
||||||
static size_t dcache_bsize = 16;
|
|
||||||
static size_t icache_bsize = 16;
|
|
||||||
|
|
||||||
void flush_icache_range(uintptr_t start, uintptr_t stop)
|
void flush_icache_range(uintptr_t start, uintptr_t stop)
|
||||||
{
|
{
|
||||||
uintptr_t p, start1, stop1;
|
uintptr_t p, start1, stop1;
|
||||||
size_t dsize = dcache_bsize;
|
size_t dsize = qemu_dcache_linesize;
|
||||||
size_t isize = icache_bsize;
|
size_t isize = qemu_icache_linesize;
|
||||||
|
|
||||||
start1 = start & ~(dsize - 1);
|
start1 = start & ~(dsize - 1);
|
||||||
stop1 = (stop + dsize - 1) & ~(dsize - 1);
|
stop1 = (stop + dsize - 1) & ~(dsize - 1);
|
||||||
@@ -2844,67 +2841,3 @@ void flush_icache_range(uintptr_t start, uintptr_t stop)
|
|||||||
asm volatile ("sync" : : : "memory");
|
asm volatile ("sync" : : : "memory");
|
||||||
asm volatile ("isync" : : : "memory");
|
asm volatile ("isync" : : : "memory");
|
||||||
}
|
}
|
||||||
|
|
||||||
#if defined _AIX
|
|
||||||
#include <sys/systemcfg.h>
|
|
||||||
|
|
||||||
static void __attribute__((constructor)) tcg_cache_init(void)
|
|
||||||
{
|
|
||||||
icache_bsize = _system_configuration.icache_line;
|
|
||||||
dcache_bsize = _system_configuration.dcache_line;
|
|
||||||
}
|
|
||||||
|
|
||||||
#elif defined __linux__
|
|
||||||
static void __attribute__((constructor)) tcg_cache_init(void)
|
|
||||||
{
|
|
||||||
unsigned long dsize = qemu_getauxval(AT_DCACHEBSIZE);
|
|
||||||
unsigned long isize = qemu_getauxval(AT_ICACHEBSIZE);
|
|
||||||
|
|
||||||
if (dsize == 0 || isize == 0) {
|
|
||||||
if (dsize == 0) {
|
|
||||||
fprintf(stderr, "getauxval AT_DCACHEBSIZE failed\n");
|
|
||||||
}
|
|
||||||
if (isize == 0) {
|
|
||||||
fprintf(stderr, "getauxval AT_ICACHEBSIZE failed\n");
|
|
||||||
}
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
dcache_bsize = dsize;
|
|
||||||
icache_bsize = isize;
|
|
||||||
}
|
|
||||||
|
|
||||||
#elif defined __APPLE__
|
|
||||||
#include <sys/sysctl.h>
|
|
||||||
|
|
||||||
static void __attribute__((constructor)) tcg_cache_init(void)
|
|
||||||
{
|
|
||||||
size_t len;
|
|
||||||
unsigned cacheline;
|
|
||||||
int name[2] = { CTL_HW, HW_CACHELINE };
|
|
||||||
|
|
||||||
len = sizeof(cacheline);
|
|
||||||
if (sysctl(name, 2, &cacheline, &len, NULL, 0)) {
|
|
||||||
perror("sysctl CTL_HW HW_CACHELINE failed");
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
dcache_bsize = cacheline;
|
|
||||||
icache_bsize = cacheline;
|
|
||||||
}
|
|
||||||
|
|
||||||
#elif defined(__FreeBSD__) || defined(__FreeBSD_kernel__)
|
|
||||||
#include <sys/sysctl.h>
|
|
||||||
|
|
||||||
static void __attribute__((constructor)) tcg_cache_init(void)
|
|
||||||
{
|
|
||||||
size_t len = 4;
|
|
||||||
unsigned cacheline;
|
|
||||||
|
|
||||||
if (sysctlbyname ("machdep.cacheline_size", &cacheline, &len, NULL, 0)) {
|
|
||||||
fprintf(stderr, "sysctlbyname machdep.cacheline_size failed: %s\n",
|
|
||||||
strerror(errno));
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
dcache_bsize = cacheline;
|
|
||||||
icache_bsize = cacheline;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|||||||
@@ -149,23 +149,23 @@ void *HELPER(lookup_tb_ptr)(CPUArchState *env, target_ulong addr)
|
|||||||
CPUState *cpu = ENV_GET_CPU(env);
|
CPUState *cpu = ENV_GET_CPU(env);
|
||||||
TranslationBlock *tb;
|
TranslationBlock *tb;
|
||||||
target_ulong cs_base, pc;
|
target_ulong cs_base, pc;
|
||||||
uint32_t flags;
|
uint32_t flags, addr_hash;
|
||||||
|
|
||||||
tb = atomic_rcu_read(&cpu->tb_jmp_cache[tb_jmp_cache_hash_func(addr)]);
|
addr_hash = tb_jmp_cache_hash_func(addr);
|
||||||
if (likely(tb)) {
|
tb = atomic_rcu_read(&cpu->tb_jmp_cache[addr_hash]);
|
||||||
cpu_get_tb_cpu_state(env, &pc, &cs_base, &flags);
|
cpu_get_tb_cpu_state(env, &pc, &cs_base, &flags);
|
||||||
if (likely(tb->pc == addr && tb->cs_base == cs_base &&
|
|
||||||
tb->flags == flags)) {
|
if (unlikely(!(tb
|
||||||
goto found;
|
&& tb->pc == addr
|
||||||
}
|
&& tb->cs_base == cs_base
|
||||||
|
&& tb->flags == flags))) {
|
||||||
tb = tb_htable_lookup(cpu, addr, cs_base, flags);
|
tb = tb_htable_lookup(cpu, addr, cs_base, flags);
|
||||||
if (likely(tb)) {
|
if (!tb) {
|
||||||
atomic_set(&cpu->tb_jmp_cache[tb_jmp_cache_hash_func(addr)], tb);
|
return tcg_ctx.code_gen_epilogue;
|
||||||
goto found;
|
|
||||||
}
|
}
|
||||||
|
atomic_set(&cpu->tb_jmp_cache[addr_hash], tb);
|
||||||
}
|
}
|
||||||
return tcg_ctx.code_gen_epilogue;
|
|
||||||
found:
|
|
||||||
qemu_log_mask_and_addr(CPU_LOG_EXEC, addr,
|
qemu_log_mask_and_addr(CPU_LOG_EXEC, addr,
|
||||||
"Chain %p [%d: " TARGET_FMT_lx "] %s\n",
|
"Chain %p [%d: " TARGET_FMT_lx "] %s\n",
|
||||||
tb->tc_ptr, cpu->cpu_index, addr,
|
tb->tc_ptr, cpu->cpu_index, addr,
|
||||||
|
|||||||
20
tcg/tcg.c
20
tcg/tcg.c
@@ -383,6 +383,26 @@ void tcg_context_init(TCGContext *s)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Allocate TBs right before their corresponding translated code, making
|
||||||
|
* sure that TBs and code are on different cache lines.
|
||||||
|
*/
|
||||||
|
TranslationBlock *tcg_tb_alloc(TCGContext *s)
|
||||||
|
{
|
||||||
|
uintptr_t align = qemu_icache_linesize;
|
||||||
|
TranslationBlock *tb;
|
||||||
|
void *next;
|
||||||
|
|
||||||
|
tb = (void *)ROUND_UP((uintptr_t)s->code_gen_ptr, align);
|
||||||
|
next = (void *)ROUND_UP((uintptr_t)(tb + 1), align);
|
||||||
|
|
||||||
|
if (unlikely(next > s->code_gen_highwater)) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
s->code_gen_ptr = next;
|
||||||
|
return tb;
|
||||||
|
}
|
||||||
|
|
||||||
void tcg_prologue_init(TCGContext *s)
|
void tcg_prologue_init(TCGContext *s)
|
||||||
{
|
{
|
||||||
size_t prologue_size, total_size;
|
size_t prologue_size, total_size;
|
||||||
|
|||||||
@@ -697,7 +697,6 @@ struct TCGContext {
|
|||||||
here, because there's too much arithmetic throughout that relies
|
here, because there's too much arithmetic throughout that relies
|
||||||
on addition and subtraction working on bytes. Rely on the GCC
|
on addition and subtraction working on bytes. Rely on the GCC
|
||||||
extension that allows arithmetic on void*. */
|
extension that allows arithmetic on void*. */
|
||||||
int code_gen_max_blocks;
|
|
||||||
void *code_gen_prologue;
|
void *code_gen_prologue;
|
||||||
void *code_gen_epilogue;
|
void *code_gen_epilogue;
|
||||||
void *code_gen_buffer;
|
void *code_gen_buffer;
|
||||||
@@ -756,6 +755,7 @@ static inline bool tcg_op_buf_full(void)
|
|||||||
/* tb_lock must be held for tcg_malloc_internal. */
|
/* tb_lock must be held for tcg_malloc_internal. */
|
||||||
void *tcg_malloc_internal(TCGContext *s, int size);
|
void *tcg_malloc_internal(TCGContext *s, int size);
|
||||||
void tcg_pool_reset(TCGContext *s);
|
void tcg_pool_reset(TCGContext *s);
|
||||||
|
TranslationBlock *tcg_tb_alloc(TCGContext *s);
|
||||||
|
|
||||||
void tb_lock(void);
|
void tb_lock(void);
|
||||||
void tb_unlock(void);
|
void tb_unlock(void);
|
||||||
|
|||||||
3
tests/.gitignore
vendored
3
tests/.gitignore
vendored
@@ -1,7 +1,6 @@
|
|||||||
atomic_add-bench
|
atomic_add-bench
|
||||||
check-qdict
|
check-qdict
|
||||||
check-qfloat
|
check-qnum
|
||||||
check-qint
|
|
||||||
check-qjson
|
check-qjson
|
||||||
check-qlist
|
check-qlist
|
||||||
check-qnull
|
check-qnull
|
||||||
|
|||||||
@@ -10,10 +10,8 @@ check-unit-y = tests/check-qdict$(EXESUF)
|
|||||||
gcov-files-check-qdict-y = qobject/qdict.c
|
gcov-files-check-qdict-y = qobject/qdict.c
|
||||||
check-unit-y += tests/test-char$(EXESUF)
|
check-unit-y += tests/test-char$(EXESUF)
|
||||||
gcov-files-check-qdict-y = chardev/char.c
|
gcov-files-check-qdict-y = chardev/char.c
|
||||||
check-unit-y += tests/check-qfloat$(EXESUF)
|
check-unit-y += tests/check-qnum$(EXESUF)
|
||||||
gcov-files-check-qfloat-y = qobject/qfloat.c
|
gcov-files-check-qnum-y = qobject/qnum.c
|
||||||
check-unit-y += tests/check-qint$(EXESUF)
|
|
||||||
gcov-files-check-qint-y = qobject/qint.c
|
|
||||||
check-unit-y += tests/check-qstring$(EXESUF)
|
check-unit-y += tests/check-qstring$(EXESUF)
|
||||||
gcov-files-check-qstring-y = qobject/qstring.c
|
gcov-files-check-qstring-y = qobject/qstring.c
|
||||||
check-unit-y += tests/check-qlist$(EXESUF)
|
check-unit-y += tests/check-qlist$(EXESUF)
|
||||||
@@ -508,8 +506,8 @@ GENERATED_FILES += tests/test-qapi-types.h tests/test-qapi-visit.h \
|
|||||||
tests/test-qmp-commands.h tests/test-qapi-event.h \
|
tests/test-qmp-commands.h tests/test-qapi-event.h \
|
||||||
tests/test-qmp-introspect.h
|
tests/test-qmp-introspect.h
|
||||||
|
|
||||||
test-obj-y = tests/check-qint.o tests/check-qstring.o tests/check-qdict.o \
|
test-obj-y = tests/check-qnum.o tests/check-qstring.o tests/check-qdict.o \
|
||||||
tests/check-qlist.o tests/check-qfloat.o tests/check-qnull.o \
|
tests/check-qlist.o tests/check-qnull.o \
|
||||||
tests/check-qjson.o \
|
tests/check-qjson.o \
|
||||||
tests/test-coroutine.o tests/test-string-output-visitor.o \
|
tests/test-coroutine.o tests/test-string-output-visitor.o \
|
||||||
tests/test-string-input-visitor.o tests/test-qobject-output-visitor.o \
|
tests/test-string-input-visitor.o tests/test-qobject-output-visitor.o \
|
||||||
@@ -537,11 +535,10 @@ test-crypto-obj-y = $(crypto-obj-y) $(test-qom-obj-y)
|
|||||||
test-io-obj-y = $(io-obj-y) $(test-crypto-obj-y)
|
test-io-obj-y = $(io-obj-y) $(test-crypto-obj-y)
|
||||||
test-block-obj-y = $(block-obj-y) $(test-io-obj-y) tests/iothread.o
|
test-block-obj-y = $(block-obj-y) $(test-io-obj-y) tests/iothread.o
|
||||||
|
|
||||||
tests/check-qint$(EXESUF): tests/check-qint.o $(test-util-obj-y)
|
tests/check-qnum$(EXESUF): tests/check-qnum.o $(test-util-obj-y)
|
||||||
tests/check-qstring$(EXESUF): tests/check-qstring.o $(test-util-obj-y)
|
tests/check-qstring$(EXESUF): tests/check-qstring.o $(test-util-obj-y)
|
||||||
tests/check-qdict$(EXESUF): tests/check-qdict.o $(test-util-obj-y)
|
tests/check-qdict$(EXESUF): tests/check-qdict.o $(test-util-obj-y)
|
||||||
tests/check-qlist$(EXESUF): tests/check-qlist.o $(test-util-obj-y)
|
tests/check-qlist$(EXESUF): tests/check-qlist.o $(test-util-obj-y)
|
||||||
tests/check-qfloat$(EXESUF): tests/check-qfloat.o $(test-util-obj-y)
|
|
||||||
tests/check-qnull$(EXESUF): tests/check-qnull.o $(test-util-obj-y)
|
tests/check-qnull$(EXESUF): tests/check-qnull.o $(test-util-obj-y)
|
||||||
tests/check-qjson$(EXESUF): tests/check-qjson.o $(test-util-obj-y)
|
tests/check-qjson$(EXESUF): tests/check-qjson.o $(test-util-obj-y)
|
||||||
tests/check-qom-interface$(EXESUF): tests/check-qom-interface.o $(test-qom-obj-y)
|
tests/check-qom-interface$(EXESUF): tests/check-qom-interface.o $(test-qom-obj-y)
|
||||||
|
|||||||
@@ -11,7 +11,6 @@
|
|||||||
*/
|
*/
|
||||||
#include "qemu/osdep.h"
|
#include "qemu/osdep.h"
|
||||||
|
|
||||||
#include "qapi/qmp/qint.h"
|
|
||||||
#include "qapi/qmp/qdict.h"
|
#include "qapi/qmp/qdict.h"
|
||||||
#include "qapi/qmp/qstring.h"
|
#include "qapi/qmp/qstring.h"
|
||||||
#include "qapi/error.h"
|
#include "qapi/error.h"
|
||||||
@@ -33,13 +32,12 @@ static void qdict_new_test(void)
|
|||||||
g_assert(qdict->base.refcnt == 1);
|
g_assert(qdict->base.refcnt == 1);
|
||||||
g_assert(qobject_type(QOBJECT(qdict)) == QTYPE_QDICT);
|
g_assert(qobject_type(QOBJECT(qdict)) == QTYPE_QDICT);
|
||||||
|
|
||||||
// destroy doesn't exit yet
|
QDECREF(qdict);
|
||||||
g_free(qdict);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void qdict_put_obj_test(void)
|
static void qdict_put_obj_test(void)
|
||||||
{
|
{
|
||||||
QInt *qi;
|
QNum *qn;
|
||||||
QDict *qdict;
|
QDict *qdict;
|
||||||
QDictEntry *ent;
|
QDictEntry *ent;
|
||||||
const int num = 42;
|
const int num = 42;
|
||||||
@@ -51,14 +49,10 @@ static void qdict_put_obj_test(void)
|
|||||||
|
|
||||||
g_assert(qdict_size(qdict) == 1);
|
g_assert(qdict_size(qdict) == 1);
|
||||||
ent = QLIST_FIRST(&qdict->table[12345 % QDICT_BUCKET_MAX]);
|
ent = QLIST_FIRST(&qdict->table[12345 % QDICT_BUCKET_MAX]);
|
||||||
qi = qobject_to_qint(ent->value);
|
qn = qobject_to_qnum(ent->value);
|
||||||
g_assert(qint_get_int(qi) == num);
|
g_assert_cmpint(qnum_get_int(qn), ==, num);
|
||||||
|
|
||||||
// destroy doesn't exit yet
|
QDECREF(qdict);
|
||||||
QDECREF(qi);
|
|
||||||
g_free(ent->key);
|
|
||||||
g_free(ent);
|
|
||||||
g_free(qdict);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void qdict_destroy_simple_test(void)
|
static void qdict_destroy_simple_test(void)
|
||||||
@@ -74,7 +68,7 @@ static void qdict_destroy_simple_test(void)
|
|||||||
|
|
||||||
static void qdict_get_test(void)
|
static void qdict_get_test(void)
|
||||||
{
|
{
|
||||||
QInt *qi;
|
QNum *qn;
|
||||||
QObject *obj;
|
QObject *obj;
|
||||||
const int value = -42;
|
const int value = -42;
|
||||||
const char *key = "test";
|
const char *key = "test";
|
||||||
@@ -85,8 +79,8 @@ static void qdict_get_test(void)
|
|||||||
obj = qdict_get(tests_dict, key);
|
obj = qdict_get(tests_dict, key);
|
||||||
g_assert(obj != NULL);
|
g_assert(obj != NULL);
|
||||||
|
|
||||||
qi = qobject_to_qint(obj);
|
qn = qobject_to_qnum(obj);
|
||||||
g_assert(qint_get_int(qi) == value);
|
g_assert_cmpint(qnum_get_int(qn), ==, value);
|
||||||
|
|
||||||
QDECREF(tests_dict);
|
QDECREF(tests_dict);
|
||||||
}
|
}
|
||||||
@@ -114,10 +108,17 @@ static void qdict_get_try_int_test(void)
|
|||||||
QDict *tests_dict = qdict_new();
|
QDict *tests_dict = qdict_new();
|
||||||
|
|
||||||
qdict_put_int(tests_dict, key, value);
|
qdict_put_int(tests_dict, key, value);
|
||||||
|
qdict_put_str(tests_dict, "string", "test");
|
||||||
|
|
||||||
ret = qdict_get_try_int(tests_dict, key, 0);
|
ret = qdict_get_try_int(tests_dict, key, 0);
|
||||||
g_assert(ret == value);
|
g_assert(ret == value);
|
||||||
|
|
||||||
|
ret = qdict_get_try_int(tests_dict, "missing", -42);
|
||||||
|
g_assert_cmpuint(ret, ==, -42);
|
||||||
|
|
||||||
|
ret = qdict_get_try_int(tests_dict, "string", -42);
|
||||||
|
g_assert_cmpuint(ret, ==, -42);
|
||||||
|
|
||||||
QDECREF(tests_dict);
|
QDECREF(tests_dict);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -329,7 +330,7 @@ static void qdict_array_split_test(void)
|
|||||||
{
|
{
|
||||||
QDict *test_dict = qdict_new();
|
QDict *test_dict = qdict_new();
|
||||||
QDict *dict1, *dict2;
|
QDict *dict1, *dict2;
|
||||||
QInt *int1;
|
QNum *int1;
|
||||||
QList *test_list;
|
QList *test_list;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -380,7 +381,7 @@ static void qdict_array_split_test(void)
|
|||||||
|
|
||||||
dict1 = qobject_to_qdict(qlist_pop(test_list));
|
dict1 = qobject_to_qdict(qlist_pop(test_list));
|
||||||
dict2 = qobject_to_qdict(qlist_pop(test_list));
|
dict2 = qobject_to_qdict(qlist_pop(test_list));
|
||||||
int1 = qobject_to_qint(qlist_pop(test_list));
|
int1 = qobject_to_qnum(qlist_pop(test_list));
|
||||||
|
|
||||||
g_assert(dict1);
|
g_assert(dict1);
|
||||||
g_assert(dict2);
|
g_assert(dict2);
|
||||||
@@ -402,7 +403,7 @@ static void qdict_array_split_test(void)
|
|||||||
|
|
||||||
QDECREF(dict2);
|
QDECREF(dict2);
|
||||||
|
|
||||||
g_assert(qint_get_int(int1) == 66);
|
g_assert_cmpint(qnum_get_int(int1), ==, 66);
|
||||||
|
|
||||||
QDECREF(int1);
|
QDECREF(int1);
|
||||||
|
|
||||||
@@ -447,14 +448,14 @@ static void qdict_array_split_test(void)
|
|||||||
|
|
||||||
qdict_array_split(test_dict, &test_list);
|
qdict_array_split(test_dict, &test_list);
|
||||||
|
|
||||||
int1 = qobject_to_qint(qlist_pop(test_list));
|
int1 = qobject_to_qnum(qlist_pop(test_list));
|
||||||
|
|
||||||
g_assert(int1);
|
g_assert(int1);
|
||||||
g_assert(qlist_empty(test_list));
|
g_assert(qlist_empty(test_list));
|
||||||
|
|
||||||
QDECREF(test_list);
|
QDECREF(test_list);
|
||||||
|
|
||||||
g_assert(qint_get_int(int1) == 42);
|
g_assert_cmpint(qnum_get_int(int1), ==, 42);
|
||||||
|
|
||||||
QDECREF(int1);
|
QDECREF(int1);
|
||||||
|
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user