mirror of https://github.com/xemu-project/xemu.git
Merge branch 'master' of git://git.qemu.org/qemu
This commit is contained in:
commit
9f058c19fc
10
MAINTAINERS
10
MAINTAINERS
|
@ -143,6 +143,16 @@ L: kvm@vger.kernel.org
|
||||||
S: Supported
|
S: Supported
|
||||||
F: target-i386/kvm.c
|
F: target-i386/kvm.c
|
||||||
|
|
||||||
|
Guest CPU Cores (Xen):
|
||||||
|
----------------------
|
||||||
|
|
||||||
|
X86
|
||||||
|
M: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
|
||||||
|
L: xen-devel@lists.xensource.com
|
||||||
|
S: Supported
|
||||||
|
F: xen-*
|
||||||
|
F: */xen*
|
||||||
|
|
||||||
ARM Machines
|
ARM Machines
|
||||||
------------
|
------------
|
||||||
Gumstix
|
Gumstix
|
||||||
|
|
|
@ -317,7 +317,8 @@ int qcow2_snapshot_goto(BlockDriverState *bs, const char *snapshot_id)
|
||||||
{
|
{
|
||||||
BDRVQcowState *s = bs->opaque;
|
BDRVQcowState *s = bs->opaque;
|
||||||
QCowSnapshot *sn;
|
QCowSnapshot *sn;
|
||||||
int i, snapshot_index, l1_size2;
|
int i, snapshot_index;
|
||||||
|
int cur_l1_bytes, sn_l1_bytes;
|
||||||
|
|
||||||
snapshot_index = find_snapshot_by_id_or_name(bs, snapshot_id);
|
snapshot_index = find_snapshot_by_id_or_name(bs, snapshot_id);
|
||||||
if (snapshot_index < 0)
|
if (snapshot_index < 0)
|
||||||
|
@ -330,14 +331,19 @@ int qcow2_snapshot_goto(BlockDriverState *bs, const char *snapshot_id)
|
||||||
if (qcow2_grow_l1_table(bs, sn->l1_size, true) < 0)
|
if (qcow2_grow_l1_table(bs, sn->l1_size, true) < 0)
|
||||||
goto fail;
|
goto fail;
|
||||||
|
|
||||||
s->l1_size = sn->l1_size;
|
cur_l1_bytes = s->l1_size * sizeof(uint64_t);
|
||||||
l1_size2 = s->l1_size * sizeof(uint64_t);
|
sn_l1_bytes = sn->l1_size * sizeof(uint64_t);
|
||||||
|
|
||||||
|
if (cur_l1_bytes > sn_l1_bytes) {
|
||||||
|
memset(s->l1_table + sn->l1_size, 0, cur_l1_bytes - sn_l1_bytes);
|
||||||
|
}
|
||||||
|
|
||||||
/* copy the snapshot l1 table to the current l1 table */
|
/* copy the snapshot l1 table to the current l1 table */
|
||||||
if (bdrv_pread(bs->file, sn->l1_table_offset,
|
if (bdrv_pread(bs->file, sn->l1_table_offset,
|
||||||
s->l1_table, l1_size2) != l1_size2)
|
s->l1_table, sn_l1_bytes) < 0)
|
||||||
goto fail;
|
goto fail;
|
||||||
if (bdrv_pwrite_sync(bs->file, s->l1_table_offset,
|
if (bdrv_pwrite_sync(bs->file, s->l1_table_offset,
|
||||||
s->l1_table, l1_size2) < 0)
|
s->l1_table, cur_l1_bytes) < 0)
|
||||||
goto fail;
|
goto fail;
|
||||||
for(i = 0;i < s->l1_size; i++) {
|
for(i = 0;i < s->l1_size; i++) {
|
||||||
be64_to_cpus(&s->l1_table[i]);
|
be64_to_cpus(&s->l1_table[i]);
|
||||||
|
|
|
@ -905,7 +905,8 @@ int main(int argc, char **argv)
|
||||||
cpu_model = "any";
|
cpu_model = "any";
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
cpu_exec_init_all(0);
|
tcg_exec_init(0);
|
||||||
|
cpu_exec_init_all();
|
||||||
/* NOTE: we need to init the CPU at this stage to get
|
/* NOTE: we need to init the CPU at this stage to get
|
||||||
qemu_host_page_size */
|
qemu_host_page_size */
|
||||||
env = cpu_init(cpu_model);
|
env = cpu_init(cpu_model);
|
||||||
|
|
|
@ -220,14 +220,14 @@ done
|
||||||
# Using uname is really, really broken. Once we have the right set of checks
|
# Using uname is really, really broken. Once we have the right set of checks
|
||||||
# we can eliminate it's usage altogether
|
# we can eliminate it's usage altogether
|
||||||
|
|
||||||
cc="${cross_prefix}${CC-gcc}"
|
cc="${CC-${cross_prefix}gcc}"
|
||||||
ar="${cross_prefix}${AR-ar}"
|
ar="${AR-${cross_prefix}ar}"
|
||||||
objcopy="${cross_prefix}${OBJCOPY-objcopy}"
|
objcopy="${OBJCOPY-${cross_prefix}objcopy}"
|
||||||
ld="${cross_prefix}${LD-ld}"
|
ld="${LD-${cross_prefix}ld}"
|
||||||
strip="${cross_prefix}${STRIP-strip}"
|
strip="${STRIP-${cross_prefix}strip}"
|
||||||
windres="${cross_prefix}${WINDRES-windres}"
|
windres="${WINDRES-${cross_prefix}windres}"
|
||||||
pkg_config="${cross_prefix}${PKG_CONFIG-pkg-config}"
|
pkg_config="${PKG_CONFIG-${cross_prefix}pkg-config}"
|
||||||
sdl_config="${cross_prefix}${SDL_CONFIG-sdl-config}"
|
sdl_config="${SDL_CONFIG-${cross_prefix}sdl-config}"
|
||||||
|
|
||||||
# default flags for all hosts
|
# default flags for all hosts
|
||||||
QEMU_CFLAGS="-fno-strict-aliasing $QEMU_CFLAGS"
|
QEMU_CFLAGS="-fno-strict-aliasing $QEMU_CFLAGS"
|
||||||
|
|
|
@ -852,8 +852,8 @@ int main(int argc, char **argv)
|
||||||
#error unsupported CPU
|
#error unsupported CPU
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
tcg_exec_init(0);
|
||||||
cpu_exec_init_all(0);
|
cpu_exec_init_all();
|
||||||
/* NOTE: we need to init the CPU at this stage to get
|
/* NOTE: we need to init the CPU at this stage to get
|
||||||
qemu_host_page_size */
|
qemu_host_page_size */
|
||||||
env = cpu_init(cpu_model);
|
env = cpu_init(cpu_model);
|
||||||
|
|
|
@ -319,7 +319,6 @@ static void setup_frame(int sig, struct emulated_sigaction *ka,
|
||||||
void *set, CPUState *env)
|
void *set, CPUState *env)
|
||||||
{
|
{
|
||||||
void *frame;
|
void *frame;
|
||||||
int i, err = 0;
|
|
||||||
|
|
||||||
fprintf(stderr, "setup_frame %d\n", sig);
|
fprintf(stderr, "setup_frame %d\n", sig);
|
||||||
frame = get_sigframe(ka, env, sizeof(*frame));
|
frame = get_sigframe(ka, env, sizeof(*frame));
|
||||||
|
|
24
exec.c
24
exec.c
|
@ -526,7 +526,8 @@ static void code_gen_alloc(unsigned long tb_size)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#elif defined(__FreeBSD__) || defined(__FreeBSD_kernel__) \
|
#elif defined(__FreeBSD__) || defined(__FreeBSD_kernel__) \
|
||||||
|| defined(__DragonFly__) || defined(__OpenBSD__)
|
|| defined(__DragonFly__) || defined(__OpenBSD__) \
|
||||||
|
|| defined(__NetBSD__)
|
||||||
{
|
{
|
||||||
int flags;
|
int flags;
|
||||||
void *addr = NULL;
|
void *addr = NULL;
|
||||||
|
@ -570,16 +571,12 @@ static void code_gen_alloc(unsigned long tb_size)
|
||||||
/* Must be called before using the QEMU cpus. 'tb_size' is the size
|
/* Must be called before using the QEMU cpus. 'tb_size' is the size
|
||||||
(in bytes) allocated to the translation buffer. Zero means default
|
(in bytes) allocated to the translation buffer. Zero means default
|
||||||
size. */
|
size. */
|
||||||
void cpu_exec_init_all(unsigned long tb_size)
|
void tcg_exec_init(unsigned long tb_size)
|
||||||
{
|
{
|
||||||
cpu_gen_init();
|
cpu_gen_init();
|
||||||
code_gen_alloc(tb_size);
|
code_gen_alloc(tb_size);
|
||||||
code_gen_ptr = code_gen_buffer;
|
code_gen_ptr = code_gen_buffer;
|
||||||
page_init();
|
page_init();
|
||||||
#if !defined(CONFIG_USER_ONLY)
|
|
||||||
memory_map_init();
|
|
||||||
io_mem_init();
|
|
||||||
#endif
|
|
||||||
#if !defined(CONFIG_USER_ONLY) || !defined(CONFIG_USE_GUEST_BASE)
|
#if !defined(CONFIG_USER_ONLY) || !defined(CONFIG_USE_GUEST_BASE)
|
||||||
/* There's no guest base to take into account, so go ahead and
|
/* There's no guest base to take into account, so go ahead and
|
||||||
initialize the prologue now. */
|
initialize the prologue now. */
|
||||||
|
@ -587,6 +584,19 @@ void cpu_exec_init_all(unsigned long tb_size)
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool tcg_enabled(void)
|
||||||
|
{
|
||||||
|
return code_gen_buffer != NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
void cpu_exec_init_all(void)
|
||||||
|
{
|
||||||
|
#if !defined(CONFIG_USER_ONLY)
|
||||||
|
memory_map_init();
|
||||||
|
io_mem_init();
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
#if defined(CPU_SAVE_VERSION) && !defined(CONFIG_USER_ONLY)
|
#if defined(CPU_SAVE_VERSION) && !defined(CONFIG_USER_ONLY)
|
||||||
|
|
||||||
static int cpu_common_post_load(void *opaque, int version_id)
|
static int cpu_common_post_load(void *opaque, int version_id)
|
||||||
|
@ -3818,7 +3828,7 @@ static void io_mem_init(void)
|
||||||
static void memory_map_init(void)
|
static void memory_map_init(void)
|
||||||
{
|
{
|
||||||
system_memory = qemu_malloc(sizeof(*system_memory));
|
system_memory = qemu_malloc(sizeof(*system_memory));
|
||||||
memory_region_init(system_memory, "system", UINT64_MAX);
|
memory_region_init(system_memory, "system", INT64_MAX);
|
||||||
set_system_memory_map(system_memory);
|
set_system_memory_map(system_memory);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
13
hw/fw_cfg.c
13
hw/fw_cfg.c
|
@ -87,6 +87,13 @@ static FILE *probe_splashfile(char *filename, int *file_sizep, int *file_typep)
|
||||||
/* check magic ID */
|
/* check magic ID */
|
||||||
fseek(fp, 0L, SEEK_SET);
|
fseek(fp, 0L, SEEK_SET);
|
||||||
fop_ret = fread(buf, 1, 2, fp);
|
fop_ret = fread(buf, 1, 2, fp);
|
||||||
|
if (fop_ret != 2) {
|
||||||
|
error_report("Could not read header from '%s': %s",
|
||||||
|
filename, strerror(errno));
|
||||||
|
fclose(fp);
|
||||||
|
fp = NULL;
|
||||||
|
return fp;
|
||||||
|
}
|
||||||
filehead_value = (buf[0] + (buf[1] << 8)) & 0xffff;
|
filehead_value = (buf[0] + (buf[1] << 8)) & 0xffff;
|
||||||
if (filehead_value == 0xd8ff) {
|
if (filehead_value == 0xd8ff) {
|
||||||
file_type = JPG_FILE;
|
file_type = JPG_FILE;
|
||||||
|
@ -181,6 +188,12 @@ static void fw_cfg_bootsplash(FWCfgState *s)
|
||||||
boot_splash_filedata_size = file_size;
|
boot_splash_filedata_size = file_size;
|
||||||
fseek(fp, 0L, SEEK_SET);
|
fseek(fp, 0L, SEEK_SET);
|
||||||
fop_ret = fread(boot_splash_filedata, 1, file_size, fp);
|
fop_ret = fread(boot_splash_filedata, 1, file_size, fp);
|
||||||
|
if (fop_ret != file_size) {
|
||||||
|
error_report("failed to read data from '%s'.",
|
||||||
|
boot_splash_filename);
|
||||||
|
fclose(fp);
|
||||||
|
return;
|
||||||
|
}
|
||||||
fclose(fp);
|
fclose(fp);
|
||||||
/* insert data */
|
/* insert data */
|
||||||
if (file_type == JPG_FILE) {
|
if (file_type == JPG_FILE) {
|
||||||
|
|
14
hw/qdev.c
14
hw/qdev.c
|
@ -36,6 +36,7 @@ static bool qdev_hot_removed = false;
|
||||||
|
|
||||||
/* This is a nasty hack to allow passing a NULL bus to qdev_create. */
|
/* This is a nasty hack to allow passing a NULL bus to qdev_create. */
|
||||||
static BusState *main_system_bus;
|
static BusState *main_system_bus;
|
||||||
|
static void main_system_bus_create(void);
|
||||||
|
|
||||||
DeviceInfo *device_info_list;
|
DeviceInfo *device_info_list;
|
||||||
|
|
||||||
|
@ -328,8 +329,7 @@ static int qdev_reset_one(DeviceState *dev, void *opaque)
|
||||||
BusState *sysbus_get_default(void)
|
BusState *sysbus_get_default(void)
|
||||||
{
|
{
|
||||||
if (!main_system_bus) {
|
if (!main_system_bus) {
|
||||||
main_system_bus = qbus_create(&system_bus_info, NULL,
|
main_system_bus_create();
|
||||||
"main-system-bus");
|
|
||||||
}
|
}
|
||||||
return main_system_bus;
|
return main_system_bus;
|
||||||
}
|
}
|
||||||
|
@ -784,6 +784,16 @@ BusState *qbus_create(BusInfo *info, DeviceState *parent, const char *name)
|
||||||
return bus;
|
return bus;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void main_system_bus_create(void)
|
||||||
|
{
|
||||||
|
/* assign main_system_bus before qbus_create_inplace()
|
||||||
|
* in order to make "if (bus != main_system_bus)" work */
|
||||||
|
main_system_bus = qemu_mallocz(system_bus_info.size);
|
||||||
|
main_system_bus->qdev_allocated = 1;
|
||||||
|
qbus_create_inplace(main_system_bus, &system_bus_info, NULL,
|
||||||
|
"main-system-bus");
|
||||||
|
}
|
||||||
|
|
||||||
void qbus_free(BusState *bus)
|
void qbus_free(BusState *bus)
|
||||||
{
|
{
|
||||||
DeviceState *dev;
|
DeviceState *dev;
|
||||||
|
|
|
@ -3117,7 +3117,8 @@ int main(int argc, char **argv, char **envp)
|
||||||
cpu_model = "any";
|
cpu_model = "any";
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
cpu_exec_init_all(0);
|
tcg_exec_init(0);
|
||||||
|
cpu_exec_init_all();
|
||||||
/* NOTE: we need to init the CPU at this stage to get
|
/* NOTE: we need to init the CPU at this stage to get
|
||||||
qemu_host_page_size */
|
qemu_host_page_size */
|
||||||
env = cpu_init(cpu_model);
|
env = cpu_init(cpu_model);
|
||||||
|
|
27
memory.c
27
memory.c
|
@ -22,12 +22,17 @@ unsigned memory_region_transaction_depth = 0;
|
||||||
|
|
||||||
typedef struct AddrRange AddrRange;
|
typedef struct AddrRange AddrRange;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Note using signed integers limits us to physical addresses at most
|
||||||
|
* 63 bits wide. They are needed for negative offsetting in aliases
|
||||||
|
* (large MemoryRegion::alias_offset).
|
||||||
|
*/
|
||||||
struct AddrRange {
|
struct AddrRange {
|
||||||
uint64_t start;
|
int64_t start;
|
||||||
uint64_t size;
|
int64_t size;
|
||||||
};
|
};
|
||||||
|
|
||||||
static AddrRange addrrange_make(uint64_t start, uint64_t size)
|
static AddrRange addrrange_make(int64_t start, int64_t size)
|
||||||
{
|
{
|
||||||
return (AddrRange) { start, size };
|
return (AddrRange) { start, size };
|
||||||
}
|
}
|
||||||
|
@ -37,7 +42,7 @@ static bool addrrange_equal(AddrRange r1, AddrRange r2)
|
||||||
return r1.start == r2.start && r1.size == r2.size;
|
return r1.start == r2.start && r1.size == r2.size;
|
||||||
}
|
}
|
||||||
|
|
||||||
static uint64_t addrrange_end(AddrRange r)
|
static int64_t addrrange_end(AddrRange r)
|
||||||
{
|
{
|
||||||
return r.start + r.size;
|
return r.start + r.size;
|
||||||
}
|
}
|
||||||
|
@ -56,9 +61,9 @@ static bool addrrange_intersects(AddrRange r1, AddrRange r2)
|
||||||
|
|
||||||
static AddrRange addrrange_intersection(AddrRange r1, AddrRange r2)
|
static AddrRange addrrange_intersection(AddrRange r1, AddrRange r2)
|
||||||
{
|
{
|
||||||
uint64_t start = MAX(r1.start, r2.start);
|
int64_t start = MAX(r1.start, r2.start);
|
||||||
/* off-by-one arithmetic to prevent overflow */
|
/* off-by-one arithmetic to prevent overflow */
|
||||||
uint64_t end = MIN(addrrange_end(r1) - 1, addrrange_end(r2) - 1);
|
int64_t end = MIN(addrrange_end(r1) - 1, addrrange_end(r2) - 1);
|
||||||
return addrrange_make(start, end - start + 1);
|
return addrrange_make(start, end - start + 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -245,6 +250,10 @@ static void as_memory_range_add(AddressSpace *as, FlatRange *fr)
|
||||||
|
|
||||||
static void as_memory_range_del(AddressSpace *as, FlatRange *fr)
|
static void as_memory_range_del(AddressSpace *as, FlatRange *fr)
|
||||||
{
|
{
|
||||||
|
if (fr->dirty_log_mask) {
|
||||||
|
cpu_physical_sync_dirty_bitmap(fr->addr.start,
|
||||||
|
fr->addr.start + fr->addr.size);
|
||||||
|
}
|
||||||
cpu_register_physical_memory(fr->addr.start, fr->addr.size,
|
cpu_register_physical_memory(fr->addr.start, fr->addr.size,
|
||||||
IO_MEM_UNASSIGNED);
|
IO_MEM_UNASSIGNED);
|
||||||
}
|
}
|
||||||
|
@ -407,8 +416,8 @@ static void render_memory_region(FlatView *view,
|
||||||
MemoryRegion *subregion;
|
MemoryRegion *subregion;
|
||||||
unsigned i;
|
unsigned i;
|
||||||
target_phys_addr_t offset_in_region;
|
target_phys_addr_t offset_in_region;
|
||||||
uint64_t remain;
|
int64_t remain;
|
||||||
uint64_t now;
|
int64_t now;
|
||||||
FlatRange fr;
|
FlatRange fr;
|
||||||
AddrRange tmp;
|
AddrRange tmp;
|
||||||
|
|
||||||
|
@ -482,7 +491,7 @@ static FlatView generate_memory_topology(MemoryRegion *mr)
|
||||||
|
|
||||||
flatview_init(&view);
|
flatview_init(&view);
|
||||||
|
|
||||||
render_memory_region(&view, mr, 0, addrrange_make(0, UINT64_MAX));
|
render_memory_region(&view, mr, 0, addrrange_make(0, INT64_MAX));
|
||||||
flatview_simplify(&view);
|
flatview_simplify(&view);
|
||||||
|
|
||||||
return view;
|
return view;
|
||||||
|
|
19
migration.c
19
migration.c
|
@ -292,18 +292,17 @@ int migrate_fd_cleanup(FdMigrationState *s)
|
||||||
ret = -1;
|
ret = -1;
|
||||||
}
|
}
|
||||||
s->file = NULL;
|
s->file = NULL;
|
||||||
|
} else {
|
||||||
|
if (s->mon) {
|
||||||
|
monitor_resume(s->mon);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (s->fd != -1)
|
if (s->fd != -1) {
|
||||||
close(s->fd);
|
close(s->fd);
|
||||||
|
s->fd = -1;
|
||||||
/* Don't resume monitor until we've flushed all of the buffers */
|
|
||||||
if (s->mon) {
|
|
||||||
monitor_resume(s->mon);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
s->fd = -1;
|
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -330,9 +329,6 @@ ssize_t migrate_fd_put_buffer(void *opaque, const void *data, size_t size)
|
||||||
if (ret == -EAGAIN) {
|
if (ret == -EAGAIN) {
|
||||||
qemu_set_fd_handler2(s->fd, NULL, NULL, migrate_fd_put_notify, s);
|
qemu_set_fd_handler2(s->fd, NULL, NULL, migrate_fd_put_notify, s);
|
||||||
} else if (ret < 0) {
|
} else if (ret < 0) {
|
||||||
if (s->mon) {
|
|
||||||
monitor_resume(s->mon);
|
|
||||||
}
|
|
||||||
s->state = MIG_STATE_ERROR;
|
s->state = MIG_STATE_ERROR;
|
||||||
notifier_list_notify(&migration_state_notifiers, NULL);
|
notifier_list_notify(&migration_state_notifiers, NULL);
|
||||||
}
|
}
|
||||||
|
@ -458,6 +454,9 @@ int migrate_fd_close(void *opaque)
|
||||||
{
|
{
|
||||||
FdMigrationState *s = opaque;
|
FdMigrationState *s = opaque;
|
||||||
|
|
||||||
|
if (s->mon) {
|
||||||
|
monitor_resume(s->mon);
|
||||||
|
}
|
||||||
qemu_set_fd_handler2(s->fd, NULL, NULL, NULL, NULL);
|
qemu_set_fd_handler2(s->fd, NULL, NULL, NULL, NULL);
|
||||||
return s->close(s);
|
return s->close(s);
|
||||||
}
|
}
|
||||||
|
|
10
net/socket.c
10
net/socket.c
|
@ -154,6 +154,12 @@ static int net_socket_mcast_create(struct sockaddr_in *mcastaddr, struct in_addr
|
||||||
struct ip_mreq imr;
|
struct ip_mreq imr;
|
||||||
int fd;
|
int fd;
|
||||||
int val, ret;
|
int val, ret;
|
||||||
|
#ifdef __OpenBSD__
|
||||||
|
unsigned char loop;
|
||||||
|
#else
|
||||||
|
int loop;
|
||||||
|
#endif
|
||||||
|
|
||||||
if (!IN_MULTICAST(ntohl(mcastaddr->sin_addr.s_addr))) {
|
if (!IN_MULTICAST(ntohl(mcastaddr->sin_addr.s_addr))) {
|
||||||
fprintf(stderr, "qemu: error: specified mcastaddr \"%s\" (0x%08x) does not contain a multicast address\n",
|
fprintf(stderr, "qemu: error: specified mcastaddr \"%s\" (0x%08x) does not contain a multicast address\n",
|
||||||
inet_ntoa(mcastaddr->sin_addr),
|
inet_ntoa(mcastaddr->sin_addr),
|
||||||
|
@ -197,9 +203,9 @@ static int net_socket_mcast_create(struct sockaddr_in *mcastaddr, struct in_addr
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Force mcast msgs to loopback (eg. several QEMUs in same host */
|
/* Force mcast msgs to loopback (eg. several QEMUs in same host */
|
||||||
val = 1;
|
loop = 1;
|
||||||
ret=setsockopt(fd, IPPROTO_IP, IP_MULTICAST_LOOP,
|
ret=setsockopt(fd, IPPROTO_IP, IP_MULTICAST_LOOP,
|
||||||
(const char *)&val, sizeof(val));
|
(const char *)&loop, sizeof(loop));
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
perror("setsockopt(SOL_IP, IP_MULTICAST_LOOP)");
|
perror("setsockopt(SOL_IP, IP_MULTICAST_LOOP)");
|
||||||
goto fail;
|
goto fail;
|
||||||
|
|
|
@ -28,6 +28,8 @@
|
||||||
#include "qemu-error.h"
|
#include "qemu-error.h"
|
||||||
|
|
||||||
#ifdef __NetBSD__
|
#ifdef __NetBSD__
|
||||||
|
#include <sys/ioctl.h>
|
||||||
|
#include <net/if.h>
|
||||||
#include <net/if_tap.h>
|
#include <net/if_tap.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -40,8 +42,12 @@
|
||||||
int tap_open(char *ifname, int ifname_size, int *vnet_hdr, int vnet_hdr_required)
|
int tap_open(char *ifname, int ifname_size, int *vnet_hdr, int vnet_hdr_required)
|
||||||
{
|
{
|
||||||
int fd;
|
int fd;
|
||||||
|
#ifdef TAPGIFNAME
|
||||||
|
struct ifreq ifr;
|
||||||
|
#else
|
||||||
char *dev;
|
char *dev;
|
||||||
struct stat s;
|
struct stat s;
|
||||||
|
#endif
|
||||||
|
|
||||||
#if defined(__FreeBSD__) || defined(__FreeBSD_kernel__) || defined(__OpenBSD__)
|
#if defined(__FreeBSD__) || defined(__FreeBSD_kernel__) || defined(__OpenBSD__)
|
||||||
/* if no ifname is given, always start the search from tap0/tun0. */
|
/* if no ifname is given, always start the search from tap0/tun0. */
|
||||||
|
@ -77,14 +83,30 @@ int tap_open(char *ifname, int ifname_size, int *vnet_hdr, int vnet_hdr_required
|
||||||
#else
|
#else
|
||||||
TFR(fd = open("/dev/tap", O_RDWR));
|
TFR(fd = open("/dev/tap", O_RDWR));
|
||||||
if (fd < 0) {
|
if (fd < 0) {
|
||||||
fprintf(stderr, "warning: could not open /dev/tap: no virtual network emulation\n");
|
fprintf(stderr,
|
||||||
|
"warning: could not open /dev/tap: no virtual network emulation: %s\n",
|
||||||
|
strerror(errno));
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
fstat(fd, &s);
|
#ifdef TAPGIFNAME
|
||||||
|
if (ioctl(fd, TAPGIFNAME, (void *)&ifr) < 0) {
|
||||||
|
fprintf(stderr, "warning: could not get tap name: %s\n",
|
||||||
|
strerror(errno));
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
pstrcpy(ifname, ifname_size, ifr.ifr_name);
|
||||||
|
#else
|
||||||
|
if (fstat(fd, &s) < 0) {
|
||||||
|
fprintf(stderr,
|
||||||
|
"warning: could not stat /dev/tap: no virtual network emulation: %s\n",
|
||||||
|
strerror(errno));
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
dev = devname(s.st_rdev, S_IFCHR);
|
dev = devname(s.st_rdev, S_IFCHR);
|
||||||
pstrcpy(ifname, ifname_size, dev);
|
pstrcpy(ifname, ifname_size, dev);
|
||||||
|
#endif
|
||||||
|
|
||||||
if (*vnet_hdr) {
|
if (*vnet_hdr) {
|
||||||
/* BSD doesn't have IFF_VNET_HDR */
|
/* BSD doesn't have IFF_VNET_HDR */
|
||||||
|
|
|
@ -270,7 +270,10 @@ typedef struct QEMUSGList QEMUSGList;
|
||||||
|
|
||||||
typedef uint64_t pcibus_t;
|
typedef uint64_t pcibus_t;
|
||||||
|
|
||||||
void cpu_exec_init_all(unsigned long tb_size);
|
void tcg_exec_init(unsigned long tb_size);
|
||||||
|
bool tcg_enabled(void);
|
||||||
|
|
||||||
|
void cpu_exec_init_all(void);
|
||||||
|
|
||||||
/* CPU save/load. */
|
/* CPU save/load. */
|
||||||
void cpu_save(QEMUFile *f, void *opaque);
|
void cpu_save(QEMUFile *f, void *opaque);
|
||||||
|
|
|
@ -288,6 +288,14 @@ then the modifier is Ctrl-Alt-Shift (instead of Ctrl-Alt) and if you use
|
||||||
@kindex Ctrl-Alt-f
|
@kindex Ctrl-Alt-f
|
||||||
Toggle full screen
|
Toggle full screen
|
||||||
|
|
||||||
|
@item Ctrl-Alt-+
|
||||||
|
@kindex Ctrl-Alt-+
|
||||||
|
Enlarge the screen
|
||||||
|
|
||||||
|
@item Ctrl-Alt--
|
||||||
|
@kindex Ctrl-Alt--
|
||||||
|
Shrink the screen
|
||||||
|
|
||||||
@item Ctrl-Alt-u
|
@item Ctrl-Alt-u
|
||||||
@kindex Ctrl-Alt-u
|
@kindex Ctrl-Alt-u
|
||||||
Restore the screen's un-scaled dimensions
|
Restore the screen's un-scaled dimensions
|
||||||
|
|
|
@ -24,9 +24,9 @@
|
||||||
|
|
||||||
#include "slirp.h"
|
#include "slirp.h"
|
||||||
|
|
||||||
void arp_table_add(Slirp *slirp, int ip_addr, uint8_t ethaddr[ETH_ALEN])
|
void arp_table_add(Slirp *slirp, uint32_t ip_addr, uint8_t ethaddr[ETH_ALEN])
|
||||||
{
|
{
|
||||||
const in_addr_t broadcast_addr =
|
const uint32_t broadcast_addr =
|
||||||
~slirp->vnetwork_mask.s_addr | slirp->vnetwork_addr.s_addr;
|
~slirp->vnetwork_mask.s_addr | slirp->vnetwork_addr.s_addr;
|
||||||
ArpTable *arptbl = &slirp->arp_table;
|
ArpTable *arptbl = &slirp->arp_table;
|
||||||
int i;
|
int i;
|
||||||
|
@ -60,29 +60,29 @@ void arp_table_add(Slirp *slirp, int ip_addr, uint8_t ethaddr[ETH_ALEN])
|
||||||
arptbl->next_victim = (arptbl->next_victim + 1) % ARP_TABLE_SIZE;
|
arptbl->next_victim = (arptbl->next_victim + 1) % ARP_TABLE_SIZE;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool arp_table_search(Slirp *slirp, int in_ip_addr,
|
bool arp_table_search(Slirp *slirp, uint32_t ip_addr,
|
||||||
uint8_t out_ethaddr[ETH_ALEN])
|
uint8_t out_ethaddr[ETH_ALEN])
|
||||||
{
|
{
|
||||||
const in_addr_t broadcast_addr =
|
const uint32_t broadcast_addr =
|
||||||
~slirp->vnetwork_mask.s_addr | slirp->vnetwork_addr.s_addr;
|
~slirp->vnetwork_mask.s_addr | slirp->vnetwork_addr.s_addr;
|
||||||
ArpTable *arptbl = &slirp->arp_table;
|
ArpTable *arptbl = &slirp->arp_table;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
DEBUG_CALL("arp_table_search");
|
DEBUG_CALL("arp_table_search");
|
||||||
DEBUG_ARG("ip = 0x%x", in_ip_addr);
|
DEBUG_ARG("ip = 0x%x", ip_addr);
|
||||||
|
|
||||||
/* Check 0.0.0.0/8 invalid source-only addresses */
|
/* Check 0.0.0.0/8 invalid source-only addresses */
|
||||||
assert((in_ip_addr & htonl(~(0xf << 28))) != 0);
|
assert((ip_addr & htonl(~(0xf << 28))) != 0);
|
||||||
|
|
||||||
/* If broadcast address */
|
/* If broadcast address */
|
||||||
if (in_ip_addr == 0xffffffff || in_ip_addr == broadcast_addr) {
|
if (ip_addr == 0xffffffff || ip_addr == broadcast_addr) {
|
||||||
/* return Ethernet broadcast address */
|
/* return Ethernet broadcast address */
|
||||||
memset(out_ethaddr, 0xff, ETH_ALEN);
|
memset(out_ethaddr, 0xff, ETH_ALEN);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (i = 0; i < ARP_TABLE_SIZE; i++) {
|
for (i = 0; i < ARP_TABLE_SIZE; i++) {
|
||||||
if (arptbl->table[i].ar_sip == in_ip_addr) {
|
if (arptbl->table[i].ar_sip == ip_addr) {
|
||||||
memcpy(out_ethaddr, arptbl->table[i].ar_sha, ETH_ALEN);
|
memcpy(out_ethaddr, arptbl->table[i].ar_sha, ETH_ALEN);
|
||||||
DEBUG_ARGS((dfd, " found hw addr = %02x:%02x:%02x:%02x:%02x:%02x\n",
|
DEBUG_ARGS((dfd, " found hw addr = %02x:%02x:%02x:%02x:%02x:%02x\n",
|
||||||
out_ethaddr[0], out_ethaddr[1], out_ethaddr[2],
|
out_ethaddr[0], out_ethaddr[1], out_ethaddr[2],
|
||||||
|
|
|
@ -106,9 +106,6 @@ if_output(struct socket *so, struct mbuf *ifm)
|
||||||
ifs_init(ifm);
|
ifs_init(ifm);
|
||||||
insque(ifm, ifq);
|
insque(ifm, ifq);
|
||||||
|
|
||||||
/* Expiration date = Now + 1 second */
|
|
||||||
ifm->expiration_date = qemu_get_clock_ns(rt_clock) + 1000000000ULL;
|
|
||||||
|
|
||||||
diddit:
|
diddit:
|
||||||
slirp->if_queued++;
|
slirp->if_queued++;
|
||||||
|
|
||||||
|
@ -157,9 +154,8 @@ diddit:
|
||||||
void
|
void
|
||||||
if_start(Slirp *slirp)
|
if_start(Slirp *slirp)
|
||||||
{
|
{
|
||||||
|
uint64_t now = qemu_get_clock_ns(rt_clock);
|
||||||
int requeued = 0;
|
int requeued = 0;
|
||||||
uint64_t now;
|
|
||||||
|
|
||||||
struct mbuf *ifm, *ifqt;
|
struct mbuf *ifm, *ifqt;
|
||||||
|
|
||||||
DEBUG_CALL("if_start");
|
DEBUG_CALL("if_start");
|
||||||
|
@ -172,8 +168,6 @@ if_start(Slirp *slirp)
|
||||||
if (!slirp_can_output(slirp->opaque))
|
if (!slirp_can_output(slirp->opaque))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
now = qemu_get_clock_ns(rt_clock);
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* See which queue to get next packet from
|
* See which queue to get next packet from
|
||||||
* If there's something in the fastq, select it immediately
|
* If there's something in the fastq, select it immediately
|
||||||
|
|
|
@ -738,6 +738,9 @@ int if_encap(Slirp *slirp, struct mbuf *ifm)
|
||||||
slirp->client_ipaddr = iph->ip_dst;
|
slirp->client_ipaddr = iph->ip_dst;
|
||||||
slirp_output(slirp->opaque, arp_req, sizeof(arp_req));
|
slirp_output(slirp->opaque, arp_req, sizeof(arp_req));
|
||||||
ifm->arp_requested = true;
|
ifm->arp_requested = true;
|
||||||
|
|
||||||
|
/* Expire request and drop outgoing packet after 1 second */
|
||||||
|
ifm->expiration_date = qemu_get_clock_ns(rt_clock) + 1000000000ULL;
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
} else {
|
} else {
|
||||||
|
|
|
@ -208,9 +208,9 @@ typedef struct ArpTable {
|
||||||
int next_victim;
|
int next_victim;
|
||||||
} ArpTable;
|
} ArpTable;
|
||||||
|
|
||||||
void arp_table_add(Slirp *slirp, int ip_addr, uint8_t ethaddr[ETH_ALEN]);
|
void arp_table_add(Slirp *slirp, uint32_t ip_addr, uint8_t ethaddr[ETH_ALEN]);
|
||||||
|
|
||||||
bool arp_table_search(Slirp *slirp, int in_ip_addr,
|
bool arp_table_search(Slirp *slirp, uint32_t ip_addr,
|
||||||
uint8_t out_ethaddr[ETH_ALEN]);
|
uint8_t out_ethaddr[ETH_ALEN]);
|
||||||
|
|
||||||
struct Slirp {
|
struct Slirp {
|
||||||
|
|
|
@ -426,7 +426,7 @@ int cpu_alpha_exec(CPUAlphaState *s);
|
||||||
int cpu_alpha_signal_handler(int host_signum, void *pinfo,
|
int cpu_alpha_signal_handler(int host_signum, void *pinfo,
|
||||||
void *puc);
|
void *puc);
|
||||||
int cpu_alpha_handle_mmu_fault (CPUState *env, uint64_t address, int rw,
|
int cpu_alpha_handle_mmu_fault (CPUState *env, uint64_t address, int rw,
|
||||||
int mmu_idx, int is_softmmu);
|
int mmu_idx);
|
||||||
#define cpu_handle_mmu_fault cpu_alpha_handle_mmu_fault
|
#define cpu_handle_mmu_fault cpu_alpha_handle_mmu_fault
|
||||||
void do_interrupt (CPUState *env);
|
void do_interrupt (CPUState *env);
|
||||||
|
|
||||||
|
|
|
@ -160,7 +160,7 @@ void cpu_alpha_store_fpcr (CPUState *env, uint64_t val)
|
||||||
|
|
||||||
#if defined(CONFIG_USER_ONLY)
|
#if defined(CONFIG_USER_ONLY)
|
||||||
int cpu_alpha_handle_mmu_fault (CPUState *env, target_ulong address, int rw,
|
int cpu_alpha_handle_mmu_fault (CPUState *env, target_ulong address, int rw,
|
||||||
int mmu_idx, int is_softmmu)
|
int mmu_idx)
|
||||||
{
|
{
|
||||||
env->exception_index = EXCP_MMFAULT;
|
env->exception_index = EXCP_MMFAULT;
|
||||||
env->trap_arg0 = address;
|
env->trap_arg0 = address;
|
||||||
|
@ -316,7 +316,7 @@ target_phys_addr_t cpu_get_phys_page_debug(CPUState *env, target_ulong addr)
|
||||||
}
|
}
|
||||||
|
|
||||||
int cpu_alpha_handle_mmu_fault(CPUState *env, target_ulong addr, int rw,
|
int cpu_alpha_handle_mmu_fault(CPUState *env, target_ulong addr, int rw,
|
||||||
int mmu_idx, int is_softmmu)
|
int mmu_idx)
|
||||||
{
|
{
|
||||||
target_ulong phys;
|
target_ulong phys;
|
||||||
int prot, fail;
|
int prot, fail;
|
||||||
|
|
|
@ -1344,7 +1344,7 @@ void tlb_fill (target_ulong addr, int is_write, int mmu_idx, void *retaddr)
|
||||||
generated code */
|
generated code */
|
||||||
saved_env = env;
|
saved_env = env;
|
||||||
env = cpu_single_env;
|
env = cpu_single_env;
|
||||||
ret = cpu_alpha_handle_mmu_fault(env, addr, is_write, mmu_idx, 1);
|
ret = cpu_alpha_handle_mmu_fault(env, addr, is_write, mmu_idx);
|
||||||
if (unlikely(ret != 0)) {
|
if (unlikely(ret != 0)) {
|
||||||
do_restore_state(retaddr);
|
do_restore_state(retaddr);
|
||||||
/* Exception index and error code are already set */
|
/* Exception index and error code are already set */
|
||||||
|
|
|
@ -244,7 +244,7 @@ uint32_t do_arm_semihosting(CPUARMState *env);
|
||||||
int cpu_arm_signal_handler(int host_signum, void *pinfo,
|
int cpu_arm_signal_handler(int host_signum, void *pinfo,
|
||||||
void *puc);
|
void *puc);
|
||||||
int cpu_arm_handle_mmu_fault (CPUARMState *env, target_ulong address, int rw,
|
int cpu_arm_handle_mmu_fault (CPUARMState *env, target_ulong address, int rw,
|
||||||
int mmu_idx, int is_softmuu);
|
int mmu_idx);
|
||||||
#define cpu_handle_mmu_fault cpu_arm_handle_mmu_fault
|
#define cpu_handle_mmu_fault cpu_arm_handle_mmu_fault
|
||||||
|
|
||||||
static inline void cpu_set_tls(CPUARMState *env, target_ulong newtls)
|
static inline void cpu_set_tls(CPUARMState *env, target_ulong newtls)
|
||||||
|
|
|
@ -542,7 +542,7 @@ void do_interrupt (CPUState *env)
|
||||||
}
|
}
|
||||||
|
|
||||||
int cpu_arm_handle_mmu_fault (CPUState *env, target_ulong address, int rw,
|
int cpu_arm_handle_mmu_fault (CPUState *env, target_ulong address, int rw,
|
||||||
int mmu_idx, int is_softmmu)
|
int mmu_idx)
|
||||||
{
|
{
|
||||||
if (rw == 2) {
|
if (rw == 2) {
|
||||||
env->exception_index = EXCP_PREFETCH_ABORT;
|
env->exception_index = EXCP_PREFETCH_ABORT;
|
||||||
|
@ -1254,7 +1254,7 @@ static inline int get_phys_addr(CPUState *env, uint32_t address,
|
||||||
}
|
}
|
||||||
|
|
||||||
int cpu_arm_handle_mmu_fault (CPUState *env, target_ulong address,
|
int cpu_arm_handle_mmu_fault (CPUState *env, target_ulong address,
|
||||||
int access_type, int mmu_idx, int is_softmmu)
|
int access_type, int mmu_idx)
|
||||||
{
|
{
|
||||||
uint32_t phys_addr;
|
uint32_t phys_addr;
|
||||||
target_ulong page_size;
|
target_ulong page_size;
|
||||||
|
|
|
@ -86,7 +86,7 @@ void tlb_fill (target_ulong addr, int is_write, int mmu_idx, void *retaddr)
|
||||||
generated code */
|
generated code */
|
||||||
saved_env = env;
|
saved_env = env;
|
||||||
env = cpu_single_env;
|
env = cpu_single_env;
|
||||||
ret = cpu_arm_handle_mmu_fault(env, addr, is_write, mmu_idx, 1);
|
ret = cpu_arm_handle_mmu_fault(env, addr, is_write, mmu_idx);
|
||||||
if (unlikely(ret)) {
|
if (unlikely(ret)) {
|
||||||
if (retaddr) {
|
if (retaddr) {
|
||||||
/* now we have a real cpu fault */
|
/* now we have a real cpu fault */
|
||||||
|
|
|
@ -226,7 +226,7 @@ static inline int cpu_mmu_index (CPUState *env)
|
||||||
}
|
}
|
||||||
|
|
||||||
int cpu_cris_handle_mmu_fault(CPUState *env, target_ulong address, int rw,
|
int cpu_cris_handle_mmu_fault(CPUState *env, target_ulong address, int rw,
|
||||||
int mmu_idx, int is_softmmu);
|
int mmu_idx);
|
||||||
#define cpu_handle_mmu_fault cpu_cris_handle_mmu_fault
|
#define cpu_handle_mmu_fault cpu_cris_handle_mmu_fault
|
||||||
|
|
||||||
#if defined(CONFIG_USER_ONLY)
|
#if defined(CONFIG_USER_ONLY)
|
||||||
|
|
|
@ -47,7 +47,7 @@ void do_interrupt (CPUState *env)
|
||||||
}
|
}
|
||||||
|
|
||||||
int cpu_cris_handle_mmu_fault(CPUState * env, target_ulong address, int rw,
|
int cpu_cris_handle_mmu_fault(CPUState * env, target_ulong address, int rw,
|
||||||
int mmu_idx, int is_softmmu)
|
int mmu_idx)
|
||||||
{
|
{
|
||||||
env->exception_index = 0xaa;
|
env->exception_index = 0xaa;
|
||||||
env->pregs[PR_EDA] = address;
|
env->pregs[PR_EDA] = address;
|
||||||
|
@ -68,7 +68,7 @@ static void cris_shift_ccs(CPUState *env)
|
||||||
}
|
}
|
||||||
|
|
||||||
int cpu_cris_handle_mmu_fault (CPUState *env, target_ulong address, int rw,
|
int cpu_cris_handle_mmu_fault (CPUState *env, target_ulong address, int rw,
|
||||||
int mmu_idx, int is_softmmu)
|
int mmu_idx)
|
||||||
{
|
{
|
||||||
struct cris_mmu_result res;
|
struct cris_mmu_result res;
|
||||||
int prot, miss;
|
int prot, miss;
|
||||||
|
@ -104,10 +104,9 @@ int cpu_cris_handle_mmu_fault (CPUState *env, target_ulong address, int rw,
|
||||||
r = 0;
|
r = 0;
|
||||||
}
|
}
|
||||||
if (r > 0)
|
if (r > 0)
|
||||||
D_LOG("%s returns %d irqreq=%x addr=%x"
|
D_LOG("%s returns %d irqreq=%x addr=%x phy=%x vec=%x pc=%x\n",
|
||||||
" phy=%x ismmu=%d vec=%x pc=%x\n",
|
__func__, r, env->interrupt_request, address, res.phy,
|
||||||
__func__, r, env->interrupt_request,
|
res.bf_vec, env->pc);
|
||||||
address, res.phy, is_softmmu, res.bf_vec, env->pc);
|
|
||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -70,7 +70,7 @@ void tlb_fill (target_ulong addr, int is_write, int mmu_idx, void *retaddr)
|
||||||
|
|
||||||
D_LOG("%s pc=%x tpc=%x ra=%x\n", __func__,
|
D_LOG("%s pc=%x tpc=%x ra=%x\n", __func__,
|
||||||
env->pc, env->debug1, retaddr);
|
env->pc, env->debug1, retaddr);
|
||||||
ret = cpu_cris_handle_mmu_fault(env, addr, is_write, mmu_idx, 1);
|
ret = cpu_cris_handle_mmu_fault(env, addr, is_write, mmu_idx);
|
||||||
if (unlikely(ret)) {
|
if (unlikely(ret)) {
|
||||||
if (retaddr) {
|
if (retaddr) {
|
||||||
/* now we have a real cpu fault */
|
/* now we have a real cpu fault */
|
||||||
|
|
|
@ -889,7 +889,7 @@ void host_cpuid(uint32_t function, uint32_t count,
|
||||||
|
|
||||||
/* helper.c */
|
/* helper.c */
|
||||||
int cpu_x86_handle_mmu_fault(CPUX86State *env, target_ulong addr,
|
int cpu_x86_handle_mmu_fault(CPUX86State *env, target_ulong addr,
|
||||||
int is_write, int mmu_idx, int is_softmmu);
|
int is_write, int mmu_idx);
|
||||||
#define cpu_handle_mmu_fault cpu_x86_handle_mmu_fault
|
#define cpu_handle_mmu_fault cpu_x86_handle_mmu_fault
|
||||||
void cpu_x86_set_a20(CPUX86State *env, int a20_state);
|
void cpu_x86_set_a20(CPUX86State *env, int a20_state);
|
||||||
|
|
||||||
|
|
|
@ -546,7 +546,7 @@ void cpu_x86_update_cr4(CPUX86State *env, uint32_t new_cr4)
|
||||||
#if defined(CONFIG_USER_ONLY)
|
#if defined(CONFIG_USER_ONLY)
|
||||||
|
|
||||||
int cpu_x86_handle_mmu_fault(CPUX86State *env, target_ulong addr,
|
int cpu_x86_handle_mmu_fault(CPUX86State *env, target_ulong addr,
|
||||||
int is_write, int mmu_idx, int is_softmmu)
|
int is_write, int mmu_idx)
|
||||||
{
|
{
|
||||||
/* user mode only emulation */
|
/* user mode only emulation */
|
||||||
is_write &= 1;
|
is_write &= 1;
|
||||||
|
@ -573,7 +573,7 @@ int cpu_x86_handle_mmu_fault(CPUX86State *env, target_ulong addr,
|
||||||
1 = generate PF fault
|
1 = generate PF fault
|
||||||
*/
|
*/
|
||||||
int cpu_x86_handle_mmu_fault(CPUX86State *env, target_ulong addr,
|
int cpu_x86_handle_mmu_fault(CPUX86State *env, target_ulong addr,
|
||||||
int is_write1, int mmu_idx, int is_softmmu)
|
int is_write1, int mmu_idx)
|
||||||
{
|
{
|
||||||
uint64_t ptep, pte;
|
uint64_t ptep, pte;
|
||||||
target_ulong pde_addr, pte_addr;
|
target_ulong pde_addr, pte_addr;
|
||||||
|
@ -1243,8 +1243,8 @@ CPUX86State *cpu_x86_init(const char *cpu_model)
|
||||||
cpu_exec_init(env);
|
cpu_exec_init(env);
|
||||||
env->cpu_model_str = cpu_model;
|
env->cpu_model_str = cpu_model;
|
||||||
|
|
||||||
/* init various static tables */
|
/* init various static tables used in TCG mode */
|
||||||
if (!inited) {
|
if (tcg_enabled() && !inited) {
|
||||||
inited = 1;
|
inited = 1;
|
||||||
optimize_flags_init();
|
optimize_flags_init();
|
||||||
#ifndef CONFIG_USER_ONLY
|
#ifndef CONFIG_USER_ONLY
|
||||||
|
|
|
@ -5009,7 +5009,7 @@ void tlb_fill(target_ulong addr, int is_write, int mmu_idx, void *retaddr)
|
||||||
saved_env = env;
|
saved_env = env;
|
||||||
env = cpu_single_env;
|
env = cpu_single_env;
|
||||||
|
|
||||||
ret = cpu_x86_handle_mmu_fault(env, addr, is_write, mmu_idx, 1);
|
ret = cpu_x86_handle_mmu_fault(env, addr, is_write, mmu_idx);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
if (retaddr) {
|
if (retaddr) {
|
||||||
/* now we have a real cpu fault */
|
/* now we have a real cpu fault */
|
||||||
|
|
|
@ -205,7 +205,7 @@ void cpu_lm32_set_phys_msb_ignore(CPUState *env, int value);
|
||||||
#define CPU_SAVE_VERSION 1
|
#define CPU_SAVE_VERSION 1
|
||||||
|
|
||||||
int cpu_lm32_handle_mmu_fault(CPUState *env, target_ulong address, int rw,
|
int cpu_lm32_handle_mmu_fault(CPUState *env, target_ulong address, int rw,
|
||||||
int mmu_idx, int is_softmmu);
|
int mmu_idx);
|
||||||
#define cpu_handle_mmu_fault cpu_lm32_handle_mmu_fault
|
#define cpu_handle_mmu_fault cpu_lm32_handle_mmu_fault
|
||||||
|
|
||||||
#if defined(CONFIG_USER_ONLY)
|
#if defined(CONFIG_USER_ONLY)
|
||||||
|
|
|
@ -26,7 +26,7 @@
|
||||||
#include "host-utils.h"
|
#include "host-utils.h"
|
||||||
|
|
||||||
int cpu_lm32_handle_mmu_fault(CPUState *env, target_ulong address, int rw,
|
int cpu_lm32_handle_mmu_fault(CPUState *env, target_ulong address, int rw,
|
||||||
int mmu_idx, int is_softmmu)
|
int mmu_idx)
|
||||||
{
|
{
|
||||||
int prot;
|
int prot;
|
||||||
|
|
||||||
|
|
|
@ -87,7 +87,7 @@ void tlb_fill(target_ulong addr, int is_write, int mmu_idx, void *retaddr)
|
||||||
saved_env = env;
|
saved_env = env;
|
||||||
env = cpu_single_env;
|
env = cpu_single_env;
|
||||||
|
|
||||||
ret = cpu_lm32_handle_mmu_fault(env, addr, is_write, mmu_idx, 1);
|
ret = cpu_lm32_handle_mmu_fault(env, addr, is_write, mmu_idx);
|
||||||
if (unlikely(ret)) {
|
if (unlikely(ret)) {
|
||||||
if (retaddr) {
|
if (retaddr) {
|
||||||
/* now we have a real cpu fault */
|
/* now we have a real cpu fault */
|
||||||
|
|
|
@ -231,7 +231,7 @@ static inline int cpu_mmu_index (CPUState *env)
|
||||||
}
|
}
|
||||||
|
|
||||||
int cpu_m68k_handle_mmu_fault(CPUState *env, target_ulong address, int rw,
|
int cpu_m68k_handle_mmu_fault(CPUState *env, target_ulong address, int rw,
|
||||||
int mmu_idx, int is_softmmu);
|
int mmu_idx);
|
||||||
#define cpu_handle_mmu_fault cpu_m68k_handle_mmu_fault
|
#define cpu_handle_mmu_fault cpu_m68k_handle_mmu_fault
|
||||||
|
|
||||||
#if defined(CONFIG_USER_ONLY)
|
#if defined(CONFIG_USER_ONLY)
|
||||||
|
|
|
@ -344,7 +344,7 @@ void m68k_switch_sp(CPUM68KState *env)
|
||||||
#if defined(CONFIG_USER_ONLY)
|
#if defined(CONFIG_USER_ONLY)
|
||||||
|
|
||||||
int cpu_m68k_handle_mmu_fault (CPUState *env, target_ulong address, int rw,
|
int cpu_m68k_handle_mmu_fault (CPUState *env, target_ulong address, int rw,
|
||||||
int mmu_idx, int is_softmmu)
|
int mmu_idx)
|
||||||
{
|
{
|
||||||
env->exception_index = EXCP_ACCESS;
|
env->exception_index = EXCP_ACCESS;
|
||||||
env->mmu.ar = address;
|
env->mmu.ar = address;
|
||||||
|
@ -362,7 +362,7 @@ target_phys_addr_t cpu_get_phys_page_debug(CPUState *env, target_ulong addr)
|
||||||
}
|
}
|
||||||
|
|
||||||
int cpu_m68k_handle_mmu_fault (CPUState *env, target_ulong address, int rw,
|
int cpu_m68k_handle_mmu_fault (CPUState *env, target_ulong address, int rw,
|
||||||
int mmu_idx, int is_softmmu)
|
int mmu_idx)
|
||||||
{
|
{
|
||||||
int prot;
|
int prot;
|
||||||
|
|
||||||
|
|
|
@ -66,7 +66,7 @@ void tlb_fill (target_ulong addr, int is_write, int mmu_idx, void *retaddr)
|
||||||
generated code */
|
generated code */
|
||||||
saved_env = env;
|
saved_env = env;
|
||||||
env = cpu_single_env;
|
env = cpu_single_env;
|
||||||
ret = cpu_m68k_handle_mmu_fault(env, addr, is_write, mmu_idx, 1);
|
ret = cpu_m68k_handle_mmu_fault(env, addr, is_write, mmu_idx);
|
||||||
if (unlikely(ret)) {
|
if (unlikely(ret)) {
|
||||||
if (retaddr) {
|
if (retaddr) {
|
||||||
/* now we have a real cpu fault */
|
/* now we have a real cpu fault */
|
||||||
|
|
|
@ -309,7 +309,7 @@ static inline int cpu_mmu_index (CPUState *env)
|
||||||
}
|
}
|
||||||
|
|
||||||
int cpu_mb_handle_mmu_fault(CPUState *env, target_ulong address, int rw,
|
int cpu_mb_handle_mmu_fault(CPUState *env, target_ulong address, int rw,
|
||||||
int mmu_idx, int is_softmmu);
|
int mmu_idx);
|
||||||
#define cpu_handle_mmu_fault cpu_mb_handle_mmu_fault
|
#define cpu_handle_mmu_fault cpu_mb_handle_mmu_fault
|
||||||
|
|
||||||
#if defined(CONFIG_USER_ONLY)
|
#if defined(CONFIG_USER_ONLY)
|
||||||
|
|
|
@ -37,7 +37,7 @@ void do_interrupt (CPUState *env)
|
||||||
}
|
}
|
||||||
|
|
||||||
int cpu_mb_handle_mmu_fault(CPUState * env, target_ulong address, int rw,
|
int cpu_mb_handle_mmu_fault(CPUState * env, target_ulong address, int rw,
|
||||||
int mmu_idx, int is_softmmu)
|
int mmu_idx)
|
||||||
{
|
{
|
||||||
env->exception_index = 0xaa;
|
env->exception_index = 0xaa;
|
||||||
cpu_dump_state(env, stderr, fprintf, 0);
|
cpu_dump_state(env, stderr, fprintf, 0);
|
||||||
|
@ -47,7 +47,7 @@ int cpu_mb_handle_mmu_fault(CPUState * env, target_ulong address, int rw,
|
||||||
#else /* !CONFIG_USER_ONLY */
|
#else /* !CONFIG_USER_ONLY */
|
||||||
|
|
||||||
int cpu_mb_handle_mmu_fault (CPUState *env, target_ulong address, int rw,
|
int cpu_mb_handle_mmu_fault (CPUState *env, target_ulong address, int rw,
|
||||||
int mmu_idx, int is_softmmu)
|
int mmu_idx)
|
||||||
{
|
{
|
||||||
unsigned int hit;
|
unsigned int hit;
|
||||||
unsigned int mmu_available;
|
unsigned int mmu_available;
|
||||||
|
|
|
@ -54,7 +54,7 @@ void tlb_fill (target_ulong addr, int is_write, int mmu_idx, void *retaddr)
|
||||||
saved_env = env;
|
saved_env = env;
|
||||||
env = cpu_single_env;
|
env = cpu_single_env;
|
||||||
|
|
||||||
ret = cpu_mb_handle_mmu_fault(env, addr, is_write, mmu_idx, 1);
|
ret = cpu_mb_handle_mmu_fault(env, addr, is_write, mmu_idx);
|
||||||
if (unlikely(ret)) {
|
if (unlikely(ret)) {
|
||||||
if (retaddr) {
|
if (retaddr) {
|
||||||
/* now we have a real cpu fault */
|
/* now we have a real cpu fault */
|
||||||
|
|
|
@ -636,7 +636,7 @@ void cpu_mips_soft_irq(CPUState *env, int irq, int level);
|
||||||
|
|
||||||
/* helper.c */
|
/* helper.c */
|
||||||
int cpu_mips_handle_mmu_fault (CPUState *env, target_ulong address, int rw,
|
int cpu_mips_handle_mmu_fault (CPUState *env, target_ulong address, int rw,
|
||||||
int mmu_idx, int is_softmmu);
|
int mmu_idx);
|
||||||
#define cpu_handle_mmu_fault cpu_mips_handle_mmu_fault
|
#define cpu_handle_mmu_fault cpu_mips_handle_mmu_fault
|
||||||
void do_interrupt (CPUState *env);
|
void do_interrupt (CPUState *env);
|
||||||
#if !defined(CONFIG_USER_ONLY)
|
#if !defined(CONFIG_USER_ONLY)
|
||||||
|
|
|
@ -266,7 +266,7 @@ target_phys_addr_t cpu_get_phys_page_debug(CPUState *env, target_ulong addr)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
int cpu_mips_handle_mmu_fault (CPUState *env, target_ulong address, int rw,
|
int cpu_mips_handle_mmu_fault (CPUState *env, target_ulong address, int rw,
|
||||||
int mmu_idx, int is_softmmu)
|
int mmu_idx)
|
||||||
{
|
{
|
||||||
#if !defined(CONFIG_USER_ONLY)
|
#if !defined(CONFIG_USER_ONLY)
|
||||||
target_phys_addr_t physical;
|
target_phys_addr_t physical;
|
||||||
|
@ -278,8 +278,8 @@ int cpu_mips_handle_mmu_fault (CPUState *env, target_ulong address, int rw,
|
||||||
#if 0
|
#if 0
|
||||||
log_cpu_state(env, 0);
|
log_cpu_state(env, 0);
|
||||||
#endif
|
#endif
|
||||||
qemu_log("%s pc " TARGET_FMT_lx " ad " TARGET_FMT_lx " rw %d mmu_idx %d smmu %d\n",
|
qemu_log("%s pc " TARGET_FMT_lx " ad " TARGET_FMT_lx " rw %d mmu_idx %d\n",
|
||||||
__func__, env->active_tc.PC, address, rw, mmu_idx, is_softmmu);
|
__func__, env->active_tc.PC, address, rw, mmu_idx);
|
||||||
|
|
||||||
rw &= 1;
|
rw &= 1;
|
||||||
|
|
||||||
|
|
|
@ -2017,7 +2017,7 @@ void tlb_fill (target_ulong addr, int is_write, int mmu_idx, void *retaddr)
|
||||||
generated code */
|
generated code */
|
||||||
saved_env = env;
|
saved_env = env;
|
||||||
env = cpu_single_env;
|
env = cpu_single_env;
|
||||||
ret = cpu_mips_handle_mmu_fault(env, addr, is_write, mmu_idx, 1);
|
ret = cpu_mips_handle_mmu_fault(env, addr, is_write, mmu_idx);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
if (retaddr) {
|
if (retaddr) {
|
||||||
/* now we have a real cpu fault */
|
/* now we have a real cpu fault */
|
||||||
|
|
|
@ -1022,7 +1022,7 @@ void cpu_ppc_close (CPUPPCState *s);
|
||||||
int cpu_ppc_signal_handler (int host_signum, void *pinfo,
|
int cpu_ppc_signal_handler (int host_signum, void *pinfo,
|
||||||
void *puc);
|
void *puc);
|
||||||
int cpu_ppc_handle_mmu_fault (CPUPPCState *env, target_ulong address, int rw,
|
int cpu_ppc_handle_mmu_fault (CPUPPCState *env, target_ulong address, int rw,
|
||||||
int mmu_idx, int is_softmmu);
|
int mmu_idx);
|
||||||
#define cpu_handle_mmu_fault cpu_ppc_handle_mmu_fault
|
#define cpu_handle_mmu_fault cpu_ppc_handle_mmu_fault
|
||||||
#if !defined(CONFIG_USER_ONLY)
|
#if !defined(CONFIG_USER_ONLY)
|
||||||
int get_physical_address (CPUPPCState *env, mmu_ctx_t *ctx, target_ulong vaddr,
|
int get_physical_address (CPUPPCState *env, mmu_ctx_t *ctx, target_ulong vaddr,
|
||||||
|
|
|
@ -78,7 +78,7 @@ void (*cpu_ppc_hypercall)(CPUState *);
|
||||||
|
|
||||||
#if defined(CONFIG_USER_ONLY)
|
#if defined(CONFIG_USER_ONLY)
|
||||||
int cpu_ppc_handle_mmu_fault (CPUState *env, target_ulong address, int rw,
|
int cpu_ppc_handle_mmu_fault (CPUState *env, target_ulong address, int rw,
|
||||||
int mmu_idx, int is_softmmu)
|
int mmu_idx)
|
||||||
{
|
{
|
||||||
int exception, error_code;
|
int exception, error_code;
|
||||||
|
|
||||||
|
@ -1658,7 +1658,7 @@ static void booke206_update_mas_tlb_miss(CPUState *env, target_ulong address,
|
||||||
|
|
||||||
/* Perform address translation */
|
/* Perform address translation */
|
||||||
int cpu_ppc_handle_mmu_fault (CPUState *env, target_ulong address, int rw,
|
int cpu_ppc_handle_mmu_fault (CPUState *env, target_ulong address, int rw,
|
||||||
int mmu_idx, int is_softmmu)
|
int mmu_idx)
|
||||||
{
|
{
|
||||||
mmu_ctx_t ctx;
|
mmu_ctx_t ctx;
|
||||||
int access_type;
|
int access_type;
|
||||||
|
@ -3091,7 +3091,9 @@ CPUPPCState *cpu_ppc_init (const char *cpu_model)
|
||||||
|
|
||||||
env = qemu_mallocz(sizeof(CPUPPCState));
|
env = qemu_mallocz(sizeof(CPUPPCState));
|
||||||
cpu_exec_init(env);
|
cpu_exec_init(env);
|
||||||
ppc_translate_init();
|
if (tcg_enabled()) {
|
||||||
|
ppc_translate_init();
|
||||||
|
}
|
||||||
env->cpu_model_str = cpu_model;
|
env->cpu_model_str = cpu_model;
|
||||||
cpu_ppc_register_internal(env, def);
|
cpu_ppc_register_internal(env, def);
|
||||||
|
|
||||||
|
|
|
@ -3725,7 +3725,7 @@ void tlb_fill (target_ulong addr, int is_write, int mmu_idx, void *retaddr)
|
||||||
generated code */
|
generated code */
|
||||||
saved_env = env;
|
saved_env = env;
|
||||||
env = cpu_single_env;
|
env = cpu_single_env;
|
||||||
ret = cpu_ppc_handle_mmu_fault(env, addr, is_write, mmu_idx, 1);
|
ret = cpu_ppc_handle_mmu_fault(env, addr, is_write, mmu_idx);
|
||||||
if (unlikely(ret != 0)) {
|
if (unlikely(ret != 0)) {
|
||||||
if (likely(retaddr)) {
|
if (likely(retaddr)) {
|
||||||
/* now we have a real cpu fault */
|
/* now we have a real cpu fault */
|
||||||
|
|
|
@ -280,7 +280,7 @@ void do_interrupt (CPUState *env);
|
||||||
int cpu_s390x_signal_handler(int host_signum, void *pinfo,
|
int cpu_s390x_signal_handler(int host_signum, void *pinfo,
|
||||||
void *puc);
|
void *puc);
|
||||||
int cpu_s390x_handle_mmu_fault (CPUS390XState *env, target_ulong address, int rw,
|
int cpu_s390x_handle_mmu_fault (CPUS390XState *env, target_ulong address, int rw,
|
||||||
int mmu_idx, int is_softmuu);
|
int mmu_idx);
|
||||||
#define cpu_handle_mmu_fault cpu_s390x_handle_mmu_fault
|
#define cpu_handle_mmu_fault cpu_s390x_handle_mmu_fault
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -81,7 +81,7 @@ CPUS390XState *cpu_s390x_init(const char *cpu_model)
|
||||||
|
|
||||||
env = qemu_mallocz(sizeof(CPUS390XState));
|
env = qemu_mallocz(sizeof(CPUS390XState));
|
||||||
cpu_exec_init(env);
|
cpu_exec_init(env);
|
||||||
if (!inited) {
|
if (tcg_enabled() && !inited) {
|
||||||
inited = 1;
|
inited = 1;
|
||||||
s390x_translate_init();
|
s390x_translate_init();
|
||||||
}
|
}
|
||||||
|
@ -110,10 +110,10 @@ void do_interrupt (CPUState *env)
|
||||||
}
|
}
|
||||||
|
|
||||||
int cpu_s390x_handle_mmu_fault (CPUState *env, target_ulong address, int rw,
|
int cpu_s390x_handle_mmu_fault (CPUState *env, target_ulong address, int rw,
|
||||||
int mmu_idx, int is_softmmu)
|
int mmu_idx)
|
||||||
{
|
{
|
||||||
/* fprintf(stderr,"%s: address 0x%lx rw %d mmu_idx %d is_softmmu %d\n",
|
/* fprintf(stderr,"%s: address 0x%lx rw %d mmu_idx %d\n",
|
||||||
__FUNCTION__, address, rw, mmu_idx, is_softmmu); */
|
__FUNCTION__, address, rw, mmu_idx); */
|
||||||
env->exception_index = EXCP_ADDR;
|
env->exception_index = EXCP_ADDR;
|
||||||
env->__excp_addr = address; /* FIXME: find out how this works on a real machine */
|
env->__excp_addr = address; /* FIXME: find out how this works on a real machine */
|
||||||
return 1;
|
return 1;
|
||||||
|
@ -394,14 +394,14 @@ out:
|
||||||
}
|
}
|
||||||
|
|
||||||
int cpu_s390x_handle_mmu_fault (CPUState *env, target_ulong _vaddr, int rw,
|
int cpu_s390x_handle_mmu_fault (CPUState *env, target_ulong _vaddr, int rw,
|
||||||
int mmu_idx, int is_softmmu)
|
int mmu_idx)
|
||||||
{
|
{
|
||||||
uint64_t asc = env->psw.mask & PSW_MASK_ASC;
|
uint64_t asc = env->psw.mask & PSW_MASK_ASC;
|
||||||
target_ulong vaddr, raddr;
|
target_ulong vaddr, raddr;
|
||||||
int prot;
|
int prot;
|
||||||
|
|
||||||
DPRINTF("%s: address 0x%" PRIx64 " rw %d mmu_idx %d is_softmmu %d\n",
|
DPRINTF("%s: address 0x%" PRIx64 " rw %d mmu_idx %d\n",
|
||||||
__FUNCTION__, _vaddr, rw, mmu_idx, is_softmmu);
|
__FUNCTION__, _vaddr, rw, mmu_idx);
|
||||||
|
|
||||||
_vaddr &= TARGET_PAGE_MASK;
|
_vaddr &= TARGET_PAGE_MASK;
|
||||||
vaddr = _vaddr;
|
vaddr = _vaddr;
|
||||||
|
|
|
@ -63,7 +63,7 @@ void tlb_fill (target_ulong addr, int is_write, int mmu_idx, void *retaddr)
|
||||||
generated code */
|
generated code */
|
||||||
saved_env = env;
|
saved_env = env;
|
||||||
env = cpu_single_env;
|
env = cpu_single_env;
|
||||||
ret = cpu_s390x_handle_mmu_fault(env, addr, is_write, mmu_idx, 1);
|
ret = cpu_s390x_handle_mmu_fault(env, addr, is_write, mmu_idx);
|
||||||
if (unlikely(ret != 0)) {
|
if (unlikely(ret != 0)) {
|
||||||
if (likely(retaddr)) {
|
if (likely(retaddr)) {
|
||||||
/* now we have a real cpu fault */
|
/* now we have a real cpu fault */
|
||||||
|
|
|
@ -194,7 +194,7 @@ int cpu_sh4_exec(CPUSH4State * s);
|
||||||
int cpu_sh4_signal_handler(int host_signum, void *pinfo,
|
int cpu_sh4_signal_handler(int host_signum, void *pinfo,
|
||||||
void *puc);
|
void *puc);
|
||||||
int cpu_sh4_handle_mmu_fault(CPUSH4State * env, target_ulong address, int rw,
|
int cpu_sh4_handle_mmu_fault(CPUSH4State * env, target_ulong address, int rw,
|
||||||
int mmu_idx, int is_softmmu);
|
int mmu_idx);
|
||||||
#define cpu_handle_mmu_fault cpu_sh4_handle_mmu_fault
|
#define cpu_handle_mmu_fault cpu_sh4_handle_mmu_fault
|
||||||
void do_interrupt(CPUSH4State * env);
|
void do_interrupt(CPUSH4State * env);
|
||||||
|
|
||||||
|
|
|
@ -34,7 +34,7 @@ void do_interrupt (CPUState *env)
|
||||||
}
|
}
|
||||||
|
|
||||||
int cpu_sh4_handle_mmu_fault(CPUState * env, target_ulong address, int rw,
|
int cpu_sh4_handle_mmu_fault(CPUState * env, target_ulong address, int rw,
|
||||||
int mmu_idx, int is_softmmu)
|
int mmu_idx)
|
||||||
{
|
{
|
||||||
env->tea = address;
|
env->tea = address;
|
||||||
env->exception_index = -1;
|
env->exception_index = -1;
|
||||||
|
@ -440,7 +440,7 @@ static int get_physical_address(CPUState * env, target_ulong * physical,
|
||||||
}
|
}
|
||||||
|
|
||||||
int cpu_sh4_handle_mmu_fault(CPUState * env, target_ulong address, int rw,
|
int cpu_sh4_handle_mmu_fault(CPUState * env, target_ulong address, int rw,
|
||||||
int mmu_idx, int is_softmmu)
|
int mmu_idx)
|
||||||
{
|
{
|
||||||
target_ulong physical;
|
target_ulong physical;
|
||||||
int prot, ret, access_type;
|
int prot, ret, access_type;
|
||||||
|
|
|
@ -64,7 +64,7 @@ void tlb_fill(target_ulong addr, int is_write, int mmu_idx, void *retaddr)
|
||||||
generated code */
|
generated code */
|
||||||
saved_env = env;
|
saved_env = env;
|
||||||
env = cpu_single_env;
|
env = cpu_single_env;
|
||||||
ret = cpu_sh4_handle_mmu_fault(env, addr, is_write, mmu_idx, 1);
|
ret = cpu_sh4_handle_mmu_fault(env, addr, is_write, mmu_idx);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
/* now we have a real cpu fault */
|
/* now we have a real cpu fault */
|
||||||
cpu_restore_state_from_retaddr(retaddr);
|
cpu_restore_state_from_retaddr(retaddr);
|
||||||
|
|
|
@ -490,7 +490,7 @@ CPUSPARCState *cpu_sparc_init(const char *cpu_model);
|
||||||
void cpu_sparc_set_id(CPUSPARCState *env, unsigned int cpu);
|
void cpu_sparc_set_id(CPUSPARCState *env, unsigned int cpu);
|
||||||
void sparc_cpu_list(FILE *f, fprintf_function cpu_fprintf);
|
void sparc_cpu_list(FILE *f, fprintf_function cpu_fprintf);
|
||||||
int cpu_sparc_handle_mmu_fault(CPUSPARCState *env1, target_ulong address, int rw,
|
int cpu_sparc_handle_mmu_fault(CPUSPARCState *env1, target_ulong address, int rw,
|
||||||
int mmu_idx, int is_softmmu);
|
int mmu_idx);
|
||||||
#define cpu_handle_mmu_fault cpu_sparc_handle_mmu_fault
|
#define cpu_handle_mmu_fault cpu_sparc_handle_mmu_fault
|
||||||
target_ulong mmu_probe(CPUSPARCState *env, target_ulong address, int mmulev);
|
target_ulong mmu_probe(CPUSPARCState *env, target_ulong address, int mmulev);
|
||||||
void dump_mmu(FILE *f, fprintf_function cpu_fprintf, CPUState *env);
|
void dump_mmu(FILE *f, fprintf_function cpu_fprintf, CPUState *env);
|
||||||
|
|
|
@ -42,7 +42,7 @@ static int cpu_sparc_find_by_name(sparc_def_t *cpu_def, const char *cpu_model);
|
||||||
#if defined(CONFIG_USER_ONLY)
|
#if defined(CONFIG_USER_ONLY)
|
||||||
|
|
||||||
int cpu_sparc_handle_mmu_fault(CPUState *env1, target_ulong address, int rw,
|
int cpu_sparc_handle_mmu_fault(CPUState *env1, target_ulong address, int rw,
|
||||||
int mmu_idx, int is_softmmu)
|
int mmu_idx)
|
||||||
{
|
{
|
||||||
if (rw & 2)
|
if (rw & 2)
|
||||||
env1->exception_index = TT_TFAULT;
|
env1->exception_index = TT_TFAULT;
|
||||||
|
@ -212,7 +212,7 @@ static int get_physical_address(CPUState *env, target_phys_addr_t *physical,
|
||||||
|
|
||||||
/* Perform address translation */
|
/* Perform address translation */
|
||||||
int cpu_sparc_handle_mmu_fault (CPUState *env, target_ulong address, int rw,
|
int cpu_sparc_handle_mmu_fault (CPUState *env, target_ulong address, int rw,
|
||||||
int mmu_idx, int is_softmmu)
|
int mmu_idx)
|
||||||
{
|
{
|
||||||
target_phys_addr_t paddr;
|
target_phys_addr_t paddr;
|
||||||
target_ulong vaddr;
|
target_ulong vaddr;
|
||||||
|
@ -638,7 +638,7 @@ static int get_physical_address(CPUState *env, target_phys_addr_t *physical,
|
||||||
|
|
||||||
/* Perform address translation */
|
/* Perform address translation */
|
||||||
int cpu_sparc_handle_mmu_fault (CPUState *env, target_ulong address, int rw,
|
int cpu_sparc_handle_mmu_fault (CPUState *env, target_ulong address, int rw,
|
||||||
int mmu_idx, int is_softmmu)
|
int mmu_idx)
|
||||||
{
|
{
|
||||||
target_ulong virt_addr, vaddr;
|
target_ulong virt_addr, vaddr;
|
||||||
target_phys_addr_t paddr;
|
target_phys_addr_t paddr;
|
||||||
|
|
|
@ -4237,7 +4237,7 @@ void tlb_fill(target_ulong addr, int is_write, int mmu_idx, void *retaddr)
|
||||||
saved_env = env;
|
saved_env = env;
|
||||||
env = cpu_single_env;
|
env = cpu_single_env;
|
||||||
|
|
||||||
ret = cpu_sparc_handle_mmu_fault(env, addr, is_write, mmu_idx, 1);
|
ret = cpu_sparc_handle_mmu_fault(env, addr, is_write, mmu_idx);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
cpu_restore_state2(retaddr);
|
cpu_restore_state2(retaddr);
|
||||||
cpu_loop_exit(env);
|
cpu_loop_exit(env);
|
||||||
|
|
|
@ -1286,7 +1286,6 @@ static inline void gen_cond_reg(TCGv r_dst, int cond, TCGv r_src)
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* XXX: potentially incorrect if dynamic npc */
|
|
||||||
static void do_branch(DisasContext *dc, int32_t offset, uint32_t insn, int cc,
|
static void do_branch(DisasContext *dc, int32_t offset, uint32_t insn, int cc,
|
||||||
TCGv r_cond)
|
TCGv r_cond)
|
||||||
{
|
{
|
||||||
|
@ -1321,13 +1320,17 @@ static void do_branch(DisasContext *dc, int32_t offset, uint32_t insn, int cc,
|
||||||
} else {
|
} else {
|
||||||
dc->pc = dc->npc;
|
dc->pc = dc->npc;
|
||||||
dc->jump_pc[0] = target;
|
dc->jump_pc[0] = target;
|
||||||
dc->jump_pc[1] = dc->npc + 4;
|
if (unlikely(dc->npc == DYNAMIC_PC)) {
|
||||||
dc->npc = JUMP_PC;
|
dc->jump_pc[1] = DYNAMIC_PC;
|
||||||
|
tcg_gen_addi_tl(cpu_pc, cpu_npc, 4);
|
||||||
|
} else {
|
||||||
|
dc->jump_pc[1] = dc->npc + 4;
|
||||||
|
dc->npc = JUMP_PC;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* XXX: potentially incorrect if dynamic npc */
|
|
||||||
static void do_fbranch(DisasContext *dc, int32_t offset, uint32_t insn, int cc,
|
static void do_fbranch(DisasContext *dc, int32_t offset, uint32_t insn, int cc,
|
||||||
TCGv r_cond)
|
TCGv r_cond)
|
||||||
{
|
{
|
||||||
|
@ -1362,14 +1365,18 @@ static void do_fbranch(DisasContext *dc, int32_t offset, uint32_t insn, int cc,
|
||||||
} else {
|
} else {
|
||||||
dc->pc = dc->npc;
|
dc->pc = dc->npc;
|
||||||
dc->jump_pc[0] = target;
|
dc->jump_pc[0] = target;
|
||||||
dc->jump_pc[1] = dc->npc + 4;
|
if (unlikely(dc->npc == DYNAMIC_PC)) {
|
||||||
dc->npc = JUMP_PC;
|
dc->jump_pc[1] = DYNAMIC_PC;
|
||||||
|
tcg_gen_addi_tl(cpu_pc, cpu_npc, 4);
|
||||||
|
} else {
|
||||||
|
dc->jump_pc[1] = dc->npc + 4;
|
||||||
|
dc->npc = JUMP_PC;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef TARGET_SPARC64
|
#ifdef TARGET_SPARC64
|
||||||
/* XXX: potentially incorrect if dynamic npc */
|
|
||||||
static void do_branch_reg(DisasContext *dc, int32_t offset, uint32_t insn,
|
static void do_branch_reg(DisasContext *dc, int32_t offset, uint32_t insn,
|
||||||
TCGv r_cond, TCGv r_reg)
|
TCGv r_cond, TCGv r_reg)
|
||||||
{
|
{
|
||||||
|
@ -1384,8 +1391,13 @@ static void do_branch_reg(DisasContext *dc, int32_t offset, uint32_t insn,
|
||||||
} else {
|
} else {
|
||||||
dc->pc = dc->npc;
|
dc->pc = dc->npc;
|
||||||
dc->jump_pc[0] = target;
|
dc->jump_pc[0] = target;
|
||||||
dc->jump_pc[1] = dc->npc + 4;
|
if (unlikely(dc->npc == DYNAMIC_PC)) {
|
||||||
dc->npc = JUMP_PC;
|
dc->jump_pc[1] = DYNAMIC_PC;
|
||||||
|
tcg_gen_addi_tl(cpu_pc, cpu_npc, 4);
|
||||||
|
} else {
|
||||||
|
dc->jump_pc[1] = dc->npc + 4;
|
||||||
|
dc->npc = JUMP_PC;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -130,7 +130,7 @@ CPUState *uc32_cpu_init(const char *cpu_model);
|
||||||
int uc32_cpu_exec(CPUState *s);
|
int uc32_cpu_exec(CPUState *s);
|
||||||
int uc32_cpu_signal_handler(int host_signum, void *pinfo, void *puc);
|
int uc32_cpu_signal_handler(int host_signum, void *pinfo, void *puc);
|
||||||
int uc32_cpu_handle_mmu_fault(CPUState *env, target_ulong address, int rw,
|
int uc32_cpu_handle_mmu_fault(CPUState *env, target_ulong address, int rw,
|
||||||
int mmu_idx, int is_softmuu);
|
int mmu_idx);
|
||||||
|
|
||||||
#define CPU_SAVE_VERSION 2
|
#define CPU_SAVE_VERSION 2
|
||||||
|
|
||||||
|
|
|
@ -104,7 +104,7 @@ void do_interrupt(CPUState *env)
|
||||||
}
|
}
|
||||||
|
|
||||||
int uc32_cpu_handle_mmu_fault(CPUState *env, target_ulong address, int rw,
|
int uc32_cpu_handle_mmu_fault(CPUState *env, target_ulong address, int rw,
|
||||||
int mmu_idx, int is_softmmu)
|
int mmu_idx)
|
||||||
{
|
{
|
||||||
env->exception_index = UC32_EXCP_TRAP;
|
env->exception_index = UC32_EXCP_TRAP;
|
||||||
env->cp0.c4_faultaddr = address;
|
env->cp0.c4_faultaddr = address;
|
||||||
|
|
|
@ -185,12 +185,15 @@ static int op_to_movi(int op)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void tcg_opt_gen_mov(TCGArg *gen_args, TCGArg dst, TCGArg src,
|
static void tcg_opt_gen_mov(TCGContext *s, TCGArg *gen_args, TCGArg dst,
|
||||||
int nb_temps, int nb_globals)
|
TCGArg src, int nb_temps, int nb_globals)
|
||||||
{
|
{
|
||||||
reset_temp(dst, nb_temps, nb_globals);
|
reset_temp(dst, nb_temps, nb_globals);
|
||||||
assert(temps[src].state != TCG_TEMP_COPY);
|
assert(temps[src].state != TCG_TEMP_COPY);
|
||||||
if (src >= nb_globals) {
|
/* Don't try to copy if one of temps is a global or either one
|
||||||
|
is local and another is register */
|
||||||
|
if (src >= nb_globals && dst >= nb_globals &&
|
||||||
|
tcg_arg_is_local(s, src) == tcg_arg_is_local(s, dst)) {
|
||||||
assert(temps[src].state != TCG_TEMP_CONST);
|
assert(temps[src].state != TCG_TEMP_CONST);
|
||||||
if (temps[src].state != TCG_TEMP_HAS_COPY) {
|
if (temps[src].state != TCG_TEMP_HAS_COPY) {
|
||||||
temps[src].state = TCG_TEMP_HAS_COPY;
|
temps[src].state = TCG_TEMP_HAS_COPY;
|
||||||
|
@ -474,7 +477,7 @@ static TCGArg *tcg_constant_folding(TCGContext *s, uint16_t *tcg_opc_ptr,
|
||||||
gen_opc_buf[op_index] = INDEX_op_nop;
|
gen_opc_buf[op_index] = INDEX_op_nop;
|
||||||
} else {
|
} else {
|
||||||
gen_opc_buf[op_index] = op_to_mov(op);
|
gen_opc_buf[op_index] = op_to_mov(op);
|
||||||
tcg_opt_gen_mov(gen_args, args[0], args[1],
|
tcg_opt_gen_mov(s, gen_args, args[0], args[1],
|
||||||
nb_temps, nb_globals);
|
nb_temps, nb_globals);
|
||||||
gen_args += 2;
|
gen_args += 2;
|
||||||
args += 3;
|
args += 3;
|
||||||
|
@ -500,7 +503,7 @@ static TCGArg *tcg_constant_folding(TCGContext *s, uint16_t *tcg_opc_ptr,
|
||||||
gen_opc_buf[op_index] = INDEX_op_nop;
|
gen_opc_buf[op_index] = INDEX_op_nop;
|
||||||
} else {
|
} else {
|
||||||
gen_opc_buf[op_index] = op_to_mov(op);
|
gen_opc_buf[op_index] = op_to_mov(op);
|
||||||
tcg_opt_gen_mov(gen_args, args[0], args[1], nb_temps,
|
tcg_opt_gen_mov(s, gen_args, args[0], args[1], nb_temps,
|
||||||
nb_globals);
|
nb_globals);
|
||||||
gen_args += 2;
|
gen_args += 2;
|
||||||
args += 3;
|
args += 3;
|
||||||
|
@ -523,7 +526,7 @@ static TCGArg *tcg_constant_folding(TCGContext *s, uint16_t *tcg_opc_ptr,
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if (temps[args[1]].state != TCG_TEMP_CONST) {
|
if (temps[args[1]].state != TCG_TEMP_CONST) {
|
||||||
tcg_opt_gen_mov(gen_args, args[0], args[1],
|
tcg_opt_gen_mov(s, gen_args, args[0], args[1],
|
||||||
nb_temps, nb_globals);
|
nb_temps, nb_globals);
|
||||||
gen_args += 2;
|
gen_args += 2;
|
||||||
args += 2;
|
args += 2;
|
||||||
|
|
|
@ -410,6 +410,11 @@ static inline TCGv_i64 tcg_temp_local_new_i64(void)
|
||||||
void tcg_temp_free_i64(TCGv_i64 arg);
|
void tcg_temp_free_i64(TCGv_i64 arg);
|
||||||
char *tcg_get_arg_str_i64(TCGContext *s, char *buf, int buf_size, TCGv_i64 arg);
|
char *tcg_get_arg_str_i64(TCGContext *s, char *buf, int buf_size, TCGv_i64 arg);
|
||||||
|
|
||||||
|
static inline bool tcg_arg_is_local(TCGContext *s, TCGArg arg)
|
||||||
|
{
|
||||||
|
return s->temps[arg].temp_local;
|
||||||
|
}
|
||||||
|
|
||||||
#if defined(CONFIG_DEBUG_TCG)
|
#if defined(CONFIG_DEBUG_TCG)
|
||||||
/* If you call tcg_clear_temp_count() at the start of a section of
|
/* If you call tcg_clear_temp_count() at the start of a section of
|
||||||
* code which is not supposed to leak any TCG temporaries, then
|
* code which is not supposed to leak any TCG temporaries, then
|
||||||
|
|
547
ui/sdl.c
547
ui/sdl.c
|
@ -39,15 +39,16 @@ static SDL_Surface *real_screen;
|
||||||
static SDL_Surface *guest_screen = NULL;
|
static SDL_Surface *guest_screen = NULL;
|
||||||
static int gui_grab; /* if true, all keyboard/mouse events are grabbed */
|
static int gui_grab; /* if true, all keyboard/mouse events are grabbed */
|
||||||
static int last_vm_running;
|
static int last_vm_running;
|
||||||
|
static bool gui_saved_scaling;
|
||||||
|
static int gui_saved_width;
|
||||||
|
static int gui_saved_height;
|
||||||
static int gui_saved_grab;
|
static int gui_saved_grab;
|
||||||
static int gui_fullscreen;
|
static int gui_fullscreen;
|
||||||
static int gui_noframe;
|
static int gui_noframe;
|
||||||
static int gui_key_modifier_pressed;
|
static int gui_key_modifier_pressed;
|
||||||
static int gui_keysym;
|
static int gui_keysym;
|
||||||
static int gui_fullscreen_initial_grab;
|
|
||||||
static int gui_grab_code = KMOD_LALT | KMOD_LCTRL;
|
static int gui_grab_code = KMOD_LALT | KMOD_LCTRL;
|
||||||
static uint8_t modifiers_state[256];
|
static uint8_t modifiers_state[256];
|
||||||
static int width, height;
|
|
||||||
static SDL_Cursor *sdl_cursor_normal;
|
static SDL_Cursor *sdl_cursor_normal;
|
||||||
static SDL_Cursor *sdl_cursor_hidden;
|
static SDL_Cursor *sdl_cursor_hidden;
|
||||||
static int absolute_enabled = 0;
|
static int absolute_enabled = 0;
|
||||||
|
@ -91,20 +92,21 @@ static void sdl_setdata(DisplayState *ds)
|
||||||
ds->surface->pf.bmask, ds->surface->pf.amask);
|
ds->surface->pf.bmask, ds->surface->pf.amask);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void do_sdl_resize(int new_width, int new_height, int bpp)
|
static void do_sdl_resize(int width, int height, int bpp)
|
||||||
{
|
{
|
||||||
int flags;
|
int flags;
|
||||||
|
|
||||||
// printf("resizing to %d %d\n", w, h);
|
// printf("resizing to %d %d\n", w, h);
|
||||||
|
|
||||||
flags = SDL_HWSURFACE|SDL_ASYNCBLIT|SDL_HWACCEL|SDL_RESIZABLE;
|
flags = SDL_HWSURFACE | SDL_ASYNCBLIT | SDL_HWACCEL;
|
||||||
if (gui_fullscreen)
|
if (gui_fullscreen) {
|
||||||
flags |= SDL_FULLSCREEN;
|
flags |= SDL_FULLSCREEN;
|
||||||
|
} else {
|
||||||
|
flags |= SDL_RESIZABLE;
|
||||||
|
}
|
||||||
if (gui_noframe)
|
if (gui_noframe)
|
||||||
flags |= SDL_NOFRAME;
|
flags |= SDL_NOFRAME;
|
||||||
|
|
||||||
width = new_width;
|
|
||||||
height = new_height;
|
|
||||||
real_screen = SDL_SetVideoMode(width, height, bpp, flags);
|
real_screen = SDL_SetVideoMode(width, height, bpp, flags);
|
||||||
if (!real_screen) {
|
if (!real_screen) {
|
||||||
fprintf(stderr, "Could not open SDL display (%dx%dx%d): %s\n", width,
|
fprintf(stderr, "Could not open SDL display (%dx%dx%d): %s\n", width,
|
||||||
|
@ -447,7 +449,7 @@ static void sdl_show_cursor(void)
|
||||||
if (!cursor_hide)
|
if (!cursor_hide)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (!kbd_mouse_is_absolute()) {
|
if (!kbd_mouse_is_absolute() || !is_graphic_console()) {
|
||||||
SDL_ShowCursor(1);
|
SDL_ShowCursor(1);
|
||||||
if (guest_cursor &&
|
if (guest_cursor &&
|
||||||
(gui_grab || kbd_mouse_is_absolute() || absolute_enabled))
|
(gui_grab || kbd_mouse_is_absolute() || absolute_enabled))
|
||||||
|
@ -485,32 +487,32 @@ static void sdl_mouse_mode_change(Notifier *notify, void *data)
|
||||||
{
|
{
|
||||||
if (kbd_mouse_is_absolute()) {
|
if (kbd_mouse_is_absolute()) {
|
||||||
if (!absolute_enabled) {
|
if (!absolute_enabled) {
|
||||||
sdl_hide_cursor();
|
sdl_grab_start();
|
||||||
if (gui_grab) {
|
|
||||||
sdl_grab_end();
|
|
||||||
}
|
|
||||||
absolute_enabled = 1;
|
absolute_enabled = 1;
|
||||||
}
|
}
|
||||||
} else if (absolute_enabled) {
|
} else if (absolute_enabled) {
|
||||||
sdl_show_cursor();
|
sdl_grab_end();
|
||||||
absolute_enabled = 0;
|
absolute_enabled = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void sdl_send_mouse_event(int dx, int dy, int dz, int x, int y, int state)
|
static void sdl_send_mouse_event(int dx, int dy, int dz, int x, int y, int state)
|
||||||
{
|
{
|
||||||
int buttons;
|
int buttons = 0;
|
||||||
buttons = 0;
|
|
||||||
if (state & SDL_BUTTON(SDL_BUTTON_LEFT))
|
if (state & SDL_BUTTON(SDL_BUTTON_LEFT)) {
|
||||||
buttons |= MOUSE_EVENT_LBUTTON;
|
buttons |= MOUSE_EVENT_LBUTTON;
|
||||||
if (state & SDL_BUTTON(SDL_BUTTON_RIGHT))
|
}
|
||||||
|
if (state & SDL_BUTTON(SDL_BUTTON_RIGHT)) {
|
||||||
buttons |= MOUSE_EVENT_RBUTTON;
|
buttons |= MOUSE_EVENT_RBUTTON;
|
||||||
if (state & SDL_BUTTON(SDL_BUTTON_MIDDLE))
|
}
|
||||||
|
if (state & SDL_BUTTON(SDL_BUTTON_MIDDLE)) {
|
||||||
buttons |= MOUSE_EVENT_MBUTTON;
|
buttons |= MOUSE_EVENT_MBUTTON;
|
||||||
|
}
|
||||||
|
|
||||||
if (kbd_mouse_is_absolute()) {
|
if (kbd_mouse_is_absolute()) {
|
||||||
dx = x * 0x7FFF / (width - 1);
|
dx = x * 0x7FFF / (real_screen->w - 1);
|
||||||
dy = y * 0x7FFF / (height - 1);
|
dy = y * 0x7FFF / (real_screen->h - 1);
|
||||||
} else if (guest_cursor) {
|
} else if (guest_cursor) {
|
||||||
x -= guest_x;
|
x -= guest_x;
|
||||||
y -= guest_y;
|
y -= guest_y;
|
||||||
|
@ -523,27 +525,331 @@ static void sdl_send_mouse_event(int dx, int dy, int dz, int x, int y, int state
|
||||||
kbd_mouse_event(dx, dy, dz, buttons);
|
kbd_mouse_event(dx, dy, dz, buttons);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void sdl_scale(DisplayState *ds, int width, int height)
|
||||||
|
{
|
||||||
|
int bpp = real_screen->format->BitsPerPixel;
|
||||||
|
|
||||||
|
if (bpp != 16 && bpp != 32) {
|
||||||
|
bpp = 32;
|
||||||
|
}
|
||||||
|
do_sdl_resize(width, height, bpp);
|
||||||
|
scaling_active = 1;
|
||||||
|
if (!is_buffer_shared(ds->surface)) {
|
||||||
|
ds->surface = qemu_resize_displaysurface(ds, ds_get_width(ds),
|
||||||
|
ds_get_height(ds));
|
||||||
|
dpy_resize(ds);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static void toggle_full_screen(DisplayState *ds)
|
static void toggle_full_screen(DisplayState *ds)
|
||||||
{
|
{
|
||||||
gui_fullscreen = !gui_fullscreen;
|
gui_fullscreen = !gui_fullscreen;
|
||||||
do_sdl_resize(real_screen->w, real_screen->h, real_screen->format->BitsPerPixel);
|
|
||||||
if (gui_fullscreen) {
|
if (gui_fullscreen) {
|
||||||
|
gui_saved_width = real_screen->w;
|
||||||
|
gui_saved_height = real_screen->h;
|
||||||
|
gui_saved_scaling = scaling_active;
|
||||||
|
|
||||||
|
do_sdl_resize(ds_get_width(ds), ds_get_height(ds),
|
||||||
|
ds_get_bits_per_pixel(ds));
|
||||||
scaling_active = 0;
|
scaling_active = 0;
|
||||||
|
|
||||||
gui_saved_grab = gui_grab;
|
gui_saved_grab = gui_grab;
|
||||||
sdl_grab_start();
|
sdl_grab_start();
|
||||||
} else {
|
} else {
|
||||||
if (!gui_saved_grab)
|
if (gui_saved_scaling) {
|
||||||
|
sdl_scale(ds, gui_saved_width, gui_saved_height);
|
||||||
|
} else {
|
||||||
|
do_sdl_resize(ds_get_width(ds), ds_get_height(ds), 0);
|
||||||
|
}
|
||||||
|
if (!gui_saved_grab || !is_graphic_console()) {
|
||||||
sdl_grab_end();
|
sdl_grab_end();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
vga_hw_invalidate();
|
vga_hw_invalidate();
|
||||||
vga_hw_update();
|
vga_hw_update();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void absolute_mouse_grab(void)
|
||||||
|
{
|
||||||
|
int mouse_x, mouse_y;
|
||||||
|
|
||||||
|
if (SDL_GetAppState() & SDL_APPINPUTFOCUS) {
|
||||||
|
SDL_GetMouseState(&mouse_x, &mouse_y);
|
||||||
|
if (mouse_x > 0 && mouse_x < real_screen->w - 1 &&
|
||||||
|
mouse_y > 0 && mouse_y < real_screen->h - 1) {
|
||||||
|
sdl_grab_start();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void handle_keydown(DisplayState *ds, SDL_Event *ev)
|
||||||
|
{
|
||||||
|
int mod_state;
|
||||||
|
int keycode;
|
||||||
|
|
||||||
|
if (alt_grab) {
|
||||||
|
mod_state = (SDL_GetModState() & (gui_grab_code | KMOD_LSHIFT)) ==
|
||||||
|
(gui_grab_code | KMOD_LSHIFT);
|
||||||
|
} else if (ctrl_grab) {
|
||||||
|
mod_state = (SDL_GetModState() & KMOD_RCTRL) == KMOD_RCTRL;
|
||||||
|
} else {
|
||||||
|
mod_state = (SDL_GetModState() & gui_grab_code) == gui_grab_code;
|
||||||
|
}
|
||||||
|
gui_key_modifier_pressed = mod_state;
|
||||||
|
|
||||||
|
if (gui_key_modifier_pressed) {
|
||||||
|
keycode = sdl_keyevent_to_keycode(&ev->key);
|
||||||
|
switch (keycode) {
|
||||||
|
case 0x21: /* 'f' key on US keyboard */
|
||||||
|
toggle_full_screen(ds);
|
||||||
|
gui_keysym = 1;
|
||||||
|
break;
|
||||||
|
case 0x16: /* 'u' key on US keyboard */
|
||||||
|
if (scaling_active) {
|
||||||
|
scaling_active = 0;
|
||||||
|
sdl_resize(ds);
|
||||||
|
vga_hw_invalidate();
|
||||||
|
vga_hw_update();
|
||||||
|
}
|
||||||
|
gui_keysym = 1;
|
||||||
|
break;
|
||||||
|
case 0x02 ... 0x0a: /* '1' to '9' keys */
|
||||||
|
/* Reset the modifiers sent to the current console */
|
||||||
|
reset_keys();
|
||||||
|
console_select(keycode - 0x02);
|
||||||
|
gui_keysym = 1;
|
||||||
|
if (gui_fullscreen) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (!is_graphic_console()) {
|
||||||
|
/* release grab if going to a text console */
|
||||||
|
if (gui_grab) {
|
||||||
|
sdl_grab_end();
|
||||||
|
} else if (absolute_enabled) {
|
||||||
|
sdl_show_cursor();
|
||||||
|
}
|
||||||
|
} else if (absolute_enabled) {
|
||||||
|
sdl_hide_cursor();
|
||||||
|
absolute_mouse_grab();
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 0x1b: /* '+' */
|
||||||
|
case 0x35: /* '-' */
|
||||||
|
if (!gui_fullscreen) {
|
||||||
|
int width = MAX(real_screen->w + (keycode == 0x1b ? 50 : -50),
|
||||||
|
160);
|
||||||
|
int height = (ds_get_height(ds) * width) / ds_get_width(ds);
|
||||||
|
|
||||||
|
sdl_scale(ds, width, height);
|
||||||
|
vga_hw_invalidate();
|
||||||
|
vga_hw_update();
|
||||||
|
gui_keysym = 1;
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
} else if (!is_graphic_console()) {
|
||||||
|
int keysym = 0;
|
||||||
|
|
||||||
|
if (ev->key.keysym.mod & (KMOD_LCTRL | KMOD_RCTRL)) {
|
||||||
|
switch (ev->key.keysym.sym) {
|
||||||
|
case SDLK_UP:
|
||||||
|
keysym = QEMU_KEY_CTRL_UP;
|
||||||
|
break;
|
||||||
|
case SDLK_DOWN:
|
||||||
|
keysym = QEMU_KEY_CTRL_DOWN;
|
||||||
|
break;
|
||||||
|
case SDLK_LEFT:
|
||||||
|
keysym = QEMU_KEY_CTRL_LEFT;
|
||||||
|
break;
|
||||||
|
case SDLK_RIGHT:
|
||||||
|
keysym = QEMU_KEY_CTRL_RIGHT;
|
||||||
|
break;
|
||||||
|
case SDLK_HOME:
|
||||||
|
keysym = QEMU_KEY_CTRL_HOME;
|
||||||
|
break;
|
||||||
|
case SDLK_END:
|
||||||
|
keysym = QEMU_KEY_CTRL_END;
|
||||||
|
break;
|
||||||
|
case SDLK_PAGEUP:
|
||||||
|
keysym = QEMU_KEY_CTRL_PAGEUP;
|
||||||
|
break;
|
||||||
|
case SDLK_PAGEDOWN:
|
||||||
|
keysym = QEMU_KEY_CTRL_PAGEDOWN;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
switch (ev->key.keysym.sym) {
|
||||||
|
case SDLK_UP:
|
||||||
|
keysym = QEMU_KEY_UP;
|
||||||
|
break;
|
||||||
|
case SDLK_DOWN:
|
||||||
|
keysym = QEMU_KEY_DOWN;
|
||||||
|
break;
|
||||||
|
case SDLK_LEFT:
|
||||||
|
keysym = QEMU_KEY_LEFT;
|
||||||
|
break;
|
||||||
|
case SDLK_RIGHT:
|
||||||
|
keysym = QEMU_KEY_RIGHT;
|
||||||
|
break;
|
||||||
|
case SDLK_HOME:
|
||||||
|
keysym = QEMU_KEY_HOME;
|
||||||
|
break;
|
||||||
|
case SDLK_END:
|
||||||
|
keysym = QEMU_KEY_END;
|
||||||
|
break;
|
||||||
|
case SDLK_PAGEUP:
|
||||||
|
keysym = QEMU_KEY_PAGEUP;
|
||||||
|
break;
|
||||||
|
case SDLK_PAGEDOWN:
|
||||||
|
keysym = QEMU_KEY_PAGEDOWN;
|
||||||
|
break;
|
||||||
|
case SDLK_BACKSPACE:
|
||||||
|
keysym = QEMU_KEY_BACKSPACE;
|
||||||
|
break;
|
||||||
|
case SDLK_DELETE:
|
||||||
|
keysym = QEMU_KEY_DELETE;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (keysym) {
|
||||||
|
kbd_put_keysym(keysym);
|
||||||
|
} else if (ev->key.keysym.unicode != 0) {
|
||||||
|
kbd_put_keysym(ev->key.keysym.unicode);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (is_graphic_console() && !gui_keysym) {
|
||||||
|
sdl_process_key(&ev->key);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void handle_keyup(DisplayState *ds, SDL_Event *ev)
|
||||||
|
{
|
||||||
|
int mod_state;
|
||||||
|
|
||||||
|
if (!alt_grab) {
|
||||||
|
mod_state = (ev->key.keysym.mod & gui_grab_code);
|
||||||
|
} else {
|
||||||
|
mod_state = (ev->key.keysym.mod & (gui_grab_code | KMOD_LSHIFT));
|
||||||
|
}
|
||||||
|
if (!mod_state && gui_key_modifier_pressed) {
|
||||||
|
gui_key_modifier_pressed = 0;
|
||||||
|
if (gui_keysym == 0) {
|
||||||
|
/* exit/enter grab if pressing Ctrl-Alt */
|
||||||
|
if (!gui_grab) {
|
||||||
|
/* If the application is not active, do not try to enter grab
|
||||||
|
* state. It prevents 'SDL_WM_GrabInput(SDL_GRAB_ON)' from
|
||||||
|
* blocking all the application (SDL bug). */
|
||||||
|
if (is_graphic_console() &&
|
||||||
|
SDL_GetAppState() & SDL_APPACTIVE) {
|
||||||
|
sdl_grab_start();
|
||||||
|
}
|
||||||
|
} else if (!gui_fullscreen) {
|
||||||
|
sdl_grab_end();
|
||||||
|
}
|
||||||
|
/* SDL does not send back all the modifiers key, so we must
|
||||||
|
* correct it. */
|
||||||
|
reset_keys();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
gui_keysym = 0;
|
||||||
|
}
|
||||||
|
if (is_graphic_console() && !gui_keysym) {
|
||||||
|
sdl_process_key(&ev->key);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void handle_mousemotion(DisplayState *ds, SDL_Event *ev)
|
||||||
|
{
|
||||||
|
int max_x, max_y;
|
||||||
|
|
||||||
|
if (is_graphic_console() &&
|
||||||
|
(kbd_mouse_is_absolute() || absolute_enabled)) {
|
||||||
|
max_x = real_screen->w - 1;
|
||||||
|
max_y = real_screen->h - 1;
|
||||||
|
if (gui_grab && (ev->motion.x == 0 || ev->motion.y == 0 ||
|
||||||
|
ev->motion.x == max_x || ev->motion.y == max_y)) {
|
||||||
|
sdl_grab_end();
|
||||||
|
}
|
||||||
|
if (!gui_grab && SDL_GetAppState() & SDL_APPINPUTFOCUS &&
|
||||||
|
(ev->motion.x > 0 && ev->motion.x < max_x &&
|
||||||
|
ev->motion.y > 0 && ev->motion.y < max_y)) {
|
||||||
|
sdl_grab_start();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (gui_grab || kbd_mouse_is_absolute() || absolute_enabled) {
|
||||||
|
sdl_send_mouse_event(ev->motion.xrel, ev->motion.yrel, 0,
|
||||||
|
ev->motion.x, ev->motion.y, ev->motion.state);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void handle_mousebutton(DisplayState *ds, SDL_Event *ev)
|
||||||
|
{
|
||||||
|
int buttonstate = SDL_GetMouseState(NULL, NULL);
|
||||||
|
SDL_MouseButtonEvent *bev;
|
||||||
|
int dz;
|
||||||
|
|
||||||
|
if (!is_graphic_console()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
bev = &ev->button;
|
||||||
|
if (!gui_grab && !kbd_mouse_is_absolute()) {
|
||||||
|
if (ev->type == SDL_MOUSEBUTTONDOWN &&
|
||||||
|
(bev->button == SDL_BUTTON_LEFT)) {
|
||||||
|
/* start grabbing all events */
|
||||||
|
sdl_grab_start();
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
dz = 0;
|
||||||
|
if (ev->type == SDL_MOUSEBUTTONDOWN) {
|
||||||
|
buttonstate |= SDL_BUTTON(bev->button);
|
||||||
|
} else {
|
||||||
|
buttonstate &= ~SDL_BUTTON(bev->button);
|
||||||
|
}
|
||||||
|
#ifdef SDL_BUTTON_WHEELUP
|
||||||
|
if (bev->button == SDL_BUTTON_WHEELUP &&
|
||||||
|
ev->type == SDL_MOUSEBUTTONDOWN) {
|
||||||
|
dz = -1;
|
||||||
|
} else if (bev->button == SDL_BUTTON_WHEELDOWN &&
|
||||||
|
ev->type == SDL_MOUSEBUTTONDOWN) {
|
||||||
|
dz = 1;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
sdl_send_mouse_event(0, 0, dz, bev->x, bev->y, buttonstate);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void handle_activation(DisplayState *ds, SDL_Event *ev)
|
||||||
|
{
|
||||||
|
if (gui_grab && ev->active.state == SDL_APPINPUTFOCUS &&
|
||||||
|
!ev->active.gain && !gui_fullscreen) {
|
||||||
|
sdl_grab_end();
|
||||||
|
}
|
||||||
|
if (!gui_grab && ev->active.gain && is_graphic_console() &&
|
||||||
|
(kbd_mouse_is_absolute() || absolute_enabled)) {
|
||||||
|
absolute_mouse_grab();
|
||||||
|
}
|
||||||
|
if (ev->active.state & SDL_APPACTIVE) {
|
||||||
|
if (ev->active.gain) {
|
||||||
|
/* Back to default interval */
|
||||||
|
dcl->gui_timer_interval = 0;
|
||||||
|
dcl->idle = 0;
|
||||||
|
} else {
|
||||||
|
/* Sleeping interval */
|
||||||
|
dcl->gui_timer_interval = 500;
|
||||||
|
dcl->idle = 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static void sdl_refresh(DisplayState *ds)
|
static void sdl_refresh(DisplayState *ds)
|
||||||
{
|
{
|
||||||
SDL_Event ev1, *ev = &ev1;
|
SDL_Event ev1, *ev = &ev1;
|
||||||
int mod_state;
|
|
||||||
int buttonstate = SDL_GetMouseState(NULL, NULL);
|
|
||||||
|
|
||||||
if (last_vm_running != vm_running) {
|
if (last_vm_running != vm_running) {
|
||||||
last_vm_running = vm_running;
|
last_vm_running = vm_running;
|
||||||
|
@ -559,191 +865,32 @@ static void sdl_refresh(DisplayState *ds)
|
||||||
sdl_update(ds, 0, 0, real_screen->w, real_screen->h);
|
sdl_update(ds, 0, 0, real_screen->w, real_screen->h);
|
||||||
break;
|
break;
|
||||||
case SDL_KEYDOWN:
|
case SDL_KEYDOWN:
|
||||||
|
handle_keydown(ds, ev);
|
||||||
|
break;
|
||||||
case SDL_KEYUP:
|
case SDL_KEYUP:
|
||||||
if (ev->type == SDL_KEYDOWN) {
|
handle_keyup(ds, ev);
|
||||||
if (alt_grab) {
|
|
||||||
mod_state = (SDL_GetModState() & (gui_grab_code | KMOD_LSHIFT)) ==
|
|
||||||
(gui_grab_code | KMOD_LSHIFT);
|
|
||||||
} else if (ctrl_grab) {
|
|
||||||
mod_state = (SDL_GetModState() & KMOD_RCTRL) == KMOD_RCTRL;
|
|
||||||
} else {
|
|
||||||
mod_state = (SDL_GetModState() & gui_grab_code) ==
|
|
||||||
gui_grab_code;
|
|
||||||
}
|
|
||||||
gui_key_modifier_pressed = mod_state;
|
|
||||||
if (gui_key_modifier_pressed) {
|
|
||||||
int keycode;
|
|
||||||
keycode = sdl_keyevent_to_keycode(&ev->key);
|
|
||||||
switch(keycode) {
|
|
||||||
case 0x21: /* 'f' key on US keyboard */
|
|
||||||
toggle_full_screen(ds);
|
|
||||||
gui_keysym = 1;
|
|
||||||
break;
|
|
||||||
case 0x16: /* 'u' key on US keyboard */
|
|
||||||
scaling_active = 0;
|
|
||||||
sdl_resize(ds);
|
|
||||||
vga_hw_invalidate();
|
|
||||||
vga_hw_update();
|
|
||||||
break;
|
|
||||||
case 0x02 ... 0x0a: /* '1' to '9' keys */
|
|
||||||
/* Reset the modifiers sent to the current console */
|
|
||||||
reset_keys();
|
|
||||||
console_select(keycode - 0x02);
|
|
||||||
if (!is_graphic_console()) {
|
|
||||||
/* display grab if going to a text console */
|
|
||||||
if (gui_grab)
|
|
||||||
sdl_grab_end();
|
|
||||||
}
|
|
||||||
gui_keysym = 1;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
} else if (!is_graphic_console()) {
|
|
||||||
int keysym;
|
|
||||||
keysym = 0;
|
|
||||||
if (ev->key.keysym.mod & (KMOD_LCTRL | KMOD_RCTRL)) {
|
|
||||||
switch(ev->key.keysym.sym) {
|
|
||||||
case SDLK_UP: keysym = QEMU_KEY_CTRL_UP; break;
|
|
||||||
case SDLK_DOWN: keysym = QEMU_KEY_CTRL_DOWN; break;
|
|
||||||
case SDLK_LEFT: keysym = QEMU_KEY_CTRL_LEFT; break;
|
|
||||||
case SDLK_RIGHT: keysym = QEMU_KEY_CTRL_RIGHT; break;
|
|
||||||
case SDLK_HOME: keysym = QEMU_KEY_CTRL_HOME; break;
|
|
||||||
case SDLK_END: keysym = QEMU_KEY_CTRL_END; break;
|
|
||||||
case SDLK_PAGEUP: keysym = QEMU_KEY_CTRL_PAGEUP; break;
|
|
||||||
case SDLK_PAGEDOWN: keysym = QEMU_KEY_CTRL_PAGEDOWN; break;
|
|
||||||
default: break;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
switch(ev->key.keysym.sym) {
|
|
||||||
case SDLK_UP: keysym = QEMU_KEY_UP; break;
|
|
||||||
case SDLK_DOWN: keysym = QEMU_KEY_DOWN; break;
|
|
||||||
case SDLK_LEFT: keysym = QEMU_KEY_LEFT; break;
|
|
||||||
case SDLK_RIGHT: keysym = QEMU_KEY_RIGHT; break;
|
|
||||||
case SDLK_HOME: keysym = QEMU_KEY_HOME; break;
|
|
||||||
case SDLK_END: keysym = QEMU_KEY_END; break;
|
|
||||||
case SDLK_PAGEUP: keysym = QEMU_KEY_PAGEUP; break;
|
|
||||||
case SDLK_PAGEDOWN: keysym = QEMU_KEY_PAGEDOWN; break;
|
|
||||||
case SDLK_BACKSPACE: keysym = QEMU_KEY_BACKSPACE; break;
|
|
||||||
case SDLK_DELETE: keysym = QEMU_KEY_DELETE; break;
|
|
||||||
default: break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (keysym) {
|
|
||||||
kbd_put_keysym(keysym);
|
|
||||||
} else if (ev->key.keysym.unicode != 0) {
|
|
||||||
kbd_put_keysym(ev->key.keysym.unicode);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else if (ev->type == SDL_KEYUP) {
|
|
||||||
if (!alt_grab) {
|
|
||||||
mod_state = (ev->key.keysym.mod & gui_grab_code);
|
|
||||||
} else {
|
|
||||||
mod_state = (ev->key.keysym.mod &
|
|
||||||
(gui_grab_code | KMOD_LSHIFT));
|
|
||||||
}
|
|
||||||
if (!mod_state) {
|
|
||||||
if (gui_key_modifier_pressed) {
|
|
||||||
gui_key_modifier_pressed = 0;
|
|
||||||
if (gui_keysym == 0) {
|
|
||||||
/* exit/enter grab if pressing Ctrl-Alt */
|
|
||||||
if (!gui_grab) {
|
|
||||||
/* if the application is not active,
|
|
||||||
do not try to enter grab state. It
|
|
||||||
prevents
|
|
||||||
'SDL_WM_GrabInput(SDL_GRAB_ON)'
|
|
||||||
from blocking all the application
|
|
||||||
(SDL bug). */
|
|
||||||
if (SDL_GetAppState() & SDL_APPACTIVE)
|
|
||||||
sdl_grab_start();
|
|
||||||
} else {
|
|
||||||
sdl_grab_end();
|
|
||||||
}
|
|
||||||
/* SDL does not send back all the
|
|
||||||
modifiers key, so we must correct it */
|
|
||||||
reset_keys();
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
gui_keysym = 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (is_graphic_console() && !gui_keysym)
|
|
||||||
sdl_process_key(&ev->key);
|
|
||||||
break;
|
break;
|
||||||
case SDL_QUIT:
|
case SDL_QUIT:
|
||||||
if (!no_quit)
|
if (!no_quit) {
|
||||||
|
no_shutdown = 0;
|
||||||
qemu_system_shutdown_request();
|
qemu_system_shutdown_request();
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
case SDL_MOUSEMOTION:
|
case SDL_MOUSEMOTION:
|
||||||
if (gui_grab || kbd_mouse_is_absolute() ||
|
handle_mousemotion(ds, ev);
|
||||||
absolute_enabled) {
|
|
||||||
sdl_send_mouse_event(ev->motion.xrel, ev->motion.yrel, 0,
|
|
||||||
ev->motion.x, ev->motion.y, ev->motion.state);
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
case SDL_MOUSEBUTTONDOWN:
|
case SDL_MOUSEBUTTONDOWN:
|
||||||
case SDL_MOUSEBUTTONUP:
|
case SDL_MOUSEBUTTONUP:
|
||||||
{
|
handle_mousebutton(ds, ev);
|
||||||
SDL_MouseButtonEvent *bev = &ev->button;
|
|
||||||
if (!gui_grab && !kbd_mouse_is_absolute()) {
|
|
||||||
if (ev->type == SDL_MOUSEBUTTONDOWN &&
|
|
||||||
(bev->button == SDL_BUTTON_LEFT)) {
|
|
||||||
/* start grabbing all events */
|
|
||||||
sdl_grab_start();
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
int dz;
|
|
||||||
dz = 0;
|
|
||||||
if (ev->type == SDL_MOUSEBUTTONDOWN) {
|
|
||||||
buttonstate |= SDL_BUTTON(bev->button);
|
|
||||||
} else {
|
|
||||||
buttonstate &= ~SDL_BUTTON(bev->button);
|
|
||||||
}
|
|
||||||
#ifdef SDL_BUTTON_WHEELUP
|
|
||||||
if (bev->button == SDL_BUTTON_WHEELUP && ev->type == SDL_MOUSEBUTTONDOWN) {
|
|
||||||
dz = -1;
|
|
||||||
} else if (bev->button == SDL_BUTTON_WHEELDOWN && ev->type == SDL_MOUSEBUTTONDOWN) {
|
|
||||||
dz = 1;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
sdl_send_mouse_event(0, 0, dz, bev->x, bev->y, buttonstate);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
case SDL_ACTIVEEVENT:
|
case SDL_ACTIVEEVENT:
|
||||||
if (gui_grab && ev->active.state == SDL_APPINPUTFOCUS &&
|
handle_activation(ds, ev);
|
||||||
!ev->active.gain && !gui_fullscreen_initial_grab) {
|
|
||||||
sdl_grab_end();
|
|
||||||
}
|
|
||||||
if (ev->active.state & SDL_APPACTIVE) {
|
|
||||||
if (ev->active.gain) {
|
|
||||||
/* Back to default interval */
|
|
||||||
dcl->gui_timer_interval = 0;
|
|
||||||
dcl->idle = 0;
|
|
||||||
} else {
|
|
||||||
/* Sleeping interval */
|
|
||||||
dcl->gui_timer_interval = 500;
|
|
||||||
dcl->idle = 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
case SDL_VIDEORESIZE:
|
case SDL_VIDEORESIZE:
|
||||||
{
|
sdl_scale(ds, ev->resize.w, ev->resize.h);
|
||||||
SDL_ResizeEvent *rev = &ev->resize;
|
|
||||||
int bpp = real_screen->format->BitsPerPixel;
|
|
||||||
if (bpp != 16 && bpp != 32)
|
|
||||||
bpp = 32;
|
|
||||||
do_sdl_resize(rev->w, rev->h, bpp);
|
|
||||||
scaling_active = 1;
|
|
||||||
if (!is_buffer_shared(ds->surface)) {
|
|
||||||
ds->surface = qemu_resize_displaysurface(ds, ds_get_width(ds), ds_get_height(ds));
|
|
||||||
dpy_resize(ds);
|
|
||||||
}
|
|
||||||
vga_hw_invalidate();
|
vga_hw_invalidate();
|
||||||
vga_hw_update();
|
vga_hw_update();
|
||||||
break;
|
break;
|
||||||
}
|
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -865,6 +1012,11 @@ void sdl_display_init(DisplayState *ds, int full_screen, int no_frame)
|
||||||
qemu_free(filename);
|
qemu_free(filename);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (full_screen) {
|
||||||
|
gui_fullscreen = 1;
|
||||||
|
sdl_grab_start();
|
||||||
|
}
|
||||||
|
|
||||||
dcl = qemu_mallocz(sizeof(DisplayChangeListener));
|
dcl = qemu_mallocz(sizeof(DisplayChangeListener));
|
||||||
dcl->dpy_update = sdl_update;
|
dcl->dpy_update = sdl_update;
|
||||||
dcl->dpy_resize = sdl_resize;
|
dcl->dpy_resize = sdl_resize;
|
||||||
|
@ -894,9 +1046,4 @@ void sdl_display_init(DisplayState *ds, int full_screen, int no_frame)
|
||||||
sdl_cursor_normal = SDL_GetCursor();
|
sdl_cursor_normal = SDL_GetCursor();
|
||||||
|
|
||||||
atexit(sdl_cleanup);
|
atexit(sdl_cleanup);
|
||||||
if (full_screen) {
|
|
||||||
gui_fullscreen = 1;
|
|
||||||
gui_fullscreen_initial_grab = 1;
|
|
||||||
sdl_grab_start();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -102,7 +102,7 @@ static inline int handle_cpu_signal(unsigned long pc, unsigned long address,
|
||||||
}
|
}
|
||||||
|
|
||||||
/* see if it is an MMU fault */
|
/* see if it is an MMU fault */
|
||||||
ret = cpu_handle_mmu_fault(env, address, is_write, MMU_USER_IDX, 0);
|
ret = cpu_handle_mmu_fault(env, address, is_write, MMU_USER_IDX);
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
return 0; /* not an MMU fault */
|
return 0; /* not an MMU fault */
|
||||||
}
|
}
|
||||||
|
|
14
vl.c
14
vl.c
|
@ -265,6 +265,7 @@ int kvm_allowed = 0;
|
||||||
int xen_allowed = 0;
|
int xen_allowed = 0;
|
||||||
uint32_t xen_domid;
|
uint32_t xen_domid;
|
||||||
enum xen_mode xen_mode = XEN_EMULATE;
|
enum xen_mode xen_mode = XEN_EMULATE;
|
||||||
|
static int tcg_tb_size;
|
||||||
|
|
||||||
static int default_serial = 1;
|
static int default_serial = 1;
|
||||||
static int default_parallel = 1;
|
static int default_parallel = 1;
|
||||||
|
@ -1932,6 +1933,7 @@ static QEMUMachine *machine_parse(const char *name)
|
||||||
|
|
||||||
static int tcg_init(void)
|
static int tcg_init(void)
|
||||||
{
|
{
|
||||||
|
tcg_exec_init(tcg_tb_size * 1024 * 1024);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2092,7 +2094,6 @@ int main(int argc, char **argv, char **envp)
|
||||||
const char *loadvm = NULL;
|
const char *loadvm = NULL;
|
||||||
QEMUMachine *machine;
|
QEMUMachine *machine;
|
||||||
const char *cpu_model;
|
const char *cpu_model;
|
||||||
int tb_size;
|
|
||||||
const char *pid_file = NULL;
|
const char *pid_file = NULL;
|
||||||
const char *incoming = NULL;
|
const char *incoming = NULL;
|
||||||
#ifdef CONFIG_VNC
|
#ifdef CONFIG_VNC
|
||||||
|
@ -2132,7 +2133,6 @@ int main(int argc, char **argv, char **envp)
|
||||||
nb_numa_nodes = 0;
|
nb_numa_nodes = 0;
|
||||||
nb_nics = 0;
|
nb_nics = 0;
|
||||||
|
|
||||||
tb_size = 0;
|
|
||||||
autostart= 1;
|
autostart= 1;
|
||||||
|
|
||||||
/* first pass of option parsing */
|
/* first pass of option parsing */
|
||||||
|
@ -2847,9 +2847,10 @@ int main(int argc, char **argv, char **envp)
|
||||||
configure_rtc(opts);
|
configure_rtc(opts);
|
||||||
break;
|
break;
|
||||||
case QEMU_OPTION_tb_size:
|
case QEMU_OPTION_tb_size:
|
||||||
tb_size = strtol(optarg, NULL, 0);
|
tcg_tb_size = strtol(optarg, NULL, 0);
|
||||||
if (tb_size < 0)
|
if (tcg_tb_size < 0) {
|
||||||
tb_size = 0;
|
tcg_tb_size = 0;
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
case QEMU_OPTION_icount:
|
case QEMU_OPTION_icount:
|
||||||
icount_option = optarg;
|
icount_option = optarg;
|
||||||
|
@ -3123,8 +3124,7 @@ int main(int argc, char **argv, char **envp)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* init the dynamic translator */
|
cpu_exec_init_all();
|
||||||
cpu_exec_init_all(tb_size * 1024 * 1024);
|
|
||||||
|
|
||||||
bdrv_init_with_whitelist();
|
bdrv_init_with_whitelist();
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue