* [PATCH 1/2] qemu-kvm tests: make x86/vm.c support 32-bit host
@ 2010-06-07 15:11 Asias He
2010-06-07 15:11 ` [PATCH 2/2] qemu-kvm tests: make sieve test runable on " Asias He
0 siblings, 1 reply; 3+ messages in thread
From: Asias He @ 2010-06-07 15:11 UTC (permalink / raw)
To: kvm, Avi Kivity, Naphtali Sprei, Marcelo Tosatti
Signed-off-by: Asias He <asias.hejun@gmail.com>
---
kvm/test/x86/vm.c | 46 +++++++++++++++++++++++++++++++++++-----------
1 files changed, 35 insertions(+), 11 deletions(-)
diff --git a/kvm/test/x86/vm.c b/kvm/test/x86/vm.c
index ec9c145..c9876e5 100644
--- a/kvm/test/x86/vm.c
+++ b/kvm/test/x86/vm.c
@@ -1,11 +1,16 @@
-
#include "vm.h"
-
-void print(const char *s);
+#include "libcflat.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 X86_CR0_PE 0x00000001
+#define X86_CR0_PG 0x80000000
+#define X86_CR4_PSE 0x00000010
static void *free = 0;
static void *vfree_top = 0;
@@ -66,6 +71,16 @@ static unsigned long end_of_memory;
#define PTE_WRITE (1ull << 1)
#define PTE_ADDR (0xffffffffff000ull)
+#ifdef __x86_64__
+#define PAGE_LEVEL 4
+#define PGDIR_WIDTH 9
+#define PGDIR_MASK 511
+#else
+#define PAGE_LEVEL 2
+#define PGDIR_WIDTH 10
+#define PGDIR_MASK 1023
+#endif
+
static void install_pte(unsigned long *cr3,
int pte_level,
void *virt,
@@ -75,8 +90,8 @@ static void install_pte(unsigned long *cr3,
unsigned long *pt = cr3;
unsigned offset;
- for (level = 4; level > pte_level; --level) {
- offset = ((unsigned long)virt >> ((level-1) * 9 + 12)) & 511;
+ 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();
memset(new_pt, 0, PAGE_SIZE);
@@ -84,7 +99,7 @@ static void install_pte(unsigned long *cr3,
}
pt = phys_to_virt(pt[offset] & 0xffffffffff000ull);
}
- offset = ((unsigned long)virt >> (((level-1) * 9) + 12)) & 511;
+ offset = ((unsigned long)virt >> ((level-1) * PGDIR_WIDTH + 12)) & PGDIR_MASK;
pt[offset] = pte;
}
@@ -94,8 +109,8 @@ static unsigned long get_pte(unsigned long *cr3, void *virt)
unsigned long *pt = cr3, pte;
unsigned offset;
- for (level = 4; level > 1; --level) {
- offset = ((unsigned long)virt >> (((level-1) * 9) + 12)) & 511;
+ for (level = PAGE_LEVEL; level > 1; --level) {
+ offset = ((unsigned long)virt >> (((level-1) * PGDIR_WIDTH) + 12)) & PGDIR_MASK;
pte = pt[offset];
if (!(pte & PTE_PRESENT))
return 0;
@@ -103,7 +118,7 @@ static unsigned long get_pte(unsigned long *cr3, void *virt)
return pte;
pt = phys_to_virt(pte & 0xffffffffff000ull);
}
- offset = ((unsigned long)virt >> (((level-1) * 9) + 12)) & 511;
+ offset = ((unsigned long)virt >> (((level-1) * PGDIR_WIDTH) + 12)) & PGDIR_MASK;
pte = pt[offset];
return pte;
}
@@ -189,8 +204,10 @@ static void setup_mmu(unsigned long len)
unsigned long *cr3 = alloc_page();
unsigned long phys = 0;
+#if 0
if (len < (1ul << 32))
len = 1ul << 32; /* map mmio 1:1 */
+#endif
memset(cr3, 0, PAGE_SIZE);
while (phys + LARGE_PAGE_SIZE <= len) {
@@ -201,9 +218,16 @@ static void setup_mmu(unsigned long len)
install_page(cr3, phys, (void *)phys);
phys += PAGE_SIZE;
}
-
load_cr3(virt_to_phys(cr3));
- print("paging enabled\n");
+#ifndef __x86_64__
+ load_cr4(X86_CR4_PSE);
+#endif
+ load_cr0(X86_CR0_PG |X86_CR0_PE);
+
+ printf("paging enabled\n");
+ printf("cr0 = %x\n", read_cr0());
+ printf("cr3 = %x\n", read_cr3());
+ printf("cr4 = %x\n", read_cr4());
}
static unsigned int inl(unsigned short port)
--
1.7.1
^ permalink raw reply related [flat|nested] 3+ messages in thread
* [PATCH 2/2] qemu-kvm tests: make sieve test runable on 32-bit host
2010-06-07 15:11 [PATCH 1/2] qemu-kvm tests: make x86/vm.c support 32-bit host Asias He
@ 2010-06-07 15:11 ` Asias He
2010-06-08 13:44 ` Avi Kivity
0 siblings, 1 reply; 3+ messages in thread
From: Asias He @ 2010-06-07 15:11 UTC (permalink / raw)
To: kvm, Avi Kivity, Naphtali Sprei, Marcelo Tosatti
Signed-off-by: Asias He <asias.hejun@gmail.com>
---
kvm/test/config-x86-common.mak | 4 +-
kvm/test/config-x86_64.mak | 4 +-
kvm/test/x86/sieve.c | 48 ++++-----------------------------------
3 files changed, 9 insertions(+), 47 deletions(-)
diff --git a/kvm/test/config-x86-common.mak b/kvm/test/config-x86-common.mak
index 38dbf5a..c97de52 100644
--- a/kvm/test/config-x86-common.mak
+++ b/kvm/test/config-x86-common.mak
@@ -25,7 +25,7 @@ FLATLIBS = lib/libcflat.a $(libgcc)
tests-common = $(TEST_DIR)/vmexit.flat $(TEST_DIR)/tsc.flat \
$(TEST_DIR)/smptest.flat $(TEST_DIR)/port80.flat \
$(TEST_DIR)/realmode.flat $(TEST_DIR)/msr.flat \
- $(TEST_DIR)/hypercall.flat
+ $(TEST_DIR)/hypercall.flat $(TEST_DIR)/sieve.flat
test_cases: $(tests-common) $(tests)
@@ -36,7 +36,7 @@ $(TEST_DIR)/access.flat: $(cstart.o) $(TEST_DIR)/access.o $(TEST_DIR)/print.o
$(TEST_DIR)/hypercall.flat: $(cstart.o) $(TEST_DIR)/hypercall.o
$(TEST_DIR)/sieve.flat: $(cstart.o) $(TEST_DIR)/sieve.o \
- $(TEST_DIR)/print.o $(TEST_DIR)/vm.o
+ $(TEST_DIR)/vm.o
$(TEST_DIR)/vmexit.flat: $(cstart.o) $(TEST_DIR)/vmexit.o
diff --git a/kvm/test/config-x86_64.mak b/kvm/test/config-x86_64.mak
index cc7d7d7..d8fd2b5 100644
--- a/kvm/test/config-x86_64.mak
+++ b/kvm/test/config-x86_64.mak
@@ -4,7 +4,7 @@ bits = 64
ldarch = elf64-x86-64
CFLAGS += -D__x86_64__
-tests = $(TEST_DIR)/access.flat $(TEST_DIR)/sieve.flat \
- $(TEST_DIR)/emulator.flat $(TEST_DIR)/apic.flat
+tests = $(TEST_DIR)/access.flat $(TEST_DIR)/apic.flat \
+ $(TEST_DIR)/emulator.flat
include config-x86-common.mak
diff --git a/kvm/test/x86/sieve.c b/kvm/test/x86/sieve.c
index a707b92..ef4a5a0 100644
--- a/kvm/test/x86/sieve.c
+++ b/kvm/test/x86/sieve.c
@@ -1,40 +1,5 @@
#include "vm.h"
-
-void print(const char *text);
-
-void printi(int n)
-{
- char buf[10], *p = buf;
- int s = 0, i;
-
- if (n < 0) {
- n = -n;
- s = 1;
- }
-
- while (n) {
- *p++ = '0' + n % 10;
- n /= 10;
- }
-
- if (s)
- *p++ = '-';
-
- if (p == buf)
- *p++ = '0';
-
- for (i = 0; i < (p - buf) / 2; ++i) {
- char tmp;
-
- tmp = buf[i];
- buf[i] = p[-1-i];
- p[-1-i] = tmp;
- }
-
- *p = 0;
-
- print(buf);
-}
+#include "libcflat.h"
int sieve(char* data, int size)
{
@@ -58,11 +23,9 @@ void test_sieve(const char *msg, char *data, int size)
{
int r;
- print(msg);
- print(": ");
+ printf("%s:", msg);
r = sieve(data, size);
- printi(r);
- print("\n");
+ printf("%d out of %d\n", r, size);
}
#define STATIC_SIZE 1000000
@@ -74,12 +37,11 @@ int main()
void *v;
int i;
- print("starting sieve\n");
+ printf("starting sieve\n");
test_sieve("static", static_data, STATIC_SIZE);
setup_vm();
- print("mapped: ");
test_sieve("mapped", static_data, STATIC_SIZE);
- for (i = 0; i < 30; ++i) {
+ for (i = 0; i < 3; ++i) {
v = vmalloc(VSIZE);
test_sieve("virtual", v, VSIZE);
vfree(v);
--
1.7.1
^ permalink raw reply related [flat|nested] 3+ messages in thread
* Re: [PATCH 2/2] qemu-kvm tests: make sieve test runable on 32-bit host
2010-06-07 15:11 ` [PATCH 2/2] qemu-kvm tests: make sieve test runable on " Asias He
@ 2010-06-08 13:44 ` Avi Kivity
0 siblings, 0 replies; 3+ messages in thread
From: Avi Kivity @ 2010-06-08 13:44 UTC (permalink / raw)
To: Asias He; +Cc: kvm, Naphtali Sprei, Marcelo Tosatti
On 06/07/2010 06:11 PM, Asias He wrote:
> Signed-off-by: Asias He<asias.hejun@gmail.com>
> ---
> kvm/test/config-x86-common.mak | 4 +-
> kvm/test/config-x86_64.mak | 4 +-
> kvm/test/x86/sieve.c | 48 ++++-----------------------------------
>
Applied both, thanks.
--
error compiling committee.c: too many arguments to function
^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2010-06-08 13:44 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2010-06-07 15:11 [PATCH 1/2] qemu-kvm tests: make x86/vm.c support 32-bit host Asias He
2010-06-07 15:11 ` [PATCH 2/2] qemu-kvm tests: make sieve test runable on " Asias He
2010-06-08 13:44 ` Avi Kivity
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox