From: "Michael S. Tsirkin" <mst@redhat.com>
To: Avi Kivity <avi@redhat.com>
Cc: Marcelo Tosatti <mtosatti@redhat.com>, kvm@vger.kernel.org
Subject: Re: [PATCH kvm-unit-tests 3/4] Add support for calling a function in guest mode
Date: Fri, 26 Nov 2010 16:17:48 +0200 [thread overview]
Message-ID: <20101126141748.GB6124@redhat.com> (raw)
In-Reply-To: <1290595933-13122-4-git-send-email-avi@redhat.com>
On Wed, Nov 24, 2010 at 12:52:12PM +0200, Avi Kivity wrote:
> This patch provides a way to establish an "identity" guest which has
> a 1:1 gva->hva translation. This allows the host to switch to guest
> mode, call a function in the same address space, and return.
>
> Because long mode virtual addresses are 47 bits long, and some hosts
> have smaller physical addresses, we target 32-bit mode only. On
> x86_64 the code needs to be run with 'setarch i386 -3' to limit the
> address space to 3GB, so the address space occupied by the local
> APIC is left unused.
>
> Signed-off-by: Avi Kivity <avi@redhat.com>
> ---
> api/identity.cc | 76 +++++++++++++++++++++++++++++++++++++++++++++++++
> api/identity.h | 28 ++++++++++++++++++
> config-x86-common.mak | 2 +
> 3 files changed, 106 insertions(+), 0 deletions(-)
> create mode 100644 api/identity.cc
> create mode 100644 api/identity.h
>
> diff --git a/api/identity.cc b/api/identity.cc
> new file mode 100644
> index 0000000..8e86db1
> --- /dev/null
> +++ b/api/identity.cc
> @@ -0,0 +1,76 @@
> +
> +#include "identity.h"
> +#include <stdio.h>
> +
> +namespace identity {
> +
> +typedef unsigned long ulong;
> +
> +void setup_vm(kvm::vm& vm)
> +{
> + vm.set_memory_region(0, NULL, 0, 3UL << 30);
> + vm.set_tss_addr(3UL << 30);
> +}
> +
> +void vcpu::setup_sregs()
> +{
> + kvm_sregs sregs = { };
> + kvm_segment dseg = { };
> + dseg.base = 0; dseg.limit = -1U; dseg.type = 3; dseg.present = 1;
> + dseg.dpl = 3; dseg.db = 1; dseg.s = 1; dseg.l = 0; dseg.g = 1;
> + kvm_segment cseg = dseg;
> + cseg.type = 11;
> +
> + sregs.cs = cseg; asm ("mov %%cs, %0" : "=rm"(sregs.cs.selector));
> + sregs.ds = dseg; asm ("mov %%ds, %0" : "=rm"(sregs.ds.selector));
> + sregs.es = dseg; asm ("mov %%es, %0" : "=rm"(sregs.es.selector));
> + sregs.fs = dseg; asm ("mov %%fs, %0" : "=rm"(sregs.fs.selector));
> + sregs.gs = dseg; asm ("mov %%gs, %0" : "=rm"(sregs.gs.selector));
> + sregs.ss = dseg; asm ("mov %%ss, %0" : "=rm"(sregs.ss.selector));
> +
> + uint32_t gsbase;
> + asm ("mov %%gs:0, %0" : "=r"(gsbase));
> + sregs.gs.base = gsbase;
> +
> + sregs.tr.base = reinterpret_cast<ulong>(&*_stack.begin());
> + sregs.tr.type = 11;
> + sregs.tr.s = 0;
> + sregs.tr.present = 1;
> +
> + sregs.cr0 = 0x11; /* PE, ET, !PG */
> + sregs.cr4 = 0;
> + sregs.efer = 0;
> + sregs.apic_base = 0xfee00000;
> + _vcpu.set_sregs(sregs);
> +}
> +
> +void vcpu::thunk(vcpu* zis)
> +{
> + zis->_guest_func();
> + asm volatile("outb %%al, %%dx" : : "a"(0), "d"(0));
> +}
> +
> +void vcpu::setup_regs()
> +{
> + kvm_regs regs = {};
> + regs.rflags = 0x3202;
> + regs.rsp = reinterpret_cast<ulong>(&*_stack.end());
> + regs.rsp &= ~15UL;
> + ulong* sp = reinterpret_cast<ulong *>(regs.rsp);
> + *--sp = reinterpret_cast<ulong>((char*)this);
> + *--sp = 0;
> + regs.rsp = reinterpret_cast<ulong>(sp);
> + regs.rip = reinterpret_cast<ulong>(&vcpu::thunk);
> + printf("rip %llx\n", regs.rip);
> + _vcpu.set_regs(regs);
> +}
> +
> +vcpu::vcpu(kvm::vcpu& vcpu, boost::function<void ()> guest_func,
> + unsigned long stack_size)
> + : _vcpu(vcpu), _guest_func(guest_func), _stack(stack_size)
> +{
> + setup_sregs();
> + setup_regs();
> +}
> +
> +}
> diff --git a/api/identity.h b/api/identity.h
> new file mode 100644
> index 0000000..025177a
> --- /dev/null
> +++ b/api/identity.h
> @@ -0,0 +1,28 @@
> +#ifndef API_IDENTITY_H
> +#define API_IDENTITY_H
> +
> +#include "kvmxx.h"
> +#include <boost/function.hpp>
This seems to use boost, which is not part of the standard library.
Do we want this dependency?
We'd need a configure check to verify it's installed.
> +#include <vector>
> +
> +namespace identity {
> +
> +void setup_vm(kvm::vm& vm);
> +
> +class vcpu {
> +public:
> + vcpu(kvm::vcpu& vcpu, boost::function<void ()> guest_func,
> + unsigned long stack_size = 256 * 1024);
So the thread stack is moved to use the heap instead?
Can we use pthread_attr_getstacksize and use the regular thread stack?
Good for portability.
> +private:
> + static void thunk(vcpu* vcpu);
> + void setup_regs();
> + void setup_sregs();
> +private:
> + kvm::vcpu& _vcpu;
> + boost::function<void ()> _guest_func;
> + std::vector<char> _stack;
> +};
> +
> +}
> +
> +#endif
> diff --git a/config-x86-common.mak b/config-x86-common.mak
> index b541c1c..0f3387b 100644
> --- a/config-x86-common.mak
> +++ b/config-x86-common.mak
> @@ -79,3 +79,5 @@ arch_clean:
> $(TEST_DIR)/.*.d $(TEST_DIR)/lib/.*.d $(TEST_DIR)/lib/*.o
>
> -include $(TEST_DIR)/.*.d lib/.*.d lib/x86/.*.d
> +
> +api/%.o: CFLAGS += -m32
> \ No newline at end of file
> --
> 1.7.1
>
> --
> To unsubscribe from this list: send the line "unsubscribe kvm" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at http://vger.kernel.org/majordomo-info.html
next prev parent reply other threads:[~2010-11-26 14:18 UTC|newest]
Thread overview: 130+ messages / expand[flat|nested] mbox.gz Atom feed top
2010-11-24 10:52 [PATCH kvm-unit-tests 0/4] API test framework Avi Kivity
2010-11-24 10:52 ` [PATCH kvm-unit-tests 1/4] Makefile: add support for C++ Avi Kivity
2010-11-24 10:52 ` [PATCH kvm-unit-tests 2/4] Introduce a C++ wrapper for the kvm APIs Avi Kivity
2010-11-24 12:59 ` Alexander Graf
2010-11-24 13:33 ` Gleb Natapov
2010-11-24 14:18 ` Anthony Liguori
2010-11-24 14:24 ` Anthony Liguori
2010-11-24 14:32 ` Avi Kivity
2010-11-24 14:31 ` Avi Kivity
2010-11-24 14:41 ` Anthony Liguori
2010-11-24 15:40 ` Gleb Natapov
2010-11-24 15:50 ` Anthony Liguori
2010-11-24 16:10 ` Avi Kivity
2010-12-02 13:52 ` Mike Day
2010-11-24 16:12 ` [PATCH kvm-unit-tests 2/4] " Gleb Natapov
2010-11-24 16:14 ` Avi Kivity
2010-11-24 16:21 ` Gleb Natapov
2010-11-24 16:25 ` Avi Kivity
2010-11-24 16:29 ` Gleb Natapov
2010-11-24 16:33 ` Avi Kivity
2010-11-24 16:52 ` Gleb Natapov
2010-11-24 16:56 ` Avi Kivity
2010-11-24 17:02 ` Gleb Natapov
2010-11-24 17:07 ` Avi Kivity
2010-11-24 17:10 ` Jes Sorensen
2010-11-24 17:12 ` Avi Kivity
2010-11-24 17:14 ` Anthony Liguori
2010-11-24 16:43 ` Anthony Liguori
2010-11-24 16:48 ` Gleb Natapov
2010-11-24 16:56 ` Anthony Liguori
2010-11-24 17:04 ` Gleb Natapov
2010-11-24 16:40 ` Anthony Liguori
2010-11-24 17:33 ` Gleb Natapov
2010-11-24 17:39 ` Avi Kivity
2010-11-24 17:41 ` Gleb Natapov
2010-11-24 17:50 ` Avi Kivity
2010-11-24 18:23 ` Gleb Natapov
2010-11-24 18:50 ` Avi Kivity
2010-11-24 18:17 ` Anthony Liguori
2010-11-24 18:34 ` Gleb Natapov
2010-11-24 18:53 ` Anthony Liguori
2010-11-25 8:35 ` Gleb Natapov
2010-11-24 16:40 ` Jes Sorensen
2010-11-24 16:47 ` Avi Kivity
2010-11-24 16:51 ` Jes Sorensen
2010-11-24 16:57 ` Anthony Liguori
2010-11-24 17:29 ` Avi Kivity
2010-11-24 16:59 ` Avi Kivity
2010-11-24 17:06 ` Jes Sorensen
2010-11-24 17:11 ` Avi Kivity
2010-11-24 17:17 ` Jes Sorensen
2010-11-24 17:25 ` Avi Kivity
2010-11-24 17:28 ` Jes Sorensen
2010-11-24 17:31 ` Avi Kivity
2010-11-24 17:36 ` Gleb Natapov
2010-11-24 17:41 ` Avi Kivity
2010-11-24 17:27 ` Anthony Liguori
2010-11-24 17:35 ` Avi Kivity
2010-11-24 17:36 ` Jes Sorensen
2010-11-24 17:41 ` Avi Kivity
2010-11-24 17:43 ` Gleb Natapov
2010-11-24 17:50 ` Avi Kivity
2010-11-24 18:10 ` Gleb Natapov
2010-11-24 18:55 ` Avi Kivity
2010-11-24 19:29 ` Jes Sorensen
2010-11-24 19:33 ` Avi Kivity
2010-11-24 17:43 ` Jes Sorensen
2010-11-24 17:51 ` Avi Kivity
2010-11-24 17:43 ` Anthony Liguori
2010-11-24 17:45 ` Jes Sorensen
2010-11-24 17:51 ` Avi Kivity
2010-11-24 18:01 ` Anthony Liguori
2010-11-24 18:56 ` Avi Kivity
2010-11-24 16:55 ` Gleb Natapov
2010-11-24 17:01 ` Avi Kivity
2010-11-24 17:16 ` Gleb Natapov
2010-11-24 17:26 ` Avi Kivity
2010-11-24 16:53 ` Anthony Liguori
2010-11-24 17:03 ` Jes Sorensen
2010-11-28 12:27 ` Michael S. Tsirkin
2010-11-28 22:04 ` Anthony Liguori
2010-11-28 22:28 ` Michael S. Tsirkin
2010-11-28 23:13 ` Anthony Liguori
2010-11-29 8:04 ` Michael S. Tsirkin
2010-11-29 13:44 ` Anthony Liguori
2010-11-29 13:48 ` Avi Kivity
2010-11-24 16:29 ` Jes Sorensen
2010-11-24 16:34 ` Avi Kivity
2010-11-24 16:44 ` Jes Sorensen
2010-11-24 16:49 ` Avi Kivity
2010-11-28 11:59 ` Michael S. Tsirkin
2010-11-28 13:02 ` Avi Kivity
2010-11-28 13:57 ` Michael S. Tsirkin
2010-11-28 14:34 ` Avi Kivity
2010-11-28 16:57 ` Michael S. Tsirkin
2010-11-29 9:22 ` Avi Kivity
2010-11-29 10:47 ` Michael S. Tsirkin
2010-11-29 10:52 ` Avi Kivity
2010-11-29 11:26 ` Michael S. Tsirkin
2010-11-29 13:38 ` Anthony Liguori
2010-11-24 14:10 ` Anthony Liguori
2010-11-24 14:29 ` Avi Kivity
2010-11-24 14:45 ` Anthony Liguori
2010-11-24 14:53 ` Avi Kivity
2010-11-24 14:55 ` Anthony Liguori
2010-11-25 16:32 ` Avi Kivity
2010-11-26 10:16 ` Michael S. Tsirkin
[not found] ` <4CF0CB9A.5060403@redhat.com>
2010-11-28 8:58 ` Michael S. Tsirkin
2010-11-28 9:31 ` Avi Kivity
2010-11-28 9:50 ` Michael S. Tsirkin
2010-11-28 9:54 ` Avi Kivity
2010-11-28 11:44 ` Michael S. Tsirkin
2010-11-28 13:14 ` Avi Kivity
2010-11-28 14:40 ` Michael S. Tsirkin
2010-11-28 22:12 ` Anthony Liguori
2010-11-29 9:30 ` Avi Kivity
2010-11-28 11:49 ` Michael S. Tsirkin
2010-11-28 13:15 ` Avi Kivity
2010-11-28 14:49 ` Michael S. Tsirkin
2010-11-29 9:30 ` Avi Kivity
2010-11-24 10:52 ` [PATCH kvm-unit-tests 3/4] Add support for calling a function in guest mode Avi Kivity
2010-11-26 14:17 ` Michael S. Tsirkin [this message]
[not found] ` <4CF0CC26.8030407@redhat.com>
2010-11-28 8:59 ` Michael S. Tsirkin
2010-11-28 9:22 ` Avi Kivity
2010-11-24 10:52 ` [PATCH kvm-unit-tests 4/4] Add sample test using the api test harness Avi Kivity
2010-11-26 14:17 ` Michael S. Tsirkin
[not found] ` <4CF0CC4A.8070100@redhat.com>
2010-11-28 9:04 ` Michael S. Tsirkin
2010-11-28 9:21 ` Avi Kivity
2010-11-29 16:09 ` [PATCH kvm-unit-tests 0/4] API test framework Marcelo Tosatti
2010-12-01 10:38 ` Avi Kivity
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20101126141748.GB6124@redhat.com \
--to=mst@redhat.com \
--cc=avi@redhat.com \
--cc=kvm@vger.kernel.org \
--cc=mtosatti@redhat.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.