From mboxrd@z Thu Jan 1 00:00:00 1970 From: Jerone Young Subject: [PATCH 12 of 20] Move abi 10 functions to libkvm-x86.c Date: Fri, 02 Nov 2007 05:36:48 -0500 Message-ID: References: Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="===============1011203921==" Cc: kvm-ppc-devel-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f@public.gmane.org To: kvm-devel-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f@public.gmane.org Return-path: In-Reply-To: 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 --===============1011203921== Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: quoted-printable # HG changeset patch # User Jerone Young # Date 1193999194 18000 # Node ID a2a901203454cc13f623627f6a38da9f47e386cf # Parent 1a317a4b44a4553f43eeb1165e543396a198fac4 Move abi 10 functions to libkvm-x86.c Move handle_io_abi_10 to libkvm-x86.c Move handle_mmio_abi10 to libkvm-x86.c Move kvm_run_abi10 to libkvm-x86.c WARNING: You will get compile warning libkvm-x86.c:561: warning: implicit declaration of function =E2=80=98kvm_= show_code=E2=80=99 Until you apply the kvm_show_code patch. Signed-off-by: Jerone Young diff --git a/libkvm/kvm-x86.h b/libkvm/kvm-x86.h --- a/libkvm/kvm-x86.h +++ b/libkvm/kvm-x86.h @@ -41,4 +41,6 @@ void *kvm_create_kernel_phys_mem(kvm_con void *kvm_create_kernel_phys_mem(kvm_context_t kvm, unsigned long phys_s= tart, unsigned long len, int log, int writable); =20 +int kvm_run_abi10(kvm_context_t kvm, int vcpu); + #endif diff --git a/libkvm/libkvm-x86.c b/libkvm/libkvm-x86.c --- a/libkvm/libkvm-x86.c +++ b/libkvm/libkvm-x86.c @@ -1,6 +1,7 @@ #include "libkvm.h" #include "kvm-x86.h" #include "kvm-context.h" +#include "kvm-abi-10.h" #include #include #include @@ -12,6 +13,7 @@ #include #include #include +#include =20 int kvm_alloc_kernel_memory(kvm_context_t kvm, unsigned long memory, void **vm_mem) @@ -408,4 +410,185 @@ int kvm_set_lapic(kvm_context_t kvm, int =20 #endif =20 - +static int handle_io_abi10(kvm_context_t kvm, struct kvm_run_abi10 *run, + int vcpu) +{ + uint16_t addr =3D run->io.port; + int r; + int i; + void *p =3D (void *)run + run->io.data_offset; + + for (i =3D 0; i < run->io.count; ++i) { + switch (run->io.direction) { + case KVM_EXIT_IO_IN: + switch (run->io.size) { + case 1: + r =3D kvm->callbacks->inb(kvm->opaque, addr, p); + break; + case 2: + r =3D kvm->callbacks->inw(kvm->opaque, addr, p); + break; + case 4: + r =3D kvm->callbacks->inl(kvm->opaque, addr, p); + break; + default: + fprintf(stderr, "bad I/O size %d\n", run->io.size); + return -EMSGSIZE; + } + break; + case KVM_EXIT_IO_OUT: + switch (run->io.size) { + case 1: + r =3D kvm->callbacks->outb(kvm->opaque, addr, + *(uint8_t *)p); + break; + case 2: + r =3D kvm->callbacks->outw(kvm->opaque, addr, + *(uint16_t *)p); + break; + case 4: + r =3D kvm->callbacks->outl(kvm->opaque, addr, + *(uint32_t *)p); + break; + default: + fprintf(stderr, "bad I/O size %d\n", run->io.size); + return -EMSGSIZE; + } + break; + default: + fprintf(stderr, "bad I/O direction %d\n", run->io.direction); + return -EPROTO; + } + + p +=3D run->io.size; + } + run->io_completed =3D 1; + + return 0; +} + +static int handle_mmio_abi10(kvm_context_t kvm, struct kvm_run_abi10 *kv= m_run) +{ + unsigned long addr =3D kvm_run->mmio.phys_addr; + void *data =3D kvm_run->mmio.data; + int r =3D -1; + + if (kvm_run->mmio.is_write) { + switch (kvm_run->mmio.len) { + case 1: + r =3D kvm->callbacks->writeb(kvm->opaque, addr, + *(uint8_t *)data); + break; + case 2: + r =3D kvm->callbacks->writew(kvm->opaque, addr, + *(uint16_t *)data); + break; + case 4: + r =3D kvm->callbacks->writel(kvm->opaque, addr, + *(uint32_t *)data); + break; + case 8: + r =3D kvm->callbacks->writeq(kvm->opaque, addr, + *(uint64_t *)data); + break; + } + } else { + switch (kvm_run->mmio.len) { + case 1: + r =3D kvm->callbacks->readb(kvm->opaque, addr, + (uint8_t *)data); + break; + case 2: + r =3D kvm->callbacks->readw(kvm->opaque, addr, + (uint16_t *)data); + break; + case 4: + r =3D kvm->callbacks->readl(kvm->opaque, addr, + (uint32_t *)data); + break; + case 8: + r =3D kvm->callbacks->readq(kvm->opaque, addr, + (uint64_t *)data); + break; + } + kvm_run->io_completed =3D 1; + } + return r; +} + +int kvm_run_abi10(kvm_context_t kvm, int vcpu) +{ + int r; + int fd =3D kvm->vcpu_fd[vcpu]; + struct kvm_run_abi10 *run =3D (struct kvm_run_abi10 *)kvm->run[vcpu]; + +again: + run->request_interrupt_window =3D try_push_interrupts(kvm); + r =3D pre_kvm_run(kvm, vcpu); + if (r) + return r; + r =3D ioctl(fd, KVM_RUN, 0); + post_kvm_run(kvm, vcpu); + + run->io_completed =3D 0; + if (r =3D=3D -1 && errno !=3D EINTR) { + r =3D -errno; + printf("kvm_run: %m\n"); + return r; + } + if (r =3D=3D -1) { + r =3D handle_io_window(kvm); + goto more; + } + if (1) { + switch (run->exit_reason) { + case KVM_EXIT_UNKNOWN: + fprintf(stderr, "unhandled vm exit: 0x%x vcpu_id %d\n", + (unsigned)run->hw.hardware_exit_reason, vcpu); + kvm_show_regs(kvm, vcpu); + abort(); + break; + case KVM_EXIT_FAIL_ENTRY: + fprintf(stderr, "kvm_run: failed entry, reason %u\n",=20 + (unsigned)run->fail_entry.hardware_entry_failure_reason & 0xffff); + return -ENOEXEC; + break; + case KVM_EXIT_EXCEPTION: + fprintf(stderr, "exception %d (%x)\n",=20 + run->ex.exception, + run->ex.error_code); + kvm_show_regs(kvm, vcpu); + kvm_show_code(kvm, vcpu); + abort(); + break; + case KVM_EXIT_IO: + r =3D handle_io_abi10(kvm, run, vcpu); + break; + case KVM_EXIT_DEBUG: + r =3D handle_debug(kvm, vcpu); + break; + case KVM_EXIT_MMIO: + r =3D handle_mmio_abi10(kvm, run); + break; + case KVM_EXIT_HLT: + r =3D handle_halt(kvm, vcpu); + break; + case KVM_EXIT_IRQ_WINDOW_OPEN: + break; + case KVM_EXIT_SHUTDOWN: + r =3D handle_shutdown(kvm, vcpu); + break; + default: + fprintf(stderr, "unhandled vm exit: 0x%x\n", run->exit_reason); + kvm_show_regs(kvm, vcpu); + abort(); + break; + } + } +more: + if (!r) + goto again; + return r; +} + + diff --git a/libkvm/libkvm.c b/libkvm/libkvm.c --- a/libkvm/libkvm.c +++ b/libkvm/libkvm.c @@ -547,8 +547,7 @@ int kvm_set_irqchip(kvm_context_t kvm, s =20 #endif =20 -static int handle_io_abi10(kvm_context_t kvm, struct kvm_run_abi10 *run, - int vcpu) +static int handle_io(kvm_context_t kvm, struct kvm_run *run, int vcpu) { uint16_t addr =3D run->io.port; int r; @@ -599,62 +598,6 @@ static int handle_io_abi10(kvm_context_t =20 p +=3D run->io.size; } - run->io_completed =3D 1; - - return 0; -} - -static int handle_io(kvm_context_t kvm, struct kvm_run *run, int vcpu) -{ - uint16_t addr =3D run->io.port; - int r; - int i; - void *p =3D (void *)run + run->io.data_offset; - - for (i =3D 0; i < run->io.count; ++i) { - switch (run->io.direction) { - case KVM_EXIT_IO_IN: - switch (run->io.size) { - case 1: - r =3D kvm->callbacks->inb(kvm->opaque, addr, p); - break; - case 2: - r =3D kvm->callbacks->inw(kvm->opaque, addr, p); - break; - case 4: - r =3D kvm->callbacks->inl(kvm->opaque, addr, p); - break; - default: - fprintf(stderr, "bad I/O size %d\n", run->io.size); - return -EMSGSIZE; - } - break; - case KVM_EXIT_IO_OUT: - switch (run->io.size) { - case 1: - r =3D kvm->callbacks->outb(kvm->opaque, addr, - *(uint8_t *)p); - break; - case 2: - r =3D kvm->callbacks->outw(kvm->opaque, addr, - *(uint16_t *)p); - break; - case 4: - r =3D kvm->callbacks->outl(kvm->opaque, addr, - *(uint32_t *)p); - break; - default: - fprintf(stderr, "bad I/O size %d\n", run->io.size); - return -EMSGSIZE; - } - break; - default: - fprintf(stderr, "bad I/O direction %d\n", run->io.direction); - return -EPROTO; - } - - p +=3D run->io.size; - } =20 return 0; } @@ -859,11 +802,16 @@ static void kvm_show_code(kvm_context_t=20 fprintf(stderr, "code:%s\n", code_str); } =20 -static int handle_mmio_abi10(kvm_context_t kvm, struct kvm_run_abi10 *kv= m_run) + +static int handle_mmio(kvm_context_t kvm, struct kvm_run *kvm_run) { unsigned long addr =3D kvm_run->mmio.phys_addr; void *data =3D kvm_run->mmio.data; int r =3D -1; + + /* hack: Red Hat 7.1 generates these wierd accesses. */ + if (addr =3D=3D 0xa0000 && kvm_run->mmio.len =3D=3D 3) + return 0; =20 if (kvm_run->mmio.is_write) { switch (kvm_run->mmio.len) { @@ -895,51 +843,6 @@ static int handle_mmio_abi10(kvm_context r =3D kvm->callbacks->readq(kvm->opaque, addr, (uint64_t *)data); break; } - kvm_run->io_completed =3D 1; - } - return r; -} - -static int handle_mmio(kvm_context_t kvm, struct kvm_run *kvm_run) -{ - unsigned long addr =3D kvm_run->mmio.phys_addr; - void *data =3D kvm_run->mmio.data; - int r =3D -1; - - /* hack: Red Hat 7.1 generates these wierd accesses. */ - if (addr =3D=3D 0xa0000 && kvm_run->mmio.len =3D=3D 3) - return 0; - - if (kvm_run->mmio.is_write) { - switch (kvm_run->mmio.len) { - case 1: - r =3D kvm->callbacks->writeb(kvm->opaque, addr, *(uint8_t *)data); - break; - case 2: - r =3D kvm->callbacks->writew(kvm->opaque, addr, *(uint16_t *)data); - break; - case 4: - r =3D kvm->callbacks->writel(kvm->opaque, addr, *(uint32_t *)data); - break; - case 8: - r =3D kvm->callbacks->writeq(kvm->opaque, addr, *(uint64_t *)data); - break; - } - } else { - switch (kvm_run->mmio.len) { - case 1: - r =3D kvm->callbacks->readb(kvm->opaque, addr, (uint8_t *)data); - break; - case 2: - r =3D kvm->callbacks->readw(kvm->opaque, addr, (uint16_t *)data); - break; - case 4: - r =3D kvm->callbacks->readl(kvm->opaque, addr, (uint32_t *)data); - break; - case 8: - r =3D kvm->callbacks->readq(kvm->opaque, addr, (uint64_t *)data); - break; - } } return r; } @@ -1015,81 +918,6 @@ __u64 kvm_get_cr8(kvm_context_t kvm, int __u64 kvm_get_cr8(kvm_context_t kvm, int vcpu) { return kvm->run[vcpu]->cr8; -} - -static int kvm_run_abi10(kvm_context_t kvm, int vcpu) -{ - int r; - int fd =3D kvm->vcpu_fd[vcpu]; - struct kvm_run_abi10 *run =3D (struct kvm_run_abi10 *)kvm->run[vcpu]; - -again: - run->request_interrupt_window =3D try_push_interrupts(kvm); - r =3D pre_kvm_run(kvm, vcpu); - if (r) - return r; - r =3D ioctl(fd, KVM_RUN, 0); - post_kvm_run(kvm, vcpu); - - run->io_completed =3D 0; - if (r =3D=3D -1 && errno !=3D EINTR) { - r =3D -errno; - printf("kvm_run: %m\n"); - return r; - } - if (r =3D=3D -1) { - r =3D handle_io_window(kvm); - goto more; - } - if (1) { - switch (run->exit_reason) { - case KVM_EXIT_UNKNOWN: - fprintf(stderr, "unhandled vm exit: 0x%x vcpu_id %d\n", - (unsigned)run->hw.hardware_exit_reason, vcpu); - kvm_show_regs(kvm, vcpu); - abort(); - break; - case KVM_EXIT_FAIL_ENTRY: - fprintf(stderr, "kvm_run: failed entry, reason %u\n",=20 - (unsigned)run->fail_entry.hardware_entry_failure_reason & 0xffff); - return -ENOEXEC; - break; - case KVM_EXIT_EXCEPTION: - fprintf(stderr, "exception %d (%x)\n",=20 - run->ex.exception, - run->ex.error_code); - kvm_show_regs(kvm, vcpu); - kvm_show_code(kvm, vcpu); - abort(); - break; - case KVM_EXIT_IO: - r =3D handle_io_abi10(kvm, run, vcpu); - break; - case KVM_EXIT_DEBUG: - r =3D handle_debug(kvm, vcpu); - break; - case KVM_EXIT_MMIO: - r =3D handle_mmio_abi10(kvm, run); - break; - case KVM_EXIT_HLT: - r =3D handle_halt(kvm, vcpu); - break; - case KVM_EXIT_IRQ_WINDOW_OPEN: - break; - case KVM_EXIT_SHUTDOWN: - r =3D handle_shutdown(kvm, vcpu); - break; - default: - fprintf(stderr, "unhandled vm exit: 0x%x\n", run->exit_reason); - kvm_show_regs(kvm, vcpu); - abort(); - break; - } - } -more: - if (!r) - goto again; - return r; } =20 int kvm_run(kvm_context_t kvm, int vcpu) --===============1011203921== Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Disposition: inline ------------------------------------------------------------------------- This SF.net email is sponsored by: Splunk Inc. Still grepping through log files to find problems? Stop. Now Search log events and configuration files using AJAX and a browser. Download your FREE copy of Splunk now >> http://get.splunk.com/ --===============1011203921== 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 --===============1011203921==--