Compare commits
2 Commits
v2.2.0-rc1
...
pull-input
Author | SHA1 | Date | |
---|---|---|---|
|
51fc44768a | ||
|
935fb91522 |
20
MAINTAINERS
20
MAINTAINERS
@@ -880,12 +880,6 @@ S: Maintained
|
||||
F: qobject/
|
||||
T: git git://repo.or.cz/qemu/qmp-unstable.git queue/qmp
|
||||
|
||||
QEMU Guest Agent
|
||||
M: Michael Roth <mdroth@linux.vnet.ibm.com>
|
||||
S: Maintained
|
||||
F: qga/
|
||||
T: git git://github.com/mdroth/qemu.git qga
|
||||
|
||||
QOM
|
||||
M: Anthony Liguori <aliguori@amazon.com>
|
||||
M: Andreas Färber <afaerber@suse.de>
|
||||
@@ -926,15 +920,6 @@ M: Blue Swirl <blauwirbel@gmail.com>
|
||||
S: Odd Fixes
|
||||
F: scripts/checkpatch.pl
|
||||
|
||||
Migration
|
||||
M: Juan Quintela <quintela@redhat.com>
|
||||
S: Maintained
|
||||
F: include/migration/
|
||||
F: migration*
|
||||
F: savevm.c
|
||||
F: arch_init.c
|
||||
F: vmstate.c
|
||||
|
||||
Seccomp
|
||||
M: Eduardo Otubo <eduardo.otubo@profitbricks.com>
|
||||
S: Supported
|
||||
@@ -1093,8 +1078,3 @@ M: Chrysostomos Nanakos <cnanakos@grnet.gr>
|
||||
M: Chrysostomos Nanakos <chris@include.gr>
|
||||
S: Maintained
|
||||
F: block/archipelago.c
|
||||
|
||||
Bootdevice
|
||||
M: Gonglei <arei.gonglei@huawei.com>
|
||||
S: Maintained
|
||||
F: bootdevice.c
|
||||
|
6
block.c
6
block.c
@@ -3903,9 +3903,9 @@ typedef struct BdrvCoGetBlockStatusData {
|
||||
} BdrvCoGetBlockStatusData;
|
||||
|
||||
/*
|
||||
* Returns the allocation status of the specified sectors.
|
||||
* Drivers not implementing the functionality are assumed to not support
|
||||
* backing files, hence all their sectors are reported as allocated.
|
||||
* Returns true iff the specified sector is present in the disk image. Drivers
|
||||
* not implementing the functionality are assumed to not support backing files,
|
||||
* hence all their sectors are reported as allocated.
|
||||
*
|
||||
* If 'sector_num' is beyond the end of the disk image the return value is 0
|
||||
* and 'pnum' is set to 0.
|
||||
|
3
configure
vendored
3
configure
vendored
@@ -1823,8 +1823,7 @@ fi
|
||||
# libseccomp check
|
||||
|
||||
if test "$seccomp" != "no" ; then
|
||||
if test "$cpu" = "i386" || test "$cpu" = "x86_64" &&
|
||||
$pkg_config --atleast-version=2.1.1 libseccomp; then
|
||||
if $pkg_config --atleast-version=2.1.0 libseccomp; then
|
||||
libs_softmmu="$libs_softmmu `$pkg_config --libs libseccomp`"
|
||||
QEMU_CFLAGS="$QEMU_CFLAGS `$pkg_config --cflags libseccomp`"
|
||||
seccomp="yes"
|
||||
|
@@ -155,7 +155,7 @@ Coroutine *qemu_coroutine_new(void)
|
||||
stack_t oss;
|
||||
sigset_t sigs;
|
||||
sigset_t osigs;
|
||||
sigjmp_buf old_env;
|
||||
jmp_buf old_env;
|
||||
|
||||
/* The way to manipulate stack is with the sigaltstack function. We
|
||||
* prepare a stack, with it delivering a signal to ourselves and then
|
||||
|
@@ -823,10 +823,7 @@ static int gdb_handle_packet(GDBState *s, const char *line_buf)
|
||||
action = *p++;
|
||||
signal = 0;
|
||||
if (action == 'C' || action == 'S') {
|
||||
signal = gdb_signal_to_target(strtoul(p, (char **)&p, 16));
|
||||
if (signal == -1) {
|
||||
signal = 0;
|
||||
}
|
||||
signal = strtoul(p, (char **)&p, 16);
|
||||
} else if (action != 'c' && action != 's') {
|
||||
res = 0;
|
||||
break;
|
||||
|
@@ -73,11 +73,11 @@ typedef struct ICCBridgeState {
|
||||
MemoryRegion apic_container;
|
||||
} ICCBridgeState;
|
||||
|
||||
#define ICC_BRIDGE(obj) OBJECT_CHECK(ICCBridgeState, (obj), TYPE_ICC_BRIDGE)
|
||||
#define ICC_BRIGDE(obj) OBJECT_CHECK(ICCBridgeState, (obj), TYPE_ICC_BRIDGE)
|
||||
|
||||
static void icc_bridge_init(Object *obj)
|
||||
{
|
||||
ICCBridgeState *s = ICC_BRIDGE(obj);
|
||||
ICCBridgeState *s = ICC_BRIGDE(obj);
|
||||
SysBusDevice *sb = SYS_BUS_DEVICE(obj);
|
||||
|
||||
qbus_create_inplace(&s->icc_bus, sizeof(s->icc_bus), TYPE_ICC_BUS,
|
||||
|
@@ -83,9 +83,7 @@ typedef enum {
|
||||
#define BDRV_SECTOR_SIZE (1ULL << BDRV_SECTOR_BITS)
|
||||
#define BDRV_SECTOR_MASK ~(BDRV_SECTOR_SIZE - 1)
|
||||
|
||||
/*
|
||||
* Allocation status flags
|
||||
* BDRV_BLOCK_DATA: data is read from bs->file or another file
|
||||
/* BDRV_BLOCK_DATA: data is read from bs->file or another file
|
||||
* BDRV_BLOCK_ZERO: sectors read as zero
|
||||
* BDRV_BLOCK_OFFSET_VALID: sector stored in bs->file as raw data
|
||||
* BDRV_BLOCK_ALLOCATED: the content of the block is determined by this
|
||||
|
@@ -10,7 +10,7 @@
|
||||
#define QDEV_MAX_PIO 32
|
||||
|
||||
#define TYPE_SYSTEM_BUS "System"
|
||||
#define SYSTEM_BUS(obj) OBJECT_CHECK(BusState, (obj), TYPE_SYSTEM_BUS)
|
||||
#define SYSTEM_BUS(obj) OBJECT_CHECK(IDEBus, (obj), TYPE_IDE_BUS)
|
||||
|
||||
typedef struct SysBusDevice SysBusDevice;
|
||||
|
||||
|
@@ -161,7 +161,6 @@ typedef struct node_info {
|
||||
extern NodeInfo numa_info[MAX_NODES];
|
||||
void set_numa_nodes(void);
|
||||
void set_numa_modes(void);
|
||||
void query_numa_node_mem(uint64_t node_mem[]);
|
||||
extern QemuOptsList qemu_numa_opts;
|
||||
int numa_init_func(QemuOpts *opts, void *opaque);
|
||||
|
||||
|
@@ -1824,7 +1824,7 @@ static void load_elf_image(const char *image_name, int image_fd,
|
||||
if (a < loaddr) {
|
||||
loaddr = a;
|
||||
}
|
||||
a = phdr[i].p_vaddr + phdr[i].p_memsz;
|
||||
a += phdr[i].p_memsz;
|
||||
if (a > hiaddr) {
|
||||
hiaddr = a;
|
||||
}
|
||||
|
@@ -5473,27 +5473,6 @@ static int do_openat(void *cpu_env, int dirfd, const char *pathname, int flags,
|
||||
return get_errno(sys_openat(dirfd, path(pathname), flags, mode));
|
||||
}
|
||||
|
||||
#define TIMER_MAGIC 0x0caf0000
|
||||
#define TIMER_MAGIC_MASK 0xffff0000
|
||||
|
||||
/* Convert QEMU provided timer ID back to internal 16bit index format */
|
||||
static target_timer_t get_timer_id(abi_long arg)
|
||||
{
|
||||
target_timer_t timerid = arg;
|
||||
|
||||
if ((timerid & TIMER_MAGIC_MASK) != TIMER_MAGIC) {
|
||||
return -TARGET_EINVAL;
|
||||
}
|
||||
|
||||
timerid &= 0xffff;
|
||||
|
||||
if (timerid >= ARRAY_SIZE(g_posix_timers)) {
|
||||
return -TARGET_EINVAL;
|
||||
}
|
||||
|
||||
return timerid;
|
||||
}
|
||||
|
||||
/* do_syscall() should always have a single exit point at the end so
|
||||
that actions, such as logging of syscall results, can be performed.
|
||||
All errnos that do_syscall() returns must be -TARGET_<errcode>. */
|
||||
@@ -9600,6 +9579,7 @@ abi_long do_syscall(void *cpu_env, int num, abi_long arg1,
|
||||
/* args: clockid_t clockid, struct sigevent *sevp, timer_t *timerid */
|
||||
|
||||
struct sigevent host_sevp = { {0}, }, *phost_sevp = NULL;
|
||||
struct target_timer_t *ptarget_timer;
|
||||
|
||||
int clkid = arg1;
|
||||
int timer_index = next_free_host_timer();
|
||||
@@ -9621,9 +9601,11 @@ abi_long do_syscall(void *cpu_env, int num, abi_long arg1,
|
||||
if (ret) {
|
||||
phtimer = NULL;
|
||||
} else {
|
||||
if (put_user(TIMER_MAGIC | timer_index, arg3, target_timer_t)) {
|
||||
if (!lock_user_struct(VERIFY_WRITE, ptarget_timer, arg3, 1)) {
|
||||
goto efault;
|
||||
}
|
||||
ptarget_timer->ptr = tswap32(0xcafe0000 | timer_index);
|
||||
unlock_user_struct(ptarget_timer, arg3, 1);
|
||||
}
|
||||
}
|
||||
break;
|
||||
@@ -9635,11 +9617,9 @@ abi_long do_syscall(void *cpu_env, int num, abi_long arg1,
|
||||
{
|
||||
/* args: timer_t timerid, int flags, const struct itimerspec *new_value,
|
||||
* struct itimerspec * old_value */
|
||||
target_timer_t timerid = get_timer_id(arg1);
|
||||
target_ulong timerid = arg1;
|
||||
|
||||
if (timerid < 0) {
|
||||
ret = timerid;
|
||||
} else if (arg3 == 0) {
|
||||
if (arg3 == 0 || timerid >= ARRAY_SIZE(g_posix_timers)) {
|
||||
ret = -TARGET_EINVAL;
|
||||
} else {
|
||||
timer_t htimer = g_posix_timers[timerid];
|
||||
@@ -9658,12 +9638,12 @@ abi_long do_syscall(void *cpu_env, int num, abi_long arg1,
|
||||
case TARGET_NR_timer_gettime:
|
||||
{
|
||||
/* args: timer_t timerid, struct itimerspec *curr_value */
|
||||
target_timer_t timerid = get_timer_id(arg1);
|
||||
target_ulong timerid = arg1;
|
||||
|
||||
if (timerid < 0) {
|
||||
ret = timerid;
|
||||
} else if (!arg2) {
|
||||
ret = -TARGET_EFAULT;
|
||||
if (!arg2) {
|
||||
return -TARGET_EFAULT;
|
||||
} else if (timerid >= ARRAY_SIZE(g_posix_timers)) {
|
||||
ret = -TARGET_EINVAL;
|
||||
} else {
|
||||
timer_t htimer = g_posix_timers[timerid];
|
||||
struct itimerspec hspec;
|
||||
@@ -9681,10 +9661,10 @@ abi_long do_syscall(void *cpu_env, int num, abi_long arg1,
|
||||
case TARGET_NR_timer_getoverrun:
|
||||
{
|
||||
/* args: timer_t timerid */
|
||||
target_timer_t timerid = get_timer_id(arg1);
|
||||
target_ulong timerid = arg1;
|
||||
|
||||
if (timerid < 0) {
|
||||
ret = timerid;
|
||||
if (timerid >= ARRAY_SIZE(g_posix_timers)) {
|
||||
ret = -TARGET_EINVAL;
|
||||
} else {
|
||||
timer_t htimer = g_posix_timers[timerid];
|
||||
ret = get_errno(timer_getoverrun(htimer));
|
||||
@@ -9697,10 +9677,10 @@ abi_long do_syscall(void *cpu_env, int num, abi_long arg1,
|
||||
case TARGET_NR_timer_delete:
|
||||
{
|
||||
/* args: timer_t timerid */
|
||||
target_timer_t timerid = get_timer_id(arg1);
|
||||
target_ulong timerid = arg1;
|
||||
|
||||
if (timerid < 0) {
|
||||
ret = timerid;
|
||||
if (timerid >= ARRAY_SIZE(g_posix_timers)) {
|
||||
ret = -TARGET_EINVAL;
|
||||
} else {
|
||||
timer_t htimer = g_posix_timers[timerid];
|
||||
ret = get_errno(timer_delete(htimer));
|
||||
|
@@ -2564,7 +2564,10 @@ struct target_ucred {
|
||||
|
||||
#endif
|
||||
|
||||
typedef int32_t target_timer_t;
|
||||
|
||||
struct target_timer_t {
|
||||
abi_ulong ptr;
|
||||
};
|
||||
|
||||
#define TARGET_SIGEV_MAX_SIZE 64
|
||||
|
||||
|
@@ -1948,10 +1948,7 @@ static void do_info_numa(Monitor *mon, const QDict *qdict)
|
||||
{
|
||||
int i;
|
||||
CPUState *cpu;
|
||||
uint64_t *node_mem;
|
||||
|
||||
node_mem = g_new0(uint64_t, nb_numa_nodes);
|
||||
query_numa_node_mem(node_mem);
|
||||
monitor_printf(mon, "%d nodes\n", nb_numa_nodes);
|
||||
for (i = 0; i < nb_numa_nodes; i++) {
|
||||
monitor_printf(mon, "node %d cpus:", i);
|
||||
@@ -1962,9 +1959,8 @@ static void do_info_numa(Monitor *mon, const QDict *qdict)
|
||||
}
|
||||
monitor_printf(mon, "\n");
|
||||
monitor_printf(mon, "node %d size: %" PRId64 " MB\n", i,
|
||||
node_mem[i] >> 20);
|
||||
numa_info[i].node_mem >> 20);
|
||||
}
|
||||
g_free(node_mem);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_PROFILER
|
||||
|
@@ -523,21 +523,15 @@ static int slirp_smb(SlirpState* s, const char *exported_dir,
|
||||
fprintf(f,
|
||||
"[global]\n"
|
||||
"private dir=%s\n"
|
||||
"interfaces=127.0.0.1\n"
|
||||
"bind interfaces only=yes\n"
|
||||
"socket address=127.0.0.1\n"
|
||||
"pid directory=%s\n"
|
||||
"lock directory=%s\n"
|
||||
"state directory=%s\n"
|
||||
"cache directory=%s\n"
|
||||
"ncalrpc dir=%s/ncalrpc\n"
|
||||
"log file=%s/log.smbd\n"
|
||||
"smb passwd file=%s/smbpasswd\n"
|
||||
"security = user\n"
|
||||
"map to guest = Bad User\n"
|
||||
"load printers = no\n"
|
||||
"printing = bsd\n"
|
||||
"disable spoolss = yes\n"
|
||||
"usershare max shares = 0\n"
|
||||
"[qemu]\n"
|
||||
"path=%s\n"
|
||||
"read only=no\n"
|
||||
@@ -550,7 +544,6 @@ static int slirp_smb(SlirpState* s, const char *exported_dir,
|
||||
s->smb_dir,
|
||||
s->smb_dir,
|
||||
s->smb_dir,
|
||||
s->smb_dir,
|
||||
exported_dir,
|
||||
passwd->pw_name
|
||||
);
|
||||
|
38
numa.c
38
numa.c
@@ -35,7 +35,6 @@
|
||||
#include "hw/boards.h"
|
||||
#include "sysemu/hostmem.h"
|
||||
#include "qmp-commands.h"
|
||||
#include "hw/mem/pc-dimm.h"
|
||||
|
||||
QemuOptsList qemu_numa_opts = {
|
||||
.name = "numa",
|
||||
@@ -316,43 +315,6 @@ void memory_region_allocate_system_memory(MemoryRegion *mr, Object *owner,
|
||||
}
|
||||
}
|
||||
|
||||
static void numa_stat_memory_devices(uint64_t node_mem[])
|
||||
{
|
||||
MemoryDeviceInfoList *info_list = NULL;
|
||||
MemoryDeviceInfoList **prev = &info_list;
|
||||
MemoryDeviceInfoList *info;
|
||||
|
||||
qmp_pc_dimm_device_list(qdev_get_machine(), &prev);
|
||||
for (info = info_list; info; info = info->next) {
|
||||
MemoryDeviceInfo *value = info->value;
|
||||
|
||||
if (value) {
|
||||
switch (value->kind) {
|
||||
case MEMORY_DEVICE_INFO_KIND_DIMM:
|
||||
node_mem[value->dimm->node] += value->dimm->size;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
qapi_free_MemoryDeviceInfoList(info_list);
|
||||
}
|
||||
|
||||
void query_numa_node_mem(uint64_t node_mem[])
|
||||
{
|
||||
int i;
|
||||
|
||||
if (nb_numa_nodes <= 0) {
|
||||
return;
|
||||
}
|
||||
|
||||
numa_stat_memory_devices(node_mem);
|
||||
for (i = 0; i < nb_numa_nodes; i++) {
|
||||
node_mem[i] += numa_info[i].node_mem;
|
||||
}
|
||||
}
|
||||
|
||||
static int query_memdev(Object *obj, void *opaque)
|
||||
{
|
||||
MemdevList **list = opaque;
|
||||
|
Binary file not shown.
@@ -3231,6 +3231,11 @@
|
||||
#
|
||||
# Input event union.
|
||||
#
|
||||
# @key: Input event of Keyboard
|
||||
# @btn: Input event of pointer buttons
|
||||
# @rel: Input event of relative pointer motion
|
||||
# @abs: Input event of absolute pointer motion
|
||||
#
|
||||
# Since: 2.0
|
||||
##
|
||||
{ 'union' : 'InputEvent',
|
||||
@@ -3244,7 +3249,7 @@
|
||||
#
|
||||
# Send input event(s) to guest.
|
||||
#
|
||||
# @console: Which console to send event(s) to.
|
||||
# @console: #optional console to send event(s) to.
|
||||
#
|
||||
# @events: List of InputEvent union.
|
||||
#
|
||||
@@ -3254,7 +3259,7 @@
|
||||
#
|
||||
##
|
||||
{ 'command': 'input-send-event',
|
||||
'data': { 'console':'int', 'events': [ 'InputEvent' ] } }
|
||||
'data': { '*console':'int', 'events': [ 'InputEvent' ] } }
|
||||
|
||||
##
|
||||
# @NumaOptions
|
||||
|
@@ -1631,7 +1631,7 @@ EOF
|
||||
# certtool --generate-certificate \
|
||||
--load-ca-certificate ca-cert.pem \
|
||||
--load-ca-privkey ca-key.pem \
|
||||
--load-privkey server-key.pem \
|
||||
--load-privkey server server-key.pem \
|
||||
--template server.info \
|
||||
--outfile server-cert.pem
|
||||
@end example
|
||||
@@ -1654,7 +1654,7 @@ the secure CA private key:
|
||||
country = GB
|
||||
state = London
|
||||
locality = London
|
||||
organization = Name of your organization
|
||||
organiazation = Name of your organization
|
||||
cn = client.foo.example.com
|
||||
tls_www_client
|
||||
encryption_key
|
||||
|
@@ -231,11 +231,7 @@ static const struct QemuSeccompSyscall seccomp_whitelist[] = {
|
||||
{ SCMP_SYS(shmctl), 240 },
|
||||
{ SCMP_SYS(mlock), 240 },
|
||||
{ SCMP_SYS(munlock), 240 },
|
||||
{ SCMP_SYS(semctl), 240 },
|
||||
{ SCMP_SYS(fallocate), 240 },
|
||||
{ SCMP_SYS(fadvise64), 240 },
|
||||
{ SCMP_SYS(inotify_init1), 240 },
|
||||
{ SCMP_SYS(inotify_add_watch), 240 }
|
||||
{ SCMP_SYS(semctl), 240 }
|
||||
};
|
||||
|
||||
int seccomp_start(void)
|
||||
|
@@ -3792,7 +3792,7 @@ EQMP
|
||||
|
||||
{
|
||||
.name = "input-send-event",
|
||||
.args_type = "console:i,events:q",
|
||||
.args_type = "console:i?,events:q",
|
||||
.mhandler.cmd_new = qmp_marshal_input_input_send_event,
|
||||
},
|
||||
|
||||
@@ -3804,7 +3804,7 @@ Send input event to guest.
|
||||
|
||||
Arguments:
|
||||
|
||||
- "console": console index.
|
||||
- "console": console index. (json-int, optional)
|
||||
- "events": list of input events.
|
||||
|
||||
The consoles are visible in the qom tree, under
|
||||
|
@@ -540,8 +540,8 @@ void host_cpuid(uint32_t function, uint32_t count,
|
||||
* otherwise the string is assumed to sized by a terminating nul.
|
||||
* Return lexical ordering of *s1:*s2.
|
||||
*/
|
||||
static int sstrcmp(const char *s1, const char *e1,
|
||||
const char *s2, const char *e2)
|
||||
static int sstrcmp(const char *s1, const char *e1, const char *s2,
|
||||
const char *e2)
|
||||
{
|
||||
for (;;) {
|
||||
if (!*s1 || !*s2 || *s1 != *s2)
|
||||
@@ -1859,7 +1859,7 @@ static void x86_cpu_parse_featurestr(CPUState *cs, char *features,
|
||||
* if flags, suppress names undefined in featureset.
|
||||
*/
|
||||
static void listflags(char *buf, int bufsize, uint32_t fbits,
|
||||
const char **featureset, uint32_t flags)
|
||||
const char **featureset, uint32_t flags)
|
||||
{
|
||||
const char **p = &featureset[31];
|
||||
char *q, *b, bit;
|
||||
|
@@ -472,12 +472,6 @@ static inline xtensa_tlb_entry *xtensa_tlb_get_entry(CPUXtensaState *env,
|
||||
env->itlb[wi] + ei;
|
||||
}
|
||||
|
||||
static inline uint32_t xtensa_replicate_windowstart(CPUXtensaState *env)
|
||||
{
|
||||
return env->sregs[WINDOW_START] |
|
||||
(env->sregs[WINDOW_START] << env->config->nareg / 4);
|
||||
}
|
||||
|
||||
/* MMU modes definitions */
|
||||
#define MMU_MODE0_SUFFIX _ring0
|
||||
#define MMU_MODE1_SUFFIX _ring1
|
||||
|
@@ -235,12 +235,6 @@ void HELPER(entry)(CPUXtensaState *env, uint32_t pc, uint32_t s, uint32_t imm)
|
||||
pc, env->sregs[PS]);
|
||||
HELPER(exception_cause)(env, pc, ILLEGAL_INSTRUCTION_CAUSE);
|
||||
} else {
|
||||
uint32_t windowstart = xtensa_replicate_windowstart(env) >>
|
||||
(env->sregs[WINDOW_BASE] + 1);
|
||||
|
||||
if (windowstart & ((1 << callinc) - 1)) {
|
||||
HELPER(window_check)(env, pc, callinc);
|
||||
}
|
||||
env->regs[(callinc << 2) | (s & 3)] = env->regs[s] - (imm << 3);
|
||||
rotate_window(env, callinc);
|
||||
env->sregs[WINDOW_START] |=
|
||||
|
@@ -299,55 +299,4 @@ test entry
|
||||
entry_test 12
|
||||
test_end
|
||||
|
||||
.macro entry_overflow_test window, free, next_window
|
||||
set_vector window_overflow_4, 0
|
||||
set_vector window_overflow_8, 0
|
||||
set_vector window_overflow_12, 0
|
||||
set_vector window_overflow_\next_window, 10f
|
||||
|
||||
movi a2, \window
|
||||
movi a2, \free
|
||||
movi a2, \next_window
|
||||
reset_window %(1 | ((1 | (1 << ((\next_window) / 4))) << ((\free) / 4)))
|
||||
reset_ps
|
||||
movi a2, 0x4000f | ((\window) << 14)
|
||||
wsr a2, ps
|
||||
isync
|
||||
movi a3, 0x12345678
|
||||
j 1f
|
||||
.align 4
|
||||
1:
|
||||
entry a3, 0x5678
|
||||
test_fail
|
||||
.align 4
|
||||
10:
|
||||
rsr a2, epc1
|
||||
movi a3, 1b
|
||||
assert eq, a2, a3
|
||||
movi a2, 2f
|
||||
wsr a2, epc1
|
||||
|
||||
rsr a2, windowbase
|
||||
movi a3, (\free) / 4
|
||||
assert eq, a2, a3
|
||||
rfwo
|
||||
2:
|
||||
.endm
|
||||
|
||||
.macro all_entry_overflow_tests
|
||||
.irp window, 4, 8, 12
|
||||
.irp next_window, 4, 8, 12
|
||||
.irp free, 4, 8, 12
|
||||
.if \free <= \window
|
||||
entry_overflow_test \window, \free, \next_window
|
||||
.endif
|
||||
.endr
|
||||
.endr
|
||||
.endr
|
||||
.endm
|
||||
|
||||
test entry_overflow
|
||||
all_entry_overflow_tests
|
||||
test_end
|
||||
|
||||
test_suite_end
|
||||
|
15
ui/input.c
15
ui/input.c
@@ -122,16 +122,19 @@ qemu_input_find_handler(uint32_t mask, QemuConsole *con)
|
||||
return NULL;
|
||||
}
|
||||
|
||||
void qmp_input_send_event(int64_t console, InputEventList *events,
|
||||
Error **errp)
|
||||
void qmp_input_send_event(bool has_console, int64_t console,
|
||||
InputEventList *events, Error **errp)
|
||||
{
|
||||
InputEventList *e;
|
||||
QemuConsole *con;
|
||||
|
||||
con = qemu_console_lookup_by_index(console);
|
||||
if (!con) {
|
||||
error_setg(errp, "console %" PRId64 " not found", console);
|
||||
return;
|
||||
con = NULL;
|
||||
if (has_console) {
|
||||
con = qemu_console_lookup_by_index(console);
|
||||
if (!con) {
|
||||
error_setg(errp, "console %" PRId64 " not found", console);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
if (!runstate_is_running() && !runstate_check(RUN_STATE_SUSPENDED)) {
|
||||
|
@@ -993,8 +993,9 @@ static void xen_main_loop_prepare(XenIOState *state)
|
||||
static void xen_hvm_change_state_handler(void *opaque, int running,
|
||||
RunState rstate)
|
||||
{
|
||||
XenIOState *xstate = opaque;
|
||||
if (running) {
|
||||
xen_main_loop_prepare((XenIOState *)opaque);
|
||||
xen_main_loop_prepare(xstate);
|
||||
}
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user