From: Marcelo Tosatti <mtosatti@redhat.com>
To: avi@redhat.com
Cc: kvm@vger.kernel.org, Marcelo Tosatti <mtosatti@redhat.com>
Subject: [patch 2/3] kvm test: export vm helpers
Date: Mon, 05 Jul 2010 15:16:10 -0300 [thread overview]
Message-ID: <20100705181654.691118903@amt.cnet> (raw)
In-Reply-To: 20100705181608.720014170@amt.cnet
[-- Attachment #1: 4-8-test-export-vm-helpers.patch --]
[-- Type: text/plain, Size: 5901 bytes --]
To be used by rmap chain patch. Also make install_pte take an argument
indicating physical location of pagetable.
Signed-off-by: Marcelo Tosatti <mtosatti@redhat.com>
Index: qemu-kvm/kvm/test/x86/vm.c
===================================================================
--- qemu-kvm.orig/kvm/test/x86/vm.c
+++ qemu-kvm/kvm/test/x86/vm.c
@@ -14,16 +14,6 @@
static void *free = 0;
static void *vfree_top = 0;
-static unsigned long virt_to_phys(const void *virt)
-{
- return (unsigned long)virt;
-}
-
-static void *phys_to_virt(unsigned long phys)
-{
- return (void *)phys;
-}
-
void *memset(void *data, int c, unsigned long len)
{
char *s = data;
@@ -66,11 +56,6 @@ void free_page(void *page)
extern char edata;
static unsigned long end_of_memory;
-#define PTE_PRESENT (1ull << 0)
-#define PTE_PSE (1ull << 7)
-#define PTE_WRITE (1ull << 1)
-#define PTE_ADDR (0xffffffffff000ull)
-
#ifdef __x86_64__
#define PAGE_LEVEL 4
#define PGDIR_WIDTH 9
@@ -81,10 +66,11 @@ static unsigned long end_of_memory;
#define PGDIR_MASK 1023
#endif
-static void install_pte(unsigned long *cr3,
- int pte_level,
- void *virt,
- unsigned long pte)
+void install_pte(unsigned long *cr3,
+ int pte_level,
+ void *virt,
+ unsigned long pte,
+ unsigned long *pt_page)
{
int level;
unsigned long *pt = cr3;
@@ -93,7 +79,11 @@ static void install_pte(unsigned long *c
for (level = PAGE_LEVEL; level > pte_level; --level) {
offset = ((unsigned long)virt >> ((level-1) * PGDIR_WIDTH + 12)) & PGDIR_MASK;
if (!(pt[offset] & PTE_PRESENT)) {
- unsigned long *new_pt = alloc_page();
+ unsigned long *new_pt = pt_page;
+ if (!new_pt)
+ new_pt = alloc_page();
+ else
+ pt_page = 0;
memset(new_pt, 0, PAGE_SIZE);
pt[offset] = virt_to_phys(new_pt) | PTE_PRESENT | PTE_WRITE;
}
@@ -123,58 +113,20 @@ static unsigned long get_pte(unsigned lo
return pte;
}
-static void install_large_page(unsigned long *cr3,
- unsigned long phys,
- void *virt)
-{
- install_pte(cr3, 2, virt, phys | PTE_PRESENT | PTE_WRITE | PTE_PSE);
-}
-
-static void install_page(unsigned long *cr3,
- unsigned long phys,
- void *virt)
-{
- install_pte(cr3, 1, virt, phys | PTE_PRESENT | PTE_WRITE);
-}
-
-static inline void load_cr3(unsigned long cr3)
-{
- asm ( "mov %0, %%cr3" : : "r"(cr3) );
-}
-
-static inline unsigned long read_cr3()
+void install_large_page(unsigned long *cr3,
+ unsigned long phys,
+ void *virt)
{
- unsigned long cr3;
-
- asm volatile ( "mov %%cr3, %0" : "=r"(cr3) );
- return cr3;
+ install_pte(cr3, 2, virt, phys | PTE_PRESENT | PTE_WRITE | PTE_PSE, 0);
}
-static inline void load_cr0(unsigned long cr0)
+void install_page(unsigned long *cr3,
+ unsigned long phys,
+ void *virt)
{
- asm volatile ( "mov %0, %%cr0" : : "r"(cr0) );
-}
-
-static inline unsigned long read_cr0()
-{
- unsigned long cr0;
-
- asm volatile ( "mov %%cr0, %0" : "=r"(cr0) );
- return cr0;
+ install_pte(cr3, 1, virt, phys | PTE_PRESENT | PTE_WRITE, 0);
}
-static inline void load_cr4(unsigned long cr4)
-{
- asm volatile ( "mov %0, %%cr4" : : "r"(cr4) );
-}
-
-static inline unsigned long read_cr4()
-{
- unsigned long cr4;
-
- asm volatile ( "mov %%cr4, %0" : "=r"(cr4) );
- return cr4;
-}
struct gdt_table_descr
{
Index: qemu-kvm/kvm/test/x86/vm.h
===================================================================
--- qemu-kvm.orig/kvm/test/x86/vm.h
+++ qemu-kvm/kvm/test/x86/vm.h
@@ -1,10 +1,85 @@
#ifndef VM_H
#define VM_H
+#define PAGE_SIZE 4096ul
+#ifdef __x86_64__
+#define LARGE_PAGE_SIZE (512 * PAGE_SIZE)
+#else
+#define LARGE_PAGE_SIZE (1024 * PAGE_SIZE)
+#endif
+
+#define PTE_PRESENT (1ull << 0)
+#define PTE_PSE (1ull << 7)
+#define PTE_WRITE (1ull << 1)
+#define PTE_ADDR (0xffffffffff000ull)
+
void setup_vm();
void *vmalloc(unsigned long size);
void vfree(void *mem);
void *vmap(unsigned long long phys, unsigned long size);
+void install_pte(unsigned long *cr3,
+ int pte_level,
+ void *virt,
+ unsigned long pte,
+ unsigned long *pt_page);
+
+void *alloc_page();
+
+void install_large_page(unsigned long *cr3,unsigned long phys,
+ void *virt);
+void install_page(unsigned long *cr3, unsigned long phys, void *virt);
+
+static inline unsigned long virt_to_phys(const void *virt)
+{
+ return (unsigned long)virt;
+}
+
+static inline void *phys_to_virt(unsigned long phys)
+{
+ return (void *)phys;
+}
+
+
+static inline void load_cr3(unsigned long cr3)
+{
+ asm ( "mov %0, %%cr3" : : "r"(cr3) );
+}
+
+static inline unsigned long read_cr3()
+{
+ unsigned long cr3;
+
+ asm volatile ( "mov %%cr3, %0" : "=r"(cr3) );
+ return cr3;
+}
+
+static inline void load_cr0(unsigned long cr0)
+{
+ asm volatile ( "mov %0, %%cr0" : : "r"(cr0) );
+}
+
+static inline unsigned long read_cr0()
+{
+ unsigned long cr0;
+
+ asm volatile ( "mov %%cr0, %0" : "=r"(cr0) );
+ return cr0;
+}
+
+
+static inline void load_cr4(unsigned long cr4)
+{
+ asm volatile ( "mov %0, %%cr4" : : "r"(cr4) );
+}
+
+static inline unsigned long read_cr4()
+{
+ unsigned long cr4;
+
+ asm volatile ( "mov %%cr4, %0" : "=r"(cr4) );
+ return cr4;
+}
+
#endif
Index: qemu-kvm/kvm/test/x86/emulator.c
===================================================================
--- qemu-kvm.orig/kvm/test/x86/emulator.c
+++ qemu-kvm/kvm/test/x86/emulator.c
@@ -220,14 +220,6 @@ jmpf:
report("ljmp", res);
}
-unsigned long read_cr0(void)
-{
- unsigned long cr0;
-
- asm volatile ("mov %%cr0, %0" : "=r"(cr0));
- return cr0;
-}
-
void test_smsw(void)
{
char mem[16];
next prev parent reply other threads:[~2010-07-05 18:18 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
2010-07-05 18:16 [patch 0/3] [RESEND] kvm test: test rmap chains Marcelo Tosatti
2010-07-05 18:16 ` [patch 1/3] kvm test: protect fwfcg accesses with spinlock Marcelo Tosatti
2010-07-05 18:16 ` Marcelo Tosatti [this message]
2010-07-05 18:16 ` [patch 3/3] kvm test: long rmap chains Marcelo Tosatti
2010-07-06 7:32 ` Avi Kivity
2010-07-06 7:27 ` [patch 0/3] [RESEND] kvm test: test " 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=20100705181654.691118903@amt.cnet \
--to=mtosatti@redhat.com \
--cc=avi@redhat.com \
--cc=kvm@vger.kernel.org \
/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.