From mboxrd@z Thu Jan 1 00:00:00 1970 From: "Joerg Roedel" Subject: [PATCH] kvm-12 userland guest reboot fix Date: Wed, 24 Jan 2007 14:05:34 +0100 Message-ID: <20070124130534.GA19732@amd.com> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary=vkogqOf2sHV7VnPd To: kvm-devel-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f@public.gmane.org Return-path: Content-Disposition: inline List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: kvm-devel-bounces-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f@public.gmane.org Errors-To: kvm-devel-bounces-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f@public.gmane.org List-Id: kvm.vger.kernel.org --vkogqOf2sHV7VnPd Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Content-Transfer-Encoding: 7bit From: Markus Rechberger From: Joerg Roedel This patch fixes the initialization of the segment registers which solves the triple fault and keyboard controller reset problems in kvm/qemu guests as well as the slow grub menu interaction. This works for SVM now, it is not tested on kvm/vmx. Signed-off-by: Markus Rechberger Signed-off-by: Joerg Roedel -- Joerg Roedel Operating System Research Center AMD Saxony LLC & Co. KG --vkogqOf2sHV7VnPd Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=kvm-12-qemu-reboot.patch Content-Transfer-Encoding: 7bit diff -ur kvm-12-old/qemu/qemu-kvm.c kvm-12/qemu/qemu-kvm.c --- kvm-12-old/qemu/qemu-kvm.c 2007-01-23 11:40:46.000000000 +0100 +++ kvm-12/qemu/qemu-kvm.c 2007-01-24 13:27:00.000000000 +0100 @@ -582,6 +582,12 @@ return 1; } + +static int kvm_shutdown(void *opaque, int vcpu) +{ + qemu_system_reset_request(); + return 1; +} static struct kvm_callbacks qemu_kvm_ops = { .cpuid = kvm_cpuid, @@ -601,6 +607,7 @@ .writel = kvm_writel, .writeq = kvm_writeq, .halt = kvm_halt, + .shutdown = kvm_shutdown, .io_window = kvm_io_window, .try_push_interrupts = try_push_interrupts, .post_kvm_run = post_kvm_run, diff -ur kvm-12-old/qemu/qemu-kvm.h kvm-12/qemu/qemu-kvm.h --- kvm-12-old/qemu/qemu-kvm.h 2006-12-31 14:31:38.000000000 +0100 +++ kvm-12/qemu/qemu-kvm.h 2007-01-24 12:21:29.000000000 +0100 @@ -10,5 +10,6 @@ void kvm_save_registers(CPUState *env); int kvm_cpu_exec(CPUState *env); int kvm_update_debugger(CPUState *env); +extern void qemu_system_reset_request(void); #endif diff -ur kvm-12-old/qemu/target-i386/helper2.c kvm-12/qemu/target-i386/helper2.c --- kvm-12-old/qemu/target-i386/helper2.c 2006-12-31 14:31:38.000000000 +0100 +++ kvm-12/qemu/target-i386/helper2.c 2007-01-24 12:20:46.000000000 +0100 @@ -151,6 +151,9 @@ void cpu_reset(CPUX86State *env) { int i; + unsigned int flags = DESC_P_MASK | + DESC_S_MASK | + (2 << DESC_TYPE_SHIFT); memset(env, 0, offsetof(CPUX86State, breakpoints)); @@ -173,9 +176,9 @@ env->tr.flags = DESC_P_MASK; cpu_x86_load_seg_cache(env, R_CS, 0xf000, 0xffff0000, 0xffff, 0); - cpu_x86_load_seg_cache(env, R_DS, 0, 0, 0xffff, 0); - cpu_x86_load_seg_cache(env, R_ES, 0, 0, 0xffff, 0); - cpu_x86_load_seg_cache(env, R_SS, 0, 0, 0xffff, 0); + cpu_x86_load_seg_cache(env, R_DS, 0, 0, 0xffff, flags); + cpu_x86_load_seg_cache(env, R_ES, 0, 0, 0xffff, flags); + cpu_x86_load_seg_cache(env, R_SS, 0, 0, 0xffff, flags); cpu_x86_load_seg_cache(env, R_FS, 0, 0, 0xffff, 0); cpu_x86_load_seg_cache(env, R_GS, 0, 0, 0xffff, 0); diff -ur kvm-12-old/qemu/vl.c kvm-12/qemu/vl.c --- kvm-12-old/qemu/vl.c 2007-01-07 13:58:54.000000000 +0100 +++ kvm-12/qemu/vl.c 2007-01-24 13:41:24.000000000 +0100 @@ -5248,6 +5248,13 @@ CPUState *env; cur_cpu = first_cpu; + + /* initialize first cpu */ +#ifdef USE_KVM + if (kvm_allowed) + kvm_load_registers(cur_cpu); +#endif + for(;;) { if (vm_running) { @@ -5281,6 +5288,10 @@ if (reset_requested) { reset_requested = 0; qemu_system_reset(); +#ifdef USE_KVM + if (kvm_allowed) + kvm_load_registers(env); +#endif ret = EXCP_INTERRUPT; } if (powerdown_requested) { diff -ur kvm-12-old/user/kvmctl.c kvm-12/user/kvmctl.c --- kvm-12-old/user/kvmctl.c 2006-12-31 14:31:38.000000000 +0100 +++ kvm-12/user/kvmctl.c 2007-01-24 12:20:46.000000000 +0100 @@ -522,6 +522,11 @@ return kvm->callbacks->halt(kvm->opaque, kvm_run->vcpu); } +static int handle_shutdown(kvm_context_t kvm, struct kvm_run *kvm_run) +{ + return kvm->callbacks->shutdown(kvm->opaque, kvm_run->vcpu); +} + int try_push_interrupts(kvm_context_t kvm) { return kvm->callbacks->try_push_interrupts(kvm->opaque); @@ -594,6 +599,9 @@ break; case KVM_EXIT_IRQ_WINDOW_OPEN: break; + case KVM_EXIT_SHUTDOWN: + r = handle_shutdown(kvm, &kvm_run); + break; default: fprintf(stderr, "unhandled vm exit: 0x%x\n", kvm_run.exit_reason); kvm_show_regs(kvm, vcpu); diff -ur kvm-12-old/user/kvmctl.h kvm-12/user/kvmctl.h --- kvm-12-old/user/kvmctl.h 2006-12-31 14:31:38.000000000 +0100 +++ kvm-12/user/kvmctl.h 2007-01-24 12:20:46.000000000 +0100 @@ -59,6 +59,7 @@ * on the host CPU. */ int (*halt)(void *opaque, int vcpu); + int (*shutdown)(void *opaque, int vcpu); int (*io_window)(void *opaque); int (*try_push_interrupts)(void *opaque); void (*post_kvm_run)(void *opaque, struct kvm_run *kvm_run); --vkogqOf2sHV7VnPd Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Disposition: inline ------------------------------------------------------------------------- Take Surveys. Earn Cash. Influence the Future of IT Join SourceForge.net's Techsay panel and you'll get the chance to share your opinions on IT & business topics through brief surveys - and earn cash http://www.techsay.com/default.php?page=join.php&p=sourceforge&CID=DEVDEV --vkogqOf2sHV7VnPd Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Disposition: inline _______________________________________________ kvm-devel mailing list kvm-devel-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f@public.gmane.org https://lists.sourceforge.net/lists/listinfo/kvm-devel --vkogqOf2sHV7VnPd--