Mailing List Archive

Merged.
Use the auxbin module to find the appropriate install directory for our Python

# HG changeset patch
# User emellor@leeni.uk.xensource.com
# Node ID d61fc1f33954b70e61fc4b086aed50f499fcf8b9
# Parent 3534801f08da20eb302285d888162542bebe12b1
Use the auxbin module to find the appropriate install directory for our Python
scripts.

This fixes a bug with xm-test not working on 64-bit systems.

Signed-off-by: Ewan Mellor <ewan@xensource.com>
---
tools/misc/xend | 24 ++++++++++++++++++++----
tools/python/xen/util/auxbin.py | 19 ++++++++++++-------
tools/xm-test/configure.ac | 2 +-
tools/xm-test/lib/XmTestLib/__init__.py | 20 +++++++++++++++++---
4 files changed, 50 insertions(+), 15 deletions(-)

diff -r 3534801f08da -r d61fc1f33954 tools/misc/xend
--- a/tools/misc/xend Fri May 05 16:46:48 2006 +0100
+++ b/tools/misc/xend Fri May 05 18:36:12 2006 +0100
@@ -2,7 +2,7 @@
# -*- mode: python; -*-
#============================================================================
# Copyright (C) 2004 Mike Wray <mike.wray@hp.com>
-# Copyright (C) 2005 XenSource Ltd
+# Copyright (C) 2005-2006 XenSource Inc
#============================================================================

"""Xen management daemon.
@@ -21,15 +21,31 @@
and recover its state when restarted.
"""
import os
+import os.path
import sys
import socket
import signal
import time
import commands

-# add fallback path for non-native python path installs if needed
-sys.path.append('/usr/lib/python')
-sys.path.append('/usr/lib64/python')
+
+# Use the auxbin module in Xend to determine the correct Python path. We
+# take the first installed instance of auxbin that we find, and then run it
+# to determine the correct path, appending that to sys.path.
+
+AUXBIN = 'xen/util/auxbin.py'
+
+for p in ['python%s' % sys.version[:3], 'python']:
+ for l in ['/usr/lib64', '/usr/lib']:
+ d = os.path.join(l, p)
+ if os.path.exists(os.path.join(d, AUXBIN)):
+ sys.path.append(d)
+ import xen.util.auxbin
+ libpath = xen.util.auxbin.libpath()
+ sys.path = sys.path[:-1]
+ sys.path.append(libpath)
+ break
+
from xen.xend.server import SrvDaemon

class CheckError(ValueError):
diff -r 3534801f08da -r d61fc1f33954 tools/python/xen/util/auxbin.py
--- a/tools/python/xen/util/auxbin.py Fri May 05 16:46:48 2006 +0100
+++ b/tools/python/xen/util/auxbin.py Fri May 05 18:36:12 2006 +0100
@@ -12,14 +12,15 @@
# License along with this library; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
#============================================================================
-# Copyright (C) 2005 XenSource Ltd
+# Copyright (C) 2005-2006 XenSource Inc.
#============================================================================


-LIB_BIN_32 = "/usr/lib/xen/bin"
-LIB_BIN_64 = "/usr/lib64/xen/bin"
+LIB_32 = "/usr/lib"
+LIB_64 = "/usr/lib64"
+LIB_BIN_SUFFIX = "xen/bin"

-## The architectures on which the LIB_BIN_64 directory is used. This
+## The architectures on which the LIB_64 directory is used. This
# deliberately excludes ia64.
LIB_64_ARCHS = [ 'x86_64', 'ppc64', 's390x', 'sparc64']

@@ -41,8 +42,12 @@ def pathTo(exe):


def path():
+ return os.path.join(libpath(), LIB_BIN_SUFFIX)
+
+
+def libpath():
machine = os.uname()[4]
- if machine in LIB_64_ARCHS and os.path.exists(LIB_BIN_64):
- return LIB_BIN_64
+ if machine in LIB_64_ARCHS and os.path.exists(LIB_64):
+ return LIB_64
else:
- return LIB_BIN_32
+ return LIB_32
diff -r 3534801f08da -r d61fc1f33954 tools/xm-test/configure.ac
--- a/tools/xm-test/configure.ac Fri May 05 16:46:48 2006 +0100
+++ b/tools/xm-test/configure.ac Fri May 05 18:36:12 2006 +0100
@@ -13,7 +13,7 @@ AC_CHECK_PROG([LILO], lilo, lilo, "no",
# are two levels above the tests
TESTLIB=../../lib
RD_PATH=../../ramdisk
-TENV="PYTHONPATH=$PYTHONPATH:$TESTLIB:/usr/lib/python RD_PATH=$RD_PATH"
+TENV="PYTHONPATH=$PYTHONPATH:$TESTLIB RD_PATH=$RD_PATH"

AC_ARG_ENABLE(hvm-support,
[[ --enable-hvm-support enable hardware virtual machine assist]],
diff -r 3534801f08da -r d61fc1f33954 tools/xm-test/lib/XmTestLib/__init__.py
--- a/tools/xm-test/lib/XmTestLib/__init__.py Fri May 05 16:46:48 2006 +0100
+++ b/tools/xm-test/lib/XmTestLib/__init__.py Fri May 05 18:36:12 2006 +0100
@@ -11,11 +11,25 @@ from XenDevice import *
from XenDevice import *
from NetConfig import *

-# Make sure xen modules are in path
-sys.path.append('/usr/lib/python')
+# Use the auxbin module in Xend to determine the correct Python path. We
+# take the first installed instance of auxbin that we find, and then run it
+# to determine the correct path, appending that to sys.path.
+
+AUXBIN = 'xen/util/auxbin.py'
+
+for p in ['python%s' % sys.version[:3], 'python']:
+ for l in ['/usr/lib64', '/usr/lib']:
+ d = os.path.join(l, p)
+ if os.path.exists(os.path.join(d, AUXBIN)):
+ sys.path.append(d)
+ import xen.util.auxbin
+ libpath = xen.util.auxbin.libpath()
+ sys.path = sys.path[:-1]
+ sys.path.append(libpath)
+ break

# Give this test a clean slate
-destroyAllDomUs();
+destroyAllDomUs()

if os.environ.get("TEST_VERBOSE"):
verbose = True

_______________________________________________
Xen-changelog mailing list
Xen-changelog@lists.xensource.com
http://lists.xensource.com/xen-changelog
Merged. [ In reply to ]
Add more in_irq() checking. Add irq_enter()/irq_exit() where

# HG changeset patch
# User kaf24@firebug.cl.cam.ac.uk
# Node ID 7fd7f276bb38f08984fda45ef20ea8a085b482cd
# Parent 98f00a4ee0b45cb1bbf62bc8aabe99a2df23d815
Add more in_irq() checking. Add irq_enter()/irq_exit() where
they are missing in a few places.
Signed-off-by: Keir Fraser <keir@xensource.com>
---
xen/arch/x86/domain.c | 3 +++
xen/arch/x86/smp.c | 8 +++++++-
xen/arch/x86/traps.c | 2 ++
3 files changed, 12 insertions(+), 1 deletion(-)

diff -r 98f00a4ee0b4 -r 7fd7f276bb38 xen/arch/x86/domain.c
--- a/xen/arch/x86/domain.c Fri May 05 14:09:07 2006 +0100
+++ b/xen/arch/x86/domain.c Fri May 05 15:15:56 2006 +0100
@@ -753,7 +753,10 @@ int __sync_lazy_execstate(void)
switch_required = (this_cpu(curr_vcpu) != current);

if ( switch_required )
+ {
+ ASSERT(current == idle_vcpu[smp_processor_id()]);
__context_switch();
+ }

local_irq_restore(flags);

diff -r 98f00a4ee0b4 -r 7fd7f276bb38 xen/arch/x86/smp.c
--- a/xen/arch/x86/smp.c Fri May 05 14:09:07 2006 +0100
+++ b/xen/arch/x86/smp.c Fri May 05 15:15:56 2006 +0100
@@ -169,6 +169,7 @@ fastcall void smp_invalidate_interrupt(v
{
ack_APIC_irq();
perfc_incrc(ipis);
+ irq_enter();
if ( !__sync_lazy_execstate() )
{
if ( flush_va == FLUSHVA_ALL )
@@ -177,6 +178,7 @@ fastcall void smp_invalidate_interrupt(v
local_flush_tlb_one(flush_va);
}
cpu_clear(smp_processor_id(), flush_cpumask);
+ irq_exit();
}

void __flush_tlb_mask(cpumask_t mask, unsigned long va)
@@ -335,6 +337,8 @@ fastcall void smp_call_function_interrup
if ( !cpu_isset(smp_processor_id(), call_data->selected) )
return;

+ irq_enter();
+
if ( call_data->wait )
{
(*func)(info);
@@ -347,4 +351,6 @@ fastcall void smp_call_function_interrup
atomic_inc(&call_data->started);
(*func)(info);
}
-}
+
+ irq_exit();
+}
diff -r 98f00a4ee0b4 -r 7fd7f276bb38 xen/arch/x86/traps.c
--- a/xen/arch/x86/traps.c Fri May 05 14:09:07 2006 +0100
+++ b/xen/arch/x86/traps.c Fri May 05 15:15:56 2006 +0100
@@ -674,6 +674,8 @@ asmlinkage int do_page_fault(struct cpu_
unsigned long addr, fixup;
int rc;

+ ASSERT(!in_irq());
+
__asm__ __volatile__ ("mov %%cr2,%0" : "=r" (addr) : );

DEBUGGER_trap_entry(TRAP_page_fault, regs);

_______________________________________________
Xen-changelog mailing list
Xen-changelog@lists.xensource.com
http://lists.xensource.com/xen-changelog
Merged. [ In reply to ]
Xm-tests 01_memset_basic_pos.test and 03_memset_random_pos.test start

# HG changeset patch
# User emellor@leeni.uk.xensource.com
# Node ID 55f73916d319801065ffcdf6041b54e2770b9c03
# Parent decf309fb47b3f4246540a5e1327663651d266fe
Xm-tests 01_memset_basic_pos.test and 03_memset_random_pos.test start
domUs with 64MB of memory,
and assume that all of that memory is available in the domU. They then
perform various xm memset tests
based on the assumed starting conditions.

When netback & blkback are comiled into the domU kernel, they eat about
5MB. This mismatch will cause
01_memset_basic_pos.test to fail every time. 03_memset_random_pos.test
will probably fail, but can
pass with some lucky numbers from the random number generator.

This patch changes both tests to read the starting memory allocation from
the balloon driver in the domU.

Signed-off-by: Jim Dykman <dykman@us.ibm.com>
---
tools/xm-test/tests/memset/01_memset_basic_pos.py | 22 ++++++++++++++++-----
tools/xm-test/tests/memset/03_memset_random_pos.py | 14 +++++++++++--
2 files changed, 29 insertions(+), 7 deletions(-)

diff -r decf309fb47b -r 55f73916d319 tools/xm-test/tests/memset/01_memset_basic_pos.py
--- a/tools/xm-test/tests/memset/01_memset_basic_pos.py Tue May 02 17:23:21 2006 +0100
+++ b/tools/xm-test/tests/memset/01_memset_basic_pos.py Tue May 02 18:17:59 2006 +0100
@@ -44,8 +44,20 @@ except ConsoleError, e:
except ConsoleError, e:
FAIL(str(e))

+try:
+ run = console.runCmd("cat /proc/xen/balloon | grep Current");
+except ConsoleError, e:
+ FAIL(str(e))
+
+match = re.match("[^0-9]+([0-9]+)", run["output"])
+if not match:
+ FAIL("Invalid domU meminfo line")
+
+origmem = int(match.group(1)) / 1024
+newmem = origmem - 1
+
# set mem-set for less than default
-cmd = "xm mem-set %s %i" % (domain.getName(), 63)
+cmd = "xm mem-set %s %i" % (domain.getName(), newmem)
status, output = traceCommand(cmd)
if status != 0:
if verbose:
@@ -55,7 +67,7 @@ if status != 0:

for i in [1,2,3,4,5,6,7,8,9,10]:
mem = getDomMem(domain.getName())
- if mem == 63:
+ if mem == newmem:
break
time.sleep(1)

@@ -63,8 +75,8 @@ mem = getDomMem(domain.getName())
mem = getDomMem(domain.getName())
if not mem:
FAIL("Failed to get memory amount for domain %s" % domain.getName())
-elif mem != 63:
- FAIL("Dom0 failed to verify 63 MB; got %i MB" % mem)
+elif mem != newmem:
+ FAIL("Dom0 failed to verify %i MB; got %i MB" % newmem,mem)

# verify memory set internally
try:
@@ -79,7 +91,7 @@ if not m:

domUmem = int(m.group(1)) / 1024

-if domUmem != 63:
+if domUmem != newmem:
FAIL("DomU reported incorrect memory amount: %i MB" % (domUmem))

# quiesce everything
diff -r decf309fb47b -r 55f73916d319 tools/xm-test/tests/memset/03_memset_random_pos.py
--- a/tools/xm-test/tests/memset/03_memset_random_pos.py Tue May 02 17:23:21 2006 +0100
+++ b/tools/xm-test/tests/memset/03_memset_random_pos.py Tue May 02 18:17:59 2006 +0100
@@ -22,14 +22,24 @@ except DomainError, e:
FAIL(str(e))

times = random.randint(10,50)
-origmem = domain.config.getOpt("memory")
-currmem = domain.config.getOpt("memory")

try:
console = XmConsole(domain.getName())
console.sendInput("input")
except ConsoleError, e:
FAIL(str(e))
+
+try:
+ run = console.runCmd("cat /proc/xen/balloon | grep Current");
+except ConsoleError, e:
+ FAIL(str(e))
+
+match = re.match("[^0-9]+([0-9]+)", run["output"])
+if not match:
+ FAIL("Invalid domU meminfo line")
+
+origmem = int(match.group(1)) / 1024
+currmem = origmem

for i in range(0,times):
amt = random.randint(-10,10)

_______________________________________________
Xen-changelog mailing list
Xen-changelog@lists.xensource.com
http://lists.xensource.com/xen-changelog
Merged. [ In reply to ]
# HG changeset patch
# User emellor@leeni.uk.xensource.com
# Node ID 33b2ae0246632237d6b8f1893b307f2f51b0315b
# Parent ea609f28ec01b7cc9b540481cf99173b83135863
# Parent d714f923b7cfff705dcf9aae30a06709340059aa
Merged.
---
linux-2.6-xen-sparse/drivers/xen/netfront/netfront.c | 2 -
tools/python/xen/xend/XendDomainInfo.py | 2 -
tools/python/xen/xend/image.py | 24 ++++++++++------
tools/xm-test/tests/network/03_network_local_tcp_pos.py | 4 +-
tools/xm-test/tests/network/04_network_local_udp_pos.py | 4 +-
tools/xm-test/tests/network/06_network_dom0_tcp_pos.py | 2 -
tools/xm-test/tests/network/07_network_dom0_udp_pos.py | 2 -
tools/xm-test/tests/network/12_network_domU_tcp_pos.py | 2 -
tools/xm-test/tests/network/13_network_domU_udp_pos.py | 2 -
xen/arch/x86/hvm/hvm.c | 6 +++-
xen/arch/x86/hvm/svm/svm.c | 4 ++
xen/arch/x86/hvm/svm/vmcb.c | 17 ++++++-----
12 files changed, 43 insertions(+), 28 deletions(-)

diff -r ea609f28ec01 -r 33b2ae024663 linux-2.6-xen-sparse/drivers/xen/netfront/netfront.c
--- a/linux-2.6-xen-sparse/drivers/xen/netfront/netfront.c Fri May 19 16:21:43 2006 +0100
+++ b/linux-2.6-xen-sparse/drivers/xen/netfront/netfront.c Fri May 19 16:21:49 2006 +0100
@@ -1045,8 +1045,6 @@ static void network_connect(struct net_d
notify_remote_via_irq(np->irq);
network_tx_buf_gc(dev);

- network_maybe_wake_tx(dev);
-
spin_unlock(&np->rx_lock);
spin_unlock_irq(&np->tx_lock);
}
diff -r ea609f28ec01 -r 33b2ae024663 tools/python/xen/xend/XendDomainInfo.py
--- a/tools/python/xen/xend/XendDomainInfo.py Fri May 19 16:21:43 2006 +0100
+++ b/tools/python/xen/xend/XendDomainInfo.py Fri May 19 16:21:49 2006 +0100
@@ -1264,7 +1264,7 @@ class XendDomainInfo:
m = self.image.getDomainMemory(self.info['memory'] * 1024)
balloon.free(m)
xc.domain_setmaxmem(self.domid, m)
- xc.domain_memory_increase_reservation(self.domid, m, 0, 0)
+ xc.domain_memory_increase_reservation(self.domid, self.info['memory'] * 1024, 0, 0)

self.createChannels()

diff -r ea609f28ec01 -r 33b2ae024663 tools/python/xen/xend/image.py
--- a/tools/python/xen/xend/image.py Fri May 19 16:21:43 2006 +0100
+++ b/tools/python/xen/xend/image.py Fri May 19 16:21:49 2006 +0100
@@ -19,6 +19,7 @@

import os, string
import re
+import math

import xen.lowlevel.xc
from xen.xend import sxp
@@ -141,11 +142,13 @@ class ImageHandler:
% (self.ostype, self.vm.getDomid(), str(result)))


- def getDomainMemory(self, mem):
+ def getDomainMemory(self, mem_kb):
"""@return The memory required, in KiB, by the domain to store the
- given amount, also in KiB. This is normally just mem, but HVM domains
- have overheads to account for."""
- return mem
+ given amount, also in KiB. This is normally just mem, but if HVM is
+ supported, keep a little extra free."""
+ if 'hvm' in xc.xeninfo()['xen_caps']:
+ mem_kb += 4*1024;
+ return mem_kb

def buildDomain(self):
"""Build the domain. Define in subclass."""
@@ -377,15 +380,20 @@ class HVMImageHandler(ImageHandler):
os.waitpid(self.pid, 0)
self.pid = 0

- def getDomainMemory(self, mem):
+ def getDomainMemory(self, mem_kb):
"""@see ImageHandler.getDomainMemory"""
- page_kb = 4
- extra_pages = 0
if os.uname()[4] == 'ia64':
page_kb = 16
# ROM size for guest firmware, ioreq page and xenstore page
extra_pages = 1024 + 2
- return mem + extra_pages * page_kb
+ else:
+ page_kb = 4
+ # This was derived emperically:
+ # 2.4 MB overhead per 1024 MB RAM + 8 MB constant
+ # + 4 to avoid low-memory condition
+ extra_mb = (2.4/1024) * (mem_kb/1024.0) + 12;
+ extra_pages = int( math.ceil( extra_mb*1024 / page_kb ))
+ return mem_kb + extra_pages * page_kb

def register_shutdown_watch(self):
""" add xen store watch on control/shutdown """
diff -r ea609f28ec01 -r 33b2ae024663 tools/xm-test/tests/network/03_network_local_tcp_pos.py
--- a/tools/xm-test/tests/network/03_network_local_tcp_pos.py Fri May 19 16:21:43 2006 +0100
+++ b/tools/xm-test/tests/network/03_network_local_tcp_pos.py Fri May 19 16:21:49 2006 +0100
@@ -44,7 +44,7 @@ try:
lofails=""
for size in trysizes:
out = console.runCmd("hping2 127.0.0.1 -E /dev/urandom -q -c 20 "
- + "--fast -d " + str(size))
+ + "--fast -d " + str(size) + " -N " + str(size))
if out["return"]:
lofails += " " + str(size)

@@ -54,7 +54,7 @@ try:
ip = netdev.getNetDevIP()
for size in trysizes:
out = console.runCmd("hping2 " + ip + " -E /dev/urandom -q -c 20 "
- + "--fast -d "+ str(size))
+ + "--fast -d "+ str(size) + " -N " + str(size))
if out["return"]:
eth0fails += " " + str(size)
except ConsoleError, e:
diff -r ea609f28ec01 -r 33b2ae024663 tools/xm-test/tests/network/04_network_local_udp_pos.py
--- a/tools/xm-test/tests/network/04_network_local_udp_pos.py Fri May 19 16:21:43 2006 +0100
+++ b/tools/xm-test/tests/network/04_network_local_udp_pos.py Fri May 19 16:21:49 2006 +0100
@@ -43,7 +43,7 @@ try:
lofails=""
for size in trysizes:
out = console.runCmd("hping2 127.0.0.1 -E /dev/urandom -2 -q -c 20 "
- + "--fast -d " + str(size))
+ + "--fast -d " + str(size) + " -N " + str(size))
if out["return"]:
lofails += " " + str(size)
print out["output"]
@@ -54,7 +54,7 @@ try:
ip = netdev.getNetDevIP()
for size in trysizes:
out = console.runCmd("hping2 " + ip + " -E /dev/urandom -2 -q -c 20 "
- + "--fast -d " + str(size))
+ + "--fast -d " + str(size) + " -N " + str(size))
if out["return"]:
eth0fails += " " + str(size)
print out["output"]
diff -r ea609f28ec01 -r 33b2ae024663 tools/xm-test/tests/network/06_network_dom0_tcp_pos.py
--- a/tools/xm-test/tests/network/06_network_dom0_tcp_pos.py Fri May 19 16:21:43 2006 +0100
+++ b/tools/xm-test/tests/network/06_network_dom0_tcp_pos.py Fri May 19 16:21:49 2006 +0100
@@ -44,7 +44,7 @@ try:
dom0ip = netdev.getDom0AliasIP()
for size in trysizes:
out = console.runCmd("hping2 " + dom0ip + " -E /dev/urandom -q -c 20 "
- + "--fast -d " + str(size))
+ + "--fast -d " + str(size) + " -N " + str(size))
if out["return"]:
fails += " " + str(size)
print out["output"]
diff -r ea609f28ec01 -r 33b2ae024663 tools/xm-test/tests/network/07_network_dom0_udp_pos.py
--- a/tools/xm-test/tests/network/07_network_dom0_udp_pos.py Fri May 19 16:21:43 2006 +0100
+++ b/tools/xm-test/tests/network/07_network_dom0_udp_pos.py Fri May 19 16:21:49 2006 +0100
@@ -43,7 +43,7 @@ try:
dom0ip = netdev.getDom0AliasIP()
for size in trysizes:
out = console.runCmd("hping2 " + dom0ip + " -E /dev/urandom -2 -q -c 20"
- + " --fast -d " + str(size))
+ + " --fast -d " + str(size) + " -N " + str(size))
if out["return"]:
fails += " " + str(size)
print out["output"]
diff -r ea609f28ec01 -r 33b2ae024663 tools/xm-test/tests/network/12_network_domU_tcp_pos.py
--- a/tools/xm-test/tests/network/12_network_domU_tcp_pos.py Fri May 19 16:21:43 2006 +0100
+++ b/tools/xm-test/tests/network/12_network_domU_tcp_pos.py Fri May 19 16:21:49 2006 +0100
@@ -50,7 +50,7 @@ try:
ip2 = dst_netdev.getNetDevIP()
for size in pingsizes:
out = src_console.runCmd("hping2 " + ip2 + " -E /dev/urandom -q -c 20 "
- + "--fast -d " + str(size))
+ + "--fast -d " + str(size) + " -N " + str(size))
if out["return"]:
fails += " " + str(size)
print out["output"]
diff -r ea609f28ec01 -r 33b2ae024663 tools/xm-test/tests/network/13_network_domU_udp_pos.py
--- a/tools/xm-test/tests/network/13_network_domU_udp_pos.py Fri May 19 16:21:43 2006 +0100
+++ b/tools/xm-test/tests/network/13_network_domU_udp_pos.py Fri May 19 16:21:49 2006 +0100
@@ -50,7 +50,7 @@ try:
ip2 = dst_netdev.getNetDevIP()
for size in pingsizes:
out = src_console.runCmd("hping2 " + ip2 + " -E /dev/urandom -2 -q "
- + "-c 20 --fast -d " + str(size))
+ + "-c 20 --fast -d " + str(size) + " -N " + str(size))
if out["return"]:
fails += " " + str(size)
print out["output"]
diff -r ea609f28ec01 -r 33b2ae024663 xen/arch/x86/hvm/hvm.c
--- a/xen/arch/x86/hvm/hvm.c Fri May 19 16:21:43 2006 +0100
+++ b/xen/arch/x86/hvm/hvm.c Fri May 19 16:21:49 2006 +0100
@@ -189,7 +189,11 @@ void hvm_setup_platform(struct domain* d
if ( !hvm_guest(current) || (current->vcpu_id != 0) )
return;

- shadow_direct_map_init(d);
+ if ( shadow_direct_map_init(d) == 0 )
+ {
+ printk("Can not allocate shadow direct map for HVM domain.\n");
+ domain_crash_synchronous();
+ }

hvm_map_io_shared_page(d);
hvm_get_info(d);
diff -r ea609f28ec01 -r 33b2ae024663 xen/arch/x86/hvm/svm/svm.c
--- a/xen/arch/x86/hvm/svm/svm.c Fri May 19 16:21:43 2006 +0100
+++ b/xen/arch/x86/hvm/svm/svm.c Fri May 19 16:21:49 2006 +0100
@@ -458,6 +458,9 @@ int start_svm(void)

if (!(test_bit(X86_FEATURE_SVME, &boot_cpu_data.x86_capability)))
return 0;
+ svm_globals[cpu].hsa = alloc_host_save_area();
+ if (! svm_globals[cpu].hsa)
+ return 0;

rdmsr(MSR_EFER, eax, edx);
eax |= EFER_SVME;
@@ -466,7 +469,6 @@ int start_svm(void)
printk("AMD SVM Extension is enabled for cpu %d.\n", cpu );

/* Initialize the HSA for this core */
- svm_globals[cpu].hsa = alloc_host_save_area();
phys_hsa = (u64) virt_to_maddr( svm_globals[cpu].hsa );
phys_hsa_lo = (u32) phys_hsa;
phys_hsa_hi = (u32) (phys_hsa >> 32);
diff -r ea609f28ec01 -r 33b2ae024663 xen/arch/x86/hvm/svm/vmcb.c
--- a/xen/arch/x86/hvm/svm/vmcb.c Fri May 19 16:21:43 2006 +0100
+++ b/xen/arch/x86/hvm/svm/vmcb.c Fri May 19 16:21:49 2006 +0100
@@ -139,17 +139,20 @@ static int construct_vmcb_controls(struc

/* The following is for I/O and MSR permision map */
iopm = alloc_xenheap_pages(get_order_from_bytes(IOPM_SIZE));
-
- ASSERT(iopm);
- memset(iopm, 0xff, IOPM_SIZE);
- clear_bit(PC_DEBUG_PORT, iopm);
+ if (iopm)
+ {
+ memset(iopm, 0xff, IOPM_SIZE);
+ clear_bit(PC_DEBUG_PORT, iopm);
+ }
msrpm = alloc_xenheap_pages(get_order_from_bytes(MSRPM_SIZE));
-
- ASSERT(msrpm);
- memset(msrpm, 0xff, MSRPM_SIZE);
+ if (msrpm)
+ memset(msrpm, 0xff, MSRPM_SIZE);

arch_svm->iopm = iopm;
arch_svm->msrpm = msrpm;
+
+ if (! iopm || ! msrpm)
+ return 1;

vmcb->iopm_base_pa = (u64) virt_to_maddr(iopm);
vmcb->msrpm_base_pa = (u64) virt_to_maddr(msrpm);

_______________________________________________
Xen-changelog mailing list
Xen-changelog@lists.xensource.com
http://lists.xensource.com/xen-changelog
Merged. [ In reply to ]
# HG changeset patch
# User emellor@leeni.uk.xensource.com
# Node ID d0d9f50517f75a57292b353edbb9ee9fe47dc1b0
# Parent ae0175bf063134388b0e1323841cc688339c0095
# Parent 852a1fd80f42996e4d66a663b7dcf0ea31c5aef1
Merged.
---
extras/mini-os/Makefile | 6 +++
extras/mini-os/include/mm.h | 79 ++++++++++++++++++++++++++++++++---------
extras/mini-os/include/types.h | 7 +++
extras/mini-os/kernel.c | 11 +++++
extras/mini-os/mm.c | 71 ++++++++++++++++++------------------
extras/mini-os/traps.c | 21 +++++-----
extras/mini-os/x86_32.S | 8 +++-
7 files changed, 139 insertions(+), 64 deletions(-)

diff -r ae0175bf0631 -r d0d9f50517f7 extras/mini-os/Makefile
--- a/extras/mini-os/Makefile Fri May 19 17:31:28 2006 +0100
+++ b/extras/mini-os/Makefile Fri May 19 17:31:34 2006 +0100
@@ -1,4 +1,5 @@ debug ?= y
debug ?= y
+pae ?= n

include $(CURDIR)/../../Config.mk

@@ -17,6 +18,11 @@ ifeq ($(TARGET_ARCH),x86_32)
ifeq ($(TARGET_ARCH),x86_32)
CFLAGS += -m32 -march=i686
LDFLAGS += -m elf_i386
+endif
+
+ifeq ($(TARGET_ARCH)$(pae),x86_32y)
+CFLAGS += -DCONFIG_X86_PAE=1
+ASFLAGS += -DCONFIG_X86_PAE=1
endif

ifeq ($(TARGET_ARCH),x86_64)
diff -r ae0175bf0631 -r d0d9f50517f7 extras/mini-os/include/mm.h
--- a/extras/mini-os/include/mm.h Fri May 19 17:31:28 2006 +0100
+++ b/extras/mini-os/include/mm.h Fri May 19 17:31:34 2006 +0100
@@ -43,6 +43,8 @@

#if defined(__i386__)

+#if !defined(CONFIG_X86_PAE)
+
#define L2_PAGETABLE_SHIFT 22

#define L1_PAGETABLE_ENTRIES 1024
@@ -50,6 +52,30 @@

#define PADDR_BITS 32
#define PADDR_MASK (~0UL)
+
+#define UNMAPPED_PT_FRAMES 1
+#define PRIpte "08lx"
+typedef unsigned long pgentry_t;
+
+#else /* defined(CONFIG_X86_PAE) */
+
+#define L2_PAGETABLE_SHIFT 21
+#define L3_PAGETABLE_SHIFT 30
+
+#define L1_PAGETABLE_ENTRIES 512
+#define L2_PAGETABLE_ENTRIES 512
+#define L3_PAGETABLE_ENTRIES 4
+
+#define PADDR_BITS 44
+#define PADDR_MASK ((1ULL << PADDR_BITS)-1)
+
+#define L2_MASK ((1UL << L3_PAGETABLE_SHIFT) - 1)
+
+#define UNMAPPED_PT_FRAMES 2
+#define PRIpte "016llx"
+typedef uint64_t pgentry_t;
+
+#endif /* !defined(CONFIG_X86_PAE) */

#elif defined(__x86_64__)

@@ -81,6 +107,10 @@
#define L2_MASK ((1UL << L3_PAGETABLE_SHIFT) - 1)
#define L3_MASK ((1UL << L4_PAGETABLE_SHIFT) - 1)

+#define UNMAPPED_PT_FRAMES 3
+#define PRIpte "016lx"
+typedef unsigned long pgentry_t;
+
#endif

#define L1_MASK ((1UL << L2_PAGETABLE_SHIFT) - 1)
@@ -90,9 +120,11 @@
(((_a) >> L1_PAGETABLE_SHIFT) & (L1_PAGETABLE_ENTRIES - 1))
#define l2_table_offset(_a) \
(((_a) >> L2_PAGETABLE_SHIFT) & (L2_PAGETABLE_ENTRIES - 1))
-#if defined(__x86_64__)
+#if defined(__x86_64__) || defined(CONFIG_X86_PAE)
#define l3_table_offset(_a) \
(((_a) >> L3_PAGETABLE_SHIFT) & (L3_PAGETABLE_ENTRIES - 1))
+#endif
+#if defined(__x86_64__)
#define l4_table_offset(_a) \
(((_a) >> L4_PAGETABLE_SHIFT) & (L4_PAGETABLE_ENTRIES - 1))
#endif
@@ -111,14 +143,21 @@
#if defined(__i386__)
#define L1_PROT (_PAGE_PRESENT|_PAGE_RW|_PAGE_ACCESSED)
#define L2_PROT (_PAGE_PRESENT|_PAGE_RW|_PAGE_ACCESSED|_PAGE_DIRTY |_PAGE_USER)
+#if defined(CONFIG_X86_PAE)
+#define L3_PROT (_PAGE_PRESENT)
+#endif /* CONFIG_X86_PAE */
#elif defined(__x86_64__)
#define L1_PROT (_PAGE_PRESENT|_PAGE_RW|_PAGE_ACCESSED|_PAGE_USER)
#define L2_PROT (_PAGE_PRESENT|_PAGE_RW|_PAGE_ACCESSED|_PAGE_DIRTY|_PAGE_USER)
#define L3_PROT (_PAGE_PRESENT|_PAGE_RW|_PAGE_ACCESSED|_PAGE_DIRTY|_PAGE_USER)
#define L4_PROT (_PAGE_PRESENT|_PAGE_RW|_PAGE_ACCESSED|_PAGE_DIRTY|_PAGE_USER)
-#endif
-
+#endif /* __i386__ || __x86_64__ */
+
+#ifndef CONFIG_X86_PAE
#define PAGE_SIZE (1UL << L1_PAGETABLE_SHIFT)
+#else
+#define PAGE_SIZE (1ULL << L1_PAGETABLE_SHIFT)
+#endif
#define PAGE_SHIFT L1_PAGETABLE_SHIFT
#define PAGE_MASK (~(PAGE_SIZE-1))

@@ -129,23 +168,31 @@
/* to align the pointer to the (next) page boundary */
#define PAGE_ALIGN(addr) (((addr)+PAGE_SIZE-1)&PAGE_MASK)

+/* Definitions for machine and pseudophysical addresses. */
+#ifdef CONFIG_X86_PAE
+typedef unsigned long long paddr_t;
+typedef unsigned long long maddr_t;
+#else
+typedef unsigned long paddr_t;
+typedef unsigned long maddr_t;
+#endif
+
extern unsigned long *phys_to_machine_mapping;
extern char _text, _etext, _edata, _end;
#define pfn_to_mfn(_pfn) (phys_to_machine_mapping[(_pfn)])
-static __inline__ unsigned long phys_to_machine(unsigned long phys)
-{
- unsigned long machine = pfn_to_mfn(phys >> L1_PAGETABLE_SHIFT);
- machine = (machine << L1_PAGETABLE_SHIFT) | (phys & ~PAGE_MASK);
- return machine;
-}
-
+static __inline__ maddr_t phys_to_machine(paddr_t phys)
+{
+ maddr_t machine = pfn_to_mfn(phys >> PAGE_SHIFT);
+ machine = (machine << PAGE_SHIFT) | (phys & ~PAGE_MASK);
+ return machine;
+}

#define mfn_to_pfn(_mfn) (machine_to_phys_mapping[(_mfn)])
-static __inline__ unsigned long machine_to_phys(unsigned long machine)
-{
- unsigned long phys = mfn_to_pfn(machine >> L1_PAGETABLE_SHIFT);
- phys = (phys << L1_PAGETABLE_SHIFT) | (machine & ~PAGE_MASK);
- return phys;
+static __inline__ paddr_t machine_to_phys(maddr_t machine)
+{
+ paddr_t phys = mfn_to_pfn(machine >> PAGE_SHIFT);
+ phys = (phys << PAGE_SHIFT) | (machine & ~PAGE_MASK);
+ return phys;
}

#define VIRT_START ((unsigned long)&_text)
@@ -155,7 +202,7 @@ static __inline__ unsigned long machine_

#define virt_to_pfn(_virt) (PFN_DOWN(to_phys(_virt)))
#define mach_to_virt(_mach) (to_virt(machine_to_phys(_mach)))
-#define mfn_to_virt(_mfn) (mach_to_virt(_mfn << PAGE_SHIFT))
+#define mfn_to_virt(_mfn) (to_virt(mfn_to_pfn(_mfn) << PAGE_SHIFT))
#define pfn_to_virt(_pfn) (to_virt(_pfn << PAGE_SHIFT))

/* Pagetable walking. */
diff -r ae0175bf0631 -r d0d9f50517f7 extras/mini-os/include/types.h
--- a/extras/mini-os/include/types.h Fri May 19 17:31:28 2006 +0100
+++ b/extras/mini-os/include/types.h Fri May 19 17:31:34 2006 +0100
@@ -43,14 +43,19 @@ typedef unsigned long long u_quad_t;
typedef unsigned long long u_quad_t;
typedef unsigned int uintptr_t;

+#if !defined(CONFIG_X86_PAE)
typedef struct { unsigned long pte_low; } pte_t;
+#else
+typedef struct { unsigned long pte_low, pte_high; } pte_t;
+#endif /* CONFIG_X86_PAE */
+
#elif defined(__x86_64__)
typedef long quad_t;
typedef unsigned long u_quad_t;
typedef unsigned long uintptr_t;

typedef struct { unsigned long pte; } pte_t;
-#endif
+#endif /* __i386__ || __x86_64__ */

typedef u8 uint8_t;
typedef s8 int8_t;
diff -r ae0175bf0631 -r d0d9f50517f7 extras/mini-os/kernel.c
--- a/extras/mini-os/kernel.c Fri May 19 17:31:28 2006 +0100
+++ b/extras/mini-os/kernel.c Fri May 19 17:31:34 2006 +0100
@@ -63,7 +63,12 @@ void failsafe_callback(void);

extern char shared_info[PAGE_SIZE];

+#if !defined(CONFIG_X86_PAE)
#define __pte(x) ((pte_t) { (x) } )
+#else
+#define __pte(x) ({ unsigned long long _x = (x); \
+ ((pte_t) {(unsigned long)(_x), (unsigned long)(_x>>32)}); })
+#endif

static shared_info_t *map_shared_info(unsigned long pa)
{
@@ -71,7 +76,7 @@ static shared_info_t *map_shared_info(un
(unsigned long)shared_info, __pte(pa | 7), UVMF_INVLPG) )
{
printk("Failed to map shared_info!!\n");
- *(int*)0=0;
+ do_exit();
}
return (shared_info_t *)shared_info;
}
@@ -126,6 +131,10 @@ void start_kernel(start_info_t *si)
/* WARN: don't do printk before here, it uses information from
shared_info. Use xprintk instead. */
memcpy(&start_info, si, sizeof(*si));
+
+ /* set up minimal memory infos */
+ phys_to_machine_mapping = (unsigned long *)start_info.mfn_list;
+
/* Grab the shared_info pointer and put it in a safe place. */
HYPERVISOR_shared_info = map_shared_info(start_info.shared_info);

diff -r ae0175bf0631 -r d0d9f50517f7 extras/mini-os/mm.c
--- a/extras/mini-os/mm.c Fri May 19 17:31:28 2006 +0100
+++ b/extras/mini-os/mm.c Fri May 19 17:31:34 2006 +0100
@@ -368,7 +368,7 @@ void new_pt_frame(unsigned long *pt_pfn,
void new_pt_frame(unsigned long *pt_pfn, unsigned long prev_l_mfn,
unsigned long offset, unsigned long level)
{
- unsigned long *tab = (unsigned long *)start_info.pt_base;
+ pgentry_t *tab = (pgentry_t *)start_info.pt_base;
unsigned long pt_page = (unsigned long)pfn_to_virt(*pt_pfn);
unsigned long prot_e, prot_t, pincmd;
mmu_update_t mmu_updates[1];
@@ -382,40 +382,45 @@ void new_pt_frame(unsigned long *pt_pfn,
as a page table page */
memset((unsigned long*)pfn_to_virt(*pt_pfn), 0, PAGE_SIZE);

- if (level == L1_FRAME)
- {
+ switch ( level )
+ {
+ case L1_FRAME:
prot_e = L1_PROT;
prot_t = L2_PROT;
pincmd = MMUEXT_PIN_L1_TABLE;
- }
-#if (defined __x86_64__)
- else if (level == L2_FRAME)
- {
+ break;
+#if defined(__x86_64__) || defined(CONFIG_X86_PAE)
+ case L2_FRAME:
prot_e = L2_PROT;
prot_t = L3_PROT;
pincmd = MMUEXT_PIN_L2_TABLE;
- }
- else if (level == L3_FRAME)
- {
+ break;
+#endif
+#if defined(__x86_64__)
+ case L3_FRAME:
prot_e = L3_PROT;
prot_t = L4_PROT;
pincmd = MMUEXT_PIN_L3_TABLE;
- }
-#endif
- else
- {
+ break;
+#endif
+ default:
printk("new_pt_frame() called with invalid level number %d\n", level);
do_exit();
- }
+ break;
+ }

/* Update the entry */
-#if (defined __x86_64__)
+#if defined(__x86_64__)
tab = pte_to_virt(tab[l4_table_offset(pt_page)]);
tab = pte_to_virt(tab[l3_table_offset(pt_page)]);
#endif
- mmu_updates[0].ptr = (tab[l2_table_offset(pt_page)] & PAGE_MASK) +
- sizeof(void *)* l1_table_offset(pt_page);
- mmu_updates[0].val = pfn_to_mfn(*pt_pfn) << PAGE_SHIFT |
+#if defined(CONFIG_X86_PAE)
+ tab = pte_to_virt(tab[l3_table_offset(pt_page)]);
+#endif
+
+ mmu_updates[0].ptr = ((pgentry_t)tab[l2_table_offset(pt_page)] & PAGE_MASK) +
+ sizeof(pgentry_t) * l1_table_offset(pt_page);
+ mmu_updates[0].val = (pgentry_t)pfn_to_mfn(*pt_pfn) << PAGE_SHIFT |
(prot_e & ~_PAGE_RW);
if(HYPERVISOR_mmu_update(mmu_updates, 1, NULL, DOMID_SELF) < 0)
{
@@ -434,8 +439,8 @@ void new_pt_frame(unsigned long *pt_pfn,

/* Now fill the new page table page with entries.
Update the page directory as well. */
- mmu_updates[0].ptr = (prev_l_mfn << PAGE_SHIFT) + sizeof(void *) * offset;
- mmu_updates[0].val = pfn_to_mfn(*pt_pfn) << PAGE_SHIFT | prot_t;
+ mmu_updates[0].ptr = ((pgentry_t)prev_l_mfn << PAGE_SHIFT) + sizeof(pgentry_t) * offset;
+ mmu_updates[0].val = (pgentry_t)pfn_to_mfn(*pt_pfn) << PAGE_SHIFT | prot_t;
if(HYPERVISOR_mmu_update(mmu_updates, 1, NULL, DOMID_SELF) < 0)
{
printk("ERROR: mmu_update failed\n");
@@ -450,16 +455,13 @@ void build_pagetable(unsigned long *star
unsigned long start_address, end_address;
unsigned long pfn_to_map, pt_pfn = *start_pfn;
static mmu_update_t mmu_updates[L1_PAGETABLE_ENTRIES + 1];
- unsigned long *tab = (unsigned long *)start_info.pt_base;
+ pgentry_t *tab = (pgentry_t *)start_info.pt_base, page;
unsigned long mfn = pfn_to_mfn(virt_to_pfn(start_info.pt_base));
- unsigned long page, offset;
+ unsigned long offset;
int count = 0;

-#if defined(__x86_64__)
- pfn_to_map = (start_info.nr_pt_frames - 3) * L1_PAGETABLE_ENTRIES;
-#else
- pfn_to_map = (start_info.nr_pt_frames - 1) * L1_PAGETABLE_ENTRIES;
-#endif
+ pfn_to_map = (start_info.nr_pt_frames - UNMAPPED_PT_FRAMES) * L1_PAGETABLE_ENTRIES;
+
start_address = (unsigned long)pfn_to_virt(pfn_to_map);
end_address = (unsigned long)pfn_to_virt(*max_pfn);

@@ -468,7 +470,7 @@ void build_pagetable(unsigned long *star

while(start_address < end_address)
{
- tab = (unsigned long *)start_info.pt_base;
+ tab = (pgentry_t *)start_info.pt_base;
mfn = pfn_to_mfn(virt_to_pfn(start_info.pt_base));

#if defined(__x86_64__)
@@ -480,6 +482,8 @@ void build_pagetable(unsigned long *star
page = tab[offset];
mfn = pte_to_mfn(page);
tab = to_virt(mfn_to_pfn(mfn) << PAGE_SHIFT);
+#endif
+#if defined(__x86_64__) || defined(CONFIG_X86_PAE)
offset = l3_table_offset(start_address);
/* Need new L2 pt frame */
if(!(start_address & L2_MASK))
@@ -498,9 +502,9 @@ void build_pagetable(unsigned long *star
mfn = pte_to_mfn(page);
offset = l1_table_offset(start_address);

- mmu_updates[count].ptr = (mfn << PAGE_SHIFT) + sizeof(void *) * offset;
+ mmu_updates[count].ptr = ((pgentry_t)mfn << PAGE_SHIFT) + sizeof(pgentry_t) * offset;
mmu_updates[count].val =
- pfn_to_mfn(pfn_to_map++) << PAGE_SHIFT | L1_PROT;
+ (pgentry_t)pfn_to_mfn(pfn_to_map++) << PAGE_SHIFT | L1_PROT;
count++;
if (count == L1_PAGETABLE_ENTRIES || pfn_to_map == *max_pfn)
{
@@ -557,9 +561,6 @@ void init_mm(void)
printk(" stack start: %p\n", &stack);
printk(" _end: %p\n", &_end);

- /* set up minimal memory infos */
- phys_to_machine_mapping = (unsigned long *)start_info.mfn_list;
-
/* First page follows page table pages and 3 more pages (store page etc) */
start_pfn = PFN_UP(to_phys(start_info.pt_base)) +
start_info.nr_pt_frames + 3;
@@ -569,7 +570,7 @@ void init_mm(void)
printk(" max_pfn: %lx\n", max_pfn);

build_pagetable(&start_pfn, &max_pfn);
-
+
/*
* now we can initialise the page allocator
*/
diff -r ae0175bf0631 -r d0d9f50517f7 extras/mini-os/traps.c
--- a/extras/mini-os/traps.c Fri May 19 17:31:28 2006 +0100
+++ b/extras/mini-os/traps.c Fri May 19 17:31:34 2006 +0100
@@ -95,25 +95,26 @@ DO_ERROR(18, "machine check", machine_ch

void page_walk(unsigned long virt_address)
{
- unsigned long *tab = (unsigned long *)start_info.pt_base;
- unsigned long addr = virt_address, page;
+ pgentry_t *tab = (pgentry_t *)start_info.pt_base, page;
+ unsigned long addr = virt_address;
printk("Pagetable walk from virt %lx, base %lx:\n", virt_address, start_info.pt_base);

#if defined(__x86_64__)
page = tab[l4_table_offset(addr)];
- tab = to_virt(mfn_to_pfn(pte_to_mfn(page)) << PAGE_SHIFT);
- printk(" L4 = %p (%p) [offset = %lx]\n", page, tab, l4_table_offset(addr));
-
+ tab = pte_to_virt(page);
+ printk(" L4 = %"PRIpte" (%p) [offset = %lx]\n", page, tab, l4_table_offset(addr));
+#endif
+#if defined(__x86_64__) || defined(CONFIG_X86_PAE)
page = tab[l3_table_offset(addr)];
- tab = to_virt(mfn_to_pfn(pte_to_mfn(page)) << PAGE_SHIFT);
- printk(" L3 = %p (%p) [offset = %lx]\n", page, tab, l3_table_offset(addr));
+ tab = pte_to_virt(page);
+ printk(" L3 = %"PRIpte" (%p) [offset = %lx]\n", page, tab, l3_table_offset(addr));
#endif
page = tab[l2_table_offset(addr)];
- tab = to_virt(mfn_to_pfn(pte_to_mfn(page)) << PAGE_SHIFT);
- printk(" L2 = %p (%p) [offset = %lx]\n", page, tab, l2_table_offset(addr));
+ tab = pte_to_virt(page);
+ printk(" L2 = %"PRIpte" (%p) [offset = %lx]\n", page, tab, l2_table_offset(addr));

page = tab[l1_table_offset(addr)];
- printk(" L1 = %p (%p) [offset = %lx]\n", page, tab, l1_table_offset(addr));
+ printk(" L1 = %"PRIpte" (%p) [offset = %lx]\n", page, tab, l1_table_offset(addr));

}

diff -r ae0175bf0631 -r d0d9f50517f7 extras/mini-os/x86_32.S
--- a/extras/mini-os/x86_32.S Fri May 19 17:31:28 2006 +0100
+++ b/extras/mini-os/x86_32.S Fri May 19 17:31:34 2006 +0100
@@ -4,9 +4,15 @@
.section __xen_guest
.ascii "GUEST_OS=Mini-OS"
.ascii ",XEN_VER=xen-3.0"
+ .ascii ",VIRT_BASE=0xc0000000" /* &_text from minios_x86_32.lds */
+ .ascii ",ELF_PADDR_OFFSET=0xc0000000"
.ascii ",HYPERCALL_PAGE=0x2"
+#ifdef CONFIG_X86_PAE
+ .ascii ",PAE=yes"
+#else
+ .ascii ",PAE=no"
+#endif
.ascii ",LOADER=generic"
- .ascii ",PT_MODE_WRITABLE"
.byte 0
.text


_______________________________________________
Xen-changelog mailing list
Xen-changelog@lists.xensource.com
http://lists.xensource.com/xen-changelog