From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1KszE0-0007JT-Ax for qemu-devel@nongnu.org; Thu, 23 Oct 2008 08:23:36 -0400 Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1KszDy-0007IB-Kj for qemu-devel@nongnu.org; Thu, 23 Oct 2008 08:23:35 -0400 Received: from [199.232.76.173] (port=51716 helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1KszDy-0007I6-CI for qemu-devel@nongnu.org; Thu, 23 Oct 2008 08:23:34 -0400 Received: from mx2.redhat.com ([66.187.237.31]:54714) by monty-python.gnu.org with esmtp (Exim 4.60) (envelope-from ) id 1KszDx-0006M0-A1 for qemu-devel@nongnu.org; Thu, 23 Oct 2008 08:23:34 -0400 From: Glauber Costa Date: Thu, 23 Oct 2008 12:19:10 -0200 Message-Id: <1224771556-11146-27-git-send-email-glommer@redhat.com> In-Reply-To: <1224771556-11146-1-git-send-email-glommer@redhat.com> References: <1224771556-11146-1-git-send-email-glommer@redhat.com> Subject: [Qemu-devel] [PATCH 26/32] provide two accelerators for kqemu Reply-To: qemu-devel@nongnu.org List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: jan.kiszka@siemens.com, aliguori@us.ibm.com, jes@sgi.com, avi@qumranet.com, dmitry.baryshkov@siemens.com They are mostly equal, just ease the management of accel selecting options. Signed-off-by: Glauber Costa --- kqemu.c | 114 +++++++++++++++++++++++++++++++++++++++---------------------- kqemu.h | 1 - sysemu.h | 5 --- vl.c | 19 +---------- 4 files changed, 74 insertions(+), 65 deletions(-) diff --git a/kqemu.c b/kqemu.c index 5162d55..310a1af 100644 --- a/kqemu.c +++ b/kqemu.c @@ -45,6 +45,10 @@ #ifdef USE_KQEMU +#define KQEMU_USER 1 +#define KQEMU_KERNEL 2 + +static int kqemu_state; #define DEBUG //#define PROFILE @@ -75,11 +79,6 @@ int kqemu_fd = KQEMU_INVALID_FD; #define kqemu_closefd(x) close(x) #endif -/* 0 = not allowed - 1 = user kqemu - 2 = kernel kqemu -*/ -int kqemu_allowed = 1; uint64_t *pages_to_flush; unsigned int nb_pages_to_flush; uint64_t *ram_pages_to_update; @@ -131,20 +130,12 @@ static int is_cpuid_supported(void) */ int kqemu_is_enabled(CPUState *env) { - if (strcasecmp(current_accel->name, "kqemu")) { - return 0; - } - - return env->kqemu_enabled; - + return kqemu_state == KQEMU_USER; } int kqemu_kernel_enabled(CPUState *env) { - if (strcasecmp(current_accel->name, "kqemu")) { - return 0; - } - return env->kqemu_enabled == 2; + return kqemu_state == KQEMU_KERNEL; } static void kqemu_update_cpuid(CPUState *env) @@ -186,7 +177,7 @@ static void kqemu_update_cpuid(CPUState *env) QEMUAccel kqemu_accel; -static int kqemu_start(int cpus) +static int kqemu_do_start(int cpus) { struct kqemu_init kinit; int ret, version; @@ -194,7 +185,7 @@ static int kqemu_start(int cpus) DWORD temp; #endif - if (!kqemu_allowed || cpus > 1) + if (cpus > 1) return -1; #ifdef _WIN32 @@ -273,10 +264,28 @@ static int kqemu_start(int cpus) return 0; } +static int kqemu_start(int cpus) +{ + kqemu_state = KQEMU_USER; + return kqemu_do_start(cpus); +} + +static int kqemu_start_kernel(int cpus) +{ + kqemu_state = KQEMU_KERNEL; + return kqemu_do_start(cpus); +} + static void kqemu_init_env(CPUState *env) { kqemu_update_cpuid(env); - env->kqemu_enabled = kqemu_allowed; + env->kqemu_enabled = 1; +} + +static void kqemu_init_env_kernel(CPUState *env) +{ + kqemu_update_cpuid(env); + env->kqemu_enabled = 2; } static void kqemu_flush_page(CPUState *env, target_ulong addr) @@ -791,7 +800,7 @@ static int kqemu_do_cpu_exec(CPUState *env) cpl = (env->hflags & HF_CPL_MASK); kenv->cpl = cpl; kenv->nb_pages_to_flush = nb_pages_to_flush; - kenv->user_only = (env->kqemu_enabled == 1); + kenv->user_only = kqemu_is_enabled(env); kenv->nb_ram_pages_to_update = nb_ram_pages_to_update; nb_ram_pages_to_update = 0; kenv->nb_modified_ram_pages = nb_modified_ram_pages; @@ -1082,27 +1091,12 @@ static void qpi_init(void) static int kqemu_info(CPUState *env, char *buf) { - int val, len; - int bufsiz = MAX_INFO_BUF; - val = 0; - val = env->kqemu_enabled; - len = snprintf(buf, bufsiz, "kqemu support: "); - buf += len; - bufsiz -= len; - - switch(val) { - default: - len += snprintf(buf, bufsiz, "present, but bogus value\n"); - break; - case 1: - len += snprintf(buf, bufsiz, "enabled for user code\n"); - break; - case 2: - len += snprintf(buf, bufsiz, "enabled for user and kernel code\n"); - break; - } + return snprintf(buf, MAX_INFO_BUF, "kqemu support: enabled for user code\n"); +} - return len; +static int kqemu_kernel_info(CPUState *env, char *buf) +{ + return snprintf(buf, MAX_INFO_BUF, "kqemu support: enabled for user and kernel code\n"); } int64_t kqemu_time; @@ -1141,10 +1135,27 @@ static void kqemu_trace_io(CPUState *env) kqemu_cpu_field(env,last_io_time) = cpu_get_time_fast(); } +#define MIN_CYCLE_BEFORE_SWITCH (100 * 1000) + +static inline int kqemu_flags_ok(CPUState *env) +{ + return((env->cr[0] & CR0_PE_MASK) && + !(env->hflags & HF_INHIBIT_IRQ_MASK) && + (env->eflags & IF_MASK) && + !(env->eflags & VM_MASK)); +} + +static inline int kqemu_kernel_flags_ok(CPUState *env) +{ + return (kqemu_flags_ok(env) && (kqemu_kernel_enabled(env) || + ((env->hflags & HF_CPL_MASK) == 3 && + (env->eflags & IOPL_MASK) != IOPL_MASK))); + +} + static int kqemu_break_loop(CPUState *env) { -#define MIN_CYCLE_BEFORE_SWITCH (100 * 1000) - if (kqemu_is_ok(env) && + if (kqemu_kernel_flags_ok(env) && (cpu_get_time_fast() - kqemu_cpu_field(env,last_io_time)) >= MIN_CYCLE_BEFORE_SWITCH) { return 1; } @@ -1182,4 +1193,25 @@ QEMUAccel kqemu_accel = { .cpu_exec = kqemu_cpu_exec, }; +QEMUAccel kqemu_kernel_accel = { + .name = "kernel-KQEMU", + .cpu_interrupt = kqemu_cpu_interrupt, + .init_env = kqemu_init_env_kernel, + .get_env = kqemu_get_env, + .start = kqemu_start_kernel, + .flush_cache = kqemu_flush, + .flush_page = kqemu_flush_page, + .info = kqemu_kernel_info, + .profile = kqemu_profile, + .set_notdirty = kqemu_set_notdirty, + .modify_page = kqemu_modify_page, +#ifndef CONFIG_USER_ONLY + .get_real_ticks = cpu_get_real_ticks, +#endif + .register_physical_memory = kqemu_set_phys_mem, + .trace_io = kqemu_trace_io, + .break_loop = kqemu_break_loop, + .cpu_exec = kqemu_cpu_exec, +}; + #endif diff --git a/kqemu.h b/kqemu.h index 62ba1d9..f644e41 100644 --- a/kqemu.h +++ b/kqemu.h @@ -161,7 +161,6 @@ int kqemu_is_enabled(CPUState *env); int kqemu_kernel_enabled(CPUState *env); typedef struct KQEMUCPUstate { - int kqemu_enabled; int last_io_time; CPUState env; } KQEMUCPUState; diff --git a/sysemu.h b/sysemu.h index 976fecc..5a19626 100644 --- a/sysemu.h +++ b/sysemu.h @@ -99,11 +99,6 @@ extern int semihosting_enabled; extern int old_param; extern const char *bootp_filename; - -#ifdef USE_KQEMU -extern int kqemu_allowed; -#endif - #define MAX_OPTION_ROMS 16 extern const char *option_rom[MAX_OPTION_ROMS]; extern int nb_option_roms; diff --git a/vl.c b/vl.c index e64becb..42720e8 100644 --- a/vl.c +++ b/vl.c @@ -259,6 +259,7 @@ QEMUAccel *available_accels[] = { /* list of available accelerators */ #ifdef USE_KQEMU &kqemu_accel, + &kqemu_kernel_accel, #endif }; @@ -8236,10 +8237,6 @@ static void help(int exitcode) "-hdachs c,h,s[,t] force hard disk 0 physical geometry and the optional BIOS\n" " translation (t=none or lba) (usually qemu can guess them)\n" "-L path set the directory for the BIOS, VGA BIOS and keymaps\n" -#ifdef USE_KQEMU - "-kernel-kqemu enable KQEMU full virtualization (default is user mode only)\n" - "-no-kqemu disable KQEMU kernel module usage\n" -#endif #ifdef TARGET_I386 "-no-acpi disable ACPI\n" #endif @@ -8343,9 +8340,7 @@ enum { QEMU_OPTION_alt_grab, QEMU_OPTION_no_quit, QEMU_OPTION_pidfile, - QEMU_OPTION_no_kqemu, QEMU_OPTION_accel, - QEMU_OPTION_kernel_kqemu, QEMU_OPTION_win2k_hack, QEMU_OPTION_usb, QEMU_OPTION_usbdevice, @@ -8428,10 +8423,6 @@ static const QEMUOption qemu_options[] = { { "hdachs", HAS_ARG, QEMU_OPTION_hdachs }, { "L", HAS_ARG, QEMU_OPTION_L }, { "bios", HAS_ARG, QEMU_OPTION_bios }, -#ifdef USE_KQEMU - { "no-kqemu", 0, QEMU_OPTION_no_kqemu }, - { "kernel-kqemu", 0, QEMU_OPTION_kernel_kqemu }, -#endif { "accel", HAS_ARG, QEMU_OPTION_accel}, #if defined(TARGET_PPC) || defined(TARGET_SPARC) { "g", 1, QEMU_OPTION_g }, @@ -9247,14 +9238,6 @@ int main(int argc, char **argv) win2k_install_hack = 1; break; #endif -#ifdef USE_KQEMU - case QEMU_OPTION_no_kqemu: - kqemu_allowed = 0; - break; - case QEMU_OPTION_kernel_kqemu: - kqemu_allowed = 2; - break; -#endif case QEMU_OPTION_accel: { int i; -- 1.5.5.1