# HG changeset patch
# User awilliam@xxxxxxxxxxx
# Node ID 21918b22746ea1e9d498f8b83f43ee2c2da134bb
# Parent 4e7318b0c1e0e212ba5855d25dc228235939c794
# Parent b4d5a36e380bba81db5478c71b80425f4db38248
merge with xen-unstable.hg
---
README | 1
docs/src/user.tex | 132 ++++++++-
linux-2.6-xen-sparse/arch/i386/kernel/time-xen.c | 21 -
linux-2.6-xen-sparse/arch/i386/mm/hypervisor.c | 41 +-
linux-2.6-xen-sparse/arch/x86_64/Kconfig | 2
linux-2.6-xen-sparse/drivers/xen/netback/interface.c | 1
linux-2.6-xen-sparse/drivers/xen/netback/loopback.c | 1
linux-2.6-xen-sparse/drivers/xen/netfront/netfront.c | 1
tools/ioemu/console.c | 19 -
tools/ioemu/cpu-all.h | 25 +
tools/ioemu/exec-all.h | 22 +
tools/ioemu/hw/iommu.c | 4
tools/ioemu/hw/vga.c | 133 +++++++++
tools/ioemu/ia64_intrinsic.h | 276 +++++++++++++++++++
tools/ioemu/patches/domain-timeoffset | 10
tools/ioemu/patches/ioemu-ia64 | 93 ++++++
tools/ioemu/patches/qemu-64bit | 49 ++-
tools/ioemu/patches/qemu-bugfixes | 37 ++
tools/ioemu/patches/qemu-init-vgabios | 10
tools/ioemu/patches/qemu-target-i386-dm | 81 +++--
tools/ioemu/patches/series | 4
tools/ioemu/patches/shadow-vram | 16 -
tools/ioemu/patches/shared-vram | 73 ++---
tools/ioemu/patches/vnc-access-monitor-vt | 34 ++
tools/ioemu/patches/vnc-fixes | 57 ++-
tools/ioemu/patches/vnc-start-vncviewer | 12
tools/ioemu/patches/vnc-title-domain-name | 19 +
tools/ioemu/target-i386-dm/cpu.h | 4
tools/ioemu/target-i386-dm/exec-dm.c | 22 +
tools/ioemu/vl.c | 29 +
tools/ioemu/vl.h | 1
tools/ioemu/vnc.c | 101 ++++++
tools/xenstat/libxenstat/src/xenstat.c | 1
xen/arch/x86/hvm/svm/svm.c | 4
xen/arch/x86/mm.c | 7
xen/arch/x86/shadow_public.c | 59 ++--
xen/arch/x86/traps.c | 9
xen/arch/x86/x86_32/mm.c | 5
xen/arch/x86/x86_32/traps.c | 4
xen/arch/x86/x86_64/entry.S | 8
xen/arch/x86/x86_64/mm.c | 6
xen/arch/x86/x86_64/traps.c | 28 +
xen/common/schedule.c | 7
xen/include/asm-ia64/perfc_defn.h | 1
xen/include/asm-x86/config.h | 12
xen/include/asm-x86/perfc_defn.h | 147 ++++++++++
xen/include/xen/perfc_defn.h | 138 ---------
47 files changed, 1390 insertions(+), 377 deletions(-)
diff -r 4e7318b0c1e0 -r 21918b22746e README
--- a/README Wed Jul 26 09:41:24 2006 -0600
+++ b/README Wed Jul 26 10:49:32 2006 -0600
@@ -91,6 +91,7 @@ provided by your Linux distributor:
* GNU Binutils
* Development install of zlib (e.g., zlib-dev)
* Development install of Python v2.3 or later (e.g., python-dev)
+ * Development install of curses (e.g., libncurses-dev)
* bridge-utils package (/sbin/brctl)
* iproute package (/sbin/ip)
* hotplug or udev
diff -r 4e7318b0c1e0 -r 21918b22746e docs/src/user.tex
--- a/docs/src/user.tex Wed Jul 26 09:41:24 2006 -0600
+++ b/docs/src/user.tex Wed Jul 26 10:49:32 2006 -0600
@@ -1374,8 +1374,136 @@ To configure a domU to receive a PCI dev
%% There are two possible types of privileges: IO privileges and
%% administration privileges.
-
-
+\section{Support for virtual Trusted Platform Module (vTPM)}
+\label{ss:vtpm}
+
+Paravirtualized domains can be given access to a virtualized version
+of a TPM. This enables applications in these domains to use the services
+of the TPM device for example through a TSS stack
+\footnote{Trousers TSS stack: http://sourceforge.net/projects/trousers}.
+The Xen source repository provides the necessary software components to
+enable virtual TPM access. Support is provided through several
+different pieces. First, a TPM emulator has been modified to provide TPM's
+functionality for the virtual TPM subsystem. Second, a virtual TPM Manager
+coordinates the virtual TPMs efforts, manages their creation, and provides
+protected key storage using the TPM. Third, a device driver pair providing
+a TPM front- and backend is available for XenLinux to deliver TPM commands
+from the domain to the virtual TPM manager, which dispatches it to a
+software TPM. Since the TPM Manager relies on a HW TPM for protected key
+storage, therefore this subsystem requires a Linux-supported hardware TPM.
+For development purposes, a TPM emulator is available for use on non-TPM
+enabled platforms.
+
+\subsubsection{Compile-Time Setup}
+To enable access to the virtual TPM, the virtual TPM backend driver must
+be compiled for a privileged domain (e.g. domain 0). Using the XenLinux
+configuration, the necessary driver can be selected in the Xen configuration
+section. Unless the driver has been compiled into the kernel, its module
+must be activated using the following command:
+
+\begin{verbatim}
+modprobe tpmbk
+\end{verbatim}
+
+Similarly, the TPM frontend driver must be compiled for the kernel trying
+to use TPM functionality. Its driver can be selected in the kernel
+configuration section Device Driver / Character Devices / TPM Devices.
+Along with that the TPM driver for the built-in TPM must be selected.
+If the virtual TPM driver has been compiled as module, it
+must be activated using the following command:
+
+\begin{verbatim}
+modprobe tpm_xenu
+\end{verbatim}
+
+Furthermore, it is necessary to build the virtual TPM manager and software
+TPM by making changes to entries in Xen build configuration files.
+The following entry in the file Config.mk in the Xen root source
+directory must be made:
+
+\begin{verbatim}
+VTPM_TOOLS ?= y
+\end{verbatim}
+
+After a build of the Xen tree and a reboot of the machine, the TPM backend
+drive must be loaded. Once loaded, the virtual TPM manager daemon
+must be started before TPM-enabled guest domains may be launched.
+To enable being the destination of a virtual TPM Migration, the virtual TPM
+migration daemon must also be loaded.
+
+\begin{verbatim}
+vtpm_managerd
+\end{verbatim}
+\begin{verbatim}
+vtpm_migratord
+\end{verbatim}
+
+Once the VTPM manager is running, the VTPM can be accessed by loading the
+front end driver in a guest domain.
+
+\subsubsection{Development and Testing TPM Emulator}
+For development and testing on non-TPM enabled platforms, a TPM emulator
+can be used in replacement of a platform TPM. First, the entry in the file
+tools/vtpm/Rules.mk must look as follows:
+
+\begin{verbatim}
+BUILD_EMULATOR = y
+\end{verbatim}
+
+Second, the entry in the file tool/vtpm\_manager/Rules.mk must be uncommented
+as follows:
+
+\begin{verbatim}
+# TCS talks to fifo's rather than /dev/tpm. TPM Emulator assumed on fifos
+CFLAGS += -DDUMMY_TPM
+\end{verbatim}
+
+Before starting the virtual TPM Manager, start the emulator by executing
+the following in dom0:
+
+\begin{verbatim}
+tpm_emulator clear
+\end{verbatim}
+
+\subsubsection{vTPM Frontend Configuration}
+To provide TPM functionality to a user domain, a line must be added to
+the virtual TPM configuration file using the following format:
+
+\begin{verbatim}
+vtpm = ['instance=<instance number>, backend=<domain id>']
+\end{verbatim}
+
+The { \it instance number} reflects the preferred virtual TPM instance
+to associate with the domain. If the selected instance is
+already associated with another domain, the system will automatically
+select the next available instance. An instance number greater than
+zero must be provided. It is possible to omit the instance
+parameter from the configuration file.
+
+The {\it domain id} provides the ID of the domain where the
+virtual TPM backend driver and virtual TPM are running in. It should
+currently always be set to '0'.
+
+
+Examples for valid vtpm entries in the configuration file are
+
+\begin{verbatim}
+ vtpm = ['instance=1, backend=0']
+\end{verbatim}
+and
+\begin{verbatim}
+ vtpm = ['backend=0'].
+\end{verbatim}
+
+\subsubsection{Using the virtual TPM}
+
+Access to TPM functionality is provided by the virtual TPM frontend driver.
+Similar to existing hardware TPM drivers, this driver provides basic TPM
+status information through the {\it sysfs} filesystem. In a Xen user domain
+the sysfs entries can be found in /sys/devices/xen/vtpm-0.
+
+Commands can be sent to the virtual TPM instance using the character
+device /dev/tpm0 (major 10, minor 224).
% Chapter Storage and FileSytem Management
\chapter{Storage and File System Management}
diff -r 4e7318b0c1e0 -r 21918b22746e
linux-2.6-xen-sparse/arch/i386/kernel/time-xen.c
--- a/linux-2.6-xen-sparse/arch/i386/kernel/time-xen.c Wed Jul 26 09:41:24
2006 -0600
+++ b/linux-2.6-xen-sparse/arch/i386/kernel/time-xen.c Wed Jul 26 10:49:32
2006 -0600
@@ -958,11 +958,17 @@ u64 jiffies_to_st(unsigned long j)
do {
seq = read_seqbegin(&xtime_lock);
delta = j - jiffies;
- /* NB. The next check can trigger in some wrap-around cases,
- * but that's ok: we'll just end up with a shorter timeout. */
- if (delta < 1)
- delta = 1;
- st = processed_system_time + (delta * (u64)NS_PER_TICK);
+ if (delta < 1) {
+ /* Triggers in some wrap-around cases, but that's okay:
+ * we just end up with a shorter timeout. */
+ st = processed_system_time + NS_PER_TICK;
+ } else if (((unsigned long)delta >> (BITS_PER_LONG-3)) != 0) {
+ /* Very long timeout means there is no pending timer.
+ * We indicate this to Xen by passing zero timeout. */
+ st = 0;
+ } else {
+ st = processed_system_time + delta * (u64)NS_PER_TICK;
+ }
} while (read_seqretry(&xtime_lock, seq));
return st;
@@ -989,14 +995,15 @@ static void stop_hz_timer(void)
smp_mb();
- /* Leave ourselves in 'tick mode' if rcu or softirq or timer pending. */
+ /* Leave ourselves in tick mode if rcu or softirq or timer pending. */
if (rcu_needs_cpu(cpu) || local_softirq_pending() ||
(j = next_timer_interrupt(), time_before_eq(j, jiffies))) {
cpu_clear(cpu, nohz_cpu_mask);
j = jiffies + 1;
}
- BUG_ON(HYPERVISOR_set_timer_op(jiffies_to_st(j)) != 0);
+ if (HYPERVISOR_set_timer_op(jiffies_to_st(j)) != 0)
+ BUG();
}
static void start_hz_timer(void)
diff -r 4e7318b0c1e0 -r 21918b22746e
linux-2.6-xen-sparse/arch/i386/mm/hypervisor.c
--- a/linux-2.6-xen-sparse/arch/i386/mm/hypervisor.c Wed Jul 26 09:41:24
2006 -0600
+++ b/linux-2.6-xen-sparse/arch/i386/mm/hypervisor.c Wed Jul 26 10:49:32
2006 -0600
@@ -266,6 +266,7 @@ static void contiguous_bitmap_clear(
/* Protected by balloon_lock. */
#define MAX_CONTIG_ORDER 9 /* 2MB */
static unsigned long discontig_frames[1<<MAX_CONTIG_ORDER];
+static multicall_entry_t cr_mcl[1<<MAX_CONTIG_ORDER];
/* Ensure multi-page extents are contiguous in machine memory. */
int xen_create_contiguous_region(
@@ -310,12 +311,13 @@ int xen_create_contiguous_region(
/* 1. Zap current PTEs, remembering MFNs. */
for (i = 0; i < (1UL<<order); i++) {
in_frames[i] = pfn_to_mfn((__pa(vstart) >> PAGE_SHIFT) + i);
- if (HYPERVISOR_update_va_mapping(vstart + (i*PAGE_SIZE),
- __pte_ma(0), 0))
- BUG();
+ MULTI_update_va_mapping(cr_mcl + i, vstart + (i*PAGE_SIZE),
+ __pte_ma(0), 0);
set_phys_to_machine((__pa(vstart)>>PAGE_SHIFT)+i,
INVALID_P2M_ENTRY);
}
+ if (HYPERVISOR_multicall(cr_mcl, i))
+ BUG();
/* 2. Get a new contiguous memory extent. */
out_frame = __pa(vstart) >> PAGE_SHIFT;
@@ -343,15 +345,16 @@ int xen_create_contiguous_region(
/* 3. Map the new extent in place of old pages. */
for (i = 0; i < (1UL<<order); i++) {
frame = success ? (out_frame + i) : in_frames[i];
- if (HYPERVISOR_update_va_mapping(vstart + (i*PAGE_SIZE),
- pfn_pte_ma(frame,
- PAGE_KERNEL),
- 0))
- BUG();
+ MULTI_update_va_mapping(cr_mcl + i, vstart + (i*PAGE_SIZE),
+ pfn_pte_ma(frame, PAGE_KERNEL), 0);
set_phys_to_machine((__pa(vstart)>>PAGE_SHIFT)+i, frame);
}
- flush_tlb_all();
+ cr_mcl[i - 1].args[MULTI_UVMFLAGS_INDEX] = order
+ ? UVMF_TLB_FLUSH|UVMF_ALL
+ : UVMF_INVLPG|UVMF_ALL;
+ if (HYPERVISOR_multicall(cr_mcl, i))
+ BUG();
if (success)
contiguous_bitmap_set(__pa(vstart) >> PAGE_SHIFT,
@@ -402,13 +405,14 @@ void xen_destroy_contiguous_region(unsig
/* 2. Zap current PTEs. */
for (i = 0; i < (1UL<<order); i++) {
- if (HYPERVISOR_update_va_mapping(vstart + (i*PAGE_SIZE),
- __pte_ma(0), 0))
- BUG();
+ MULTI_update_va_mapping(cr_mcl + i, vstart + (i*PAGE_SIZE),
+ __pte_ma(0), 0);
set_phys_to_machine((__pa(vstart)>>PAGE_SHIFT)+i,
INVALID_P2M_ENTRY);
out_frames[i] = (__pa(vstart) >> PAGE_SHIFT) + i;
}
+ if (HYPERVISOR_multicall(cr_mcl, i))
+ BUG();
/* 3. Do the exchange for non-contiguous MFNs. */
rc = HYPERVISOR_memory_op(XENMEM_exchange, &exchange);
@@ -429,15 +433,16 @@ void xen_destroy_contiguous_region(unsig
/* 4. Map new pages in place of old pages. */
for (i = 0; i < (1UL<<order); i++) {
frame = success ? out_frames[i] : (in_frame + i);
- if (HYPERVISOR_update_va_mapping(vstart + (i*PAGE_SIZE),
- pfn_pte_ma(frame,
- PAGE_KERNEL),
- 0))
- BUG();
+ MULTI_update_va_mapping(cr_mcl + i, vstart + (i*PAGE_SIZE),
+ pfn_pte_ma(frame, PAGE_KERNEL), 0);
set_phys_to_machine((__pa(vstart)>>PAGE_SHIFT)+i, frame);
}
- flush_tlb_all();
+ cr_mcl[i - 1].args[MULTI_UVMFLAGS_INDEX] = order
+ ? UVMF_TLB_FLUSH|UVMF_ALL
+ : UVMF_INVLPG|UVMF_ALL;
+ if (HYPERVISOR_multicall(cr_mcl, i))
+ BUG();
balloon_unlock(flags);
}
diff -r 4e7318b0c1e0 -r 21918b22746e linux-2.6-xen-sparse/arch/x86_64/Kconfig
--- a/linux-2.6-xen-sparse/arch/x86_64/Kconfig Wed Jul 26 09:41:24 2006 -0600
+++ b/linux-2.6-xen-sparse/arch/x86_64/Kconfig Wed Jul 26 10:49:32 2006 -0600
@@ -330,7 +330,7 @@ config ARCH_DISCONTIGMEM_DEFAULT
config ARCH_SPARSEMEM_ENABLE
def_bool y
- depends on (NUMA || EXPERIMENTAL)
+ depends on (NUMA || EXPERIMENTAL) && !X86_64_XEN
config ARCH_MEMORY_PROBE
def_bool y
diff -r 4e7318b0c1e0 -r 21918b22746e
linux-2.6-xen-sparse/drivers/xen/netback/interface.c
--- a/linux-2.6-xen-sparse/drivers/xen/netback/interface.c Wed Jul 26
09:41:24 2006 -0600
+++ b/linux-2.6-xen-sparse/drivers/xen/netback/interface.c Wed Jul 26
10:49:32 2006 -0600
@@ -76,6 +76,7 @@ static struct ethtool_ops network_ethtoo
{
.get_tx_csum = ethtool_op_get_tx_csum,
.set_tx_csum = ethtool_op_set_tx_csum,
+ .get_link = ethtool_op_get_link,
};
netif_t *netif_alloc(domid_t domid, unsigned int handle, u8 be_mac[ETH_ALEN])
diff -r 4e7318b0c1e0 -r 21918b22746e
linux-2.6-xen-sparse/drivers/xen/netback/loopback.c
--- a/linux-2.6-xen-sparse/drivers/xen/netback/loopback.c Wed Jul 26
09:41:24 2006 -0600
+++ b/linux-2.6-xen-sparse/drivers/xen/netback/loopback.c Wed Jul 26
10:49:32 2006 -0600
@@ -129,6 +129,7 @@ static struct ethtool_ops network_ethtoo
.set_sg = ethtool_op_set_sg,
.get_tso = ethtool_op_get_tso,
.set_tso = ethtool_op_set_tso,
+ .get_link = ethtool_op_get_link,
};
/*
diff -r 4e7318b0c1e0 -r 21918b22746e
linux-2.6-xen-sparse/drivers/xen/netfront/netfront.c
--- a/linux-2.6-xen-sparse/drivers/xen/netfront/netfront.c Wed Jul 26
09:41:24 2006 -0600
+++ b/linux-2.6-xen-sparse/drivers/xen/netfront/netfront.c Wed Jul 26
10:49:32 2006 -0600
@@ -1201,6 +1201,7 @@ static struct ethtool_ops network_ethtoo
.set_sg = xennet_set_sg,
.get_tso = ethtool_op_get_tso,
.set_tso = xennet_set_tso,
+ .get_link = ethtool_op_get_link,
};
#ifdef CONFIG_SYSFS
diff -r 4e7318b0c1e0 -r 21918b22746e tools/ioemu/console.c
--- a/tools/ioemu/console.c Wed Jul 26 09:41:24 2006 -0600
+++ b/tools/ioemu/console.c Wed Jul 26 10:49:32 2006 -0600
@@ -954,11 +954,21 @@ int is_graphic_console(void)
return !active_console->text_console;
}
+void set_color_table(DisplayState *ds)
+{
+ int i, j;
+ for(j = 0; j < 2; j++) {
+ for(i = 0; i < 8; i++) {
+ color_table[j][i] =
+ col_expand(ds, vga_get_color(ds, color_table_rgb[j][i]));
+ }
+ }
+}
+
CharDriverState *text_console_init(DisplayState *ds)
{
CharDriverState *chr;
TextConsole *s;
- int i,j;
static int color_inited;
chr = qemu_mallocz(sizeof(CharDriverState));
@@ -976,12 +986,7 @@ CharDriverState *text_console_init(Displ
if (!color_inited) {
color_inited = 1;
- for(j = 0; j < 2; j++) {
- for(i = 0; i < 8; i++) {
- color_table[j][i] = col_expand(s->ds,
- vga_get_color(s->ds, color_table_rgb[j][i]));
- }
- }
+ set_color_table(ds);
}
s->y_displayed = 0;
s->y_base = 0;
diff -r 4e7318b0c1e0 -r 21918b22746e tools/ioemu/cpu-all.h
--- a/tools/ioemu/cpu-all.h Wed Jul 26 09:41:24 2006 -0600
+++ b/tools/ioemu/cpu-all.h Wed Jul 26 10:49:32 2006 -0600
@@ -835,6 +835,31 @@ static __inline__ void atomic_clear_bit(
:"=m" (*(volatile long *)addr)
:"dIr" (nr));
}
+#elif defined(__ia64__)
+#include "ia64_intrinsic.h"
+#define atomic_set_bit(nr, addr) ({ \
+ typeof(*addr) bit, old, new; \
+ volatile typeof(*addr) *m; \
+ \
+ m = (volatile typeof(*addr)*)(addr + nr / (8*sizeof(*addr))); \
+ bit = 1 << (nr % (8*sizeof(*addr))); \
+ do { \
+ old = *m; \
+ new = old | bit; \
+ } while (cmpxchg_acq(m, old, new) != old); \
+})
+
+#define atomic_clear_bit(nr, addr) ({ \
+ typeof(*addr) bit, old, new; \
+ volatile typeof(*addr) *m; \
+ \
+ m = (volatile typeof(*addr)*)(addr + nr / (8*sizeof(*addr))); \
+ bit = ~(1 << (nr % (8*sizeof(*addr)))); \
+ do { \
+ old = *m; \
+ new = old & bit; \
+ } while (cmpxchg_acq(m, old, new) != old); \
+})
#endif
/* memory API */
diff -r 4e7318b0c1e0 -r 21918b22746e tools/ioemu/exec-all.h
--- a/tools/ioemu/exec-all.h Wed Jul 26 09:41:24 2006 -0600
+++ b/tools/ioemu/exec-all.h Wed Jul 26 10:49:32 2006 -0600
@@ -391,6 +391,15 @@ static inline int testandset (int *p)
}
#endif
+#ifdef __ia64__
+#include "ia64_intrinsic.h"
+static inline int testandset (int *p)
+{
+ uint32_t o = 0, n = 1;
+ return (int)cmpxchg_acq(p, o, n);
+}
+#endif
+
#ifdef __s390__
static inline int testandset (int *p)
{
@@ -462,12 +471,13 @@ static inline int testandset (int *p)
}
#endif
-#ifdef __ia64
-#include <ia64intrin.h>
-
-static inline int testandset (int *p)
-{
- return __sync_lock_test_and_set (p, 1);
+#ifdef __ia64__
+#include "ia64_intrinsic.h"
+
+static inline int testandset (int *p)
+{
+ uint32_t o = 0, n = 1;
+ return (int)cmpxchg_acq(p, o, n);
}
#endif
diff -r 4e7318b0c1e0 -r 21918b22746e tools/ioemu/hw/iommu.c
--- a/tools/ioemu/hw/iommu.c Wed Jul 26 09:41:24 2006 -0600
+++ b/tools/ioemu/hw/iommu.c Wed Jul 26 10:49:32 2006 -0600
@@ -82,7 +82,11 @@ do { printf("IOMMU: " fmt , ##args); } w
#define IOPTE_VALID 0x00000002 /* IOPTE is valid */
#define IOPTE_WAZ 0x00000001 /* Write as zeros */
+#if defined(__i386__) || defined(__x86_64__)
#define PAGE_SHIFT 12
+#elif defined(__ia64__)
+#define PAGE_SHIFT 14
+#endif
#define PAGE_SIZE (1 << PAGE_SHIFT)
#define PAGE_MASK (PAGE_SIZE - 1)
diff -r 4e7318b0c1e0 -r 21918b22746e tools/ioemu/hw/vga.c
--- a/tools/ioemu/hw/vga.c Wed Jul 26 09:41:24 2006 -0600
+++ b/tools/ioemu/hw/vga.c Wed Jul 26 10:49:32 2006 -0600
@@ -1392,7 +1392,8 @@ static void vga_draw_graphic(VGAState *s
static void vga_draw_graphic(VGAState *s, int full_update)
{
int y1, y, update, page_min, page_max, linesize, y_start, double_scan,
mask;
- int width, height, shift_control, line_offset, page0, page1, bwidth;
+ int width, height, shift_control, line_offset, bwidth;
+ ram_addr_t page0, page1;
int disp_width, multi_scan, multi_run;
uint8_t *d;
uint32_t v, addr1, addr;
@@ -1772,6 +1773,136 @@ static void vga_map(PCIDevice *pci_dev,
}
}
+/* do the same job as vgabios before vgabios get ready - yeah */
+void vga_bios_init(VGAState *s)
+{
+ uint8_t palette_model[192] = {
+ 0, 0, 0, 0, 0, 170, 0, 170,
+ 0, 0, 170, 170, 170, 0, 0, 170,
+ 0, 170, 170, 85, 0, 170, 170, 170,
+ 85, 85, 85, 85, 85, 255, 85, 255,
+ 85, 85, 255, 255, 255, 85, 85, 255,
+ 85, 255, 255, 255, 85, 255, 255, 255,
+ 0, 21, 0, 0, 21, 42, 0, 63,
+ 0, 0, 63, 42, 42, 21, 0, 42,
+ 21, 42, 42, 63, 0, 42, 63, 42,
+ 0, 21, 21, 0, 21, 63, 0, 63,
+ 21, 0, 63, 63, 42, 21, 21, 42,
+ 21, 63, 42, 63, 21, 42, 63, 63,
+ 21, 0, 0, 21, 0, 42, 21, 42,
+ 0, 21, 42, 42, 63, 0, 0, 63,
+ 0, 42, 63, 42, 0, 63, 42, 42,
+ 21, 0, 21, 21, 0, 63, 21, 42,
+ 21, 21, 42, 63, 63, 0, 21, 63,
+ 0, 63, 63, 42, 21, 63, 42, 63,
+ 21, 21, 0, 21, 21, 42, 21, 63,
+ 0, 21, 63, 42, 63, 21, 0, 63,
+ 21, 42, 63, 63, 0, 63, 63, 42,
+ 21, 21, 21, 21, 21, 63, 21, 63,
+ 21, 21, 63, 63, 63, 21, 21, 63,
+ 21, 63, 63, 63, 21, 63, 63, 63
+ };
+
+ s->latch = 0;
+
+ s->sr_index = 3;
+ s->sr[0] = 3;
+ s->sr[1] = 0;
+ s->sr[2] = 3;
+ s->sr[3] = 0;
+ s->sr[4] = 2;
+ s->sr[5] = 0;
+ s->sr[6] = 0;
+ s->sr[7] = 0;
+
+ s->gr_index = 5;
+ s->gr[0] = 0;
+ s->gr[1] = 0;
+ s->gr[2] = 0;
+ s->gr[3] = 0;
+ s->gr[4] = 0;
+ s->gr[5] = 16;
+ s->gr[6] = 14;
+ s->gr[7] = 15;
+ s->gr[8] = 255;
+
+ /* changed by out 0x03c0 */
+ s->ar_index = 32;
+ s->ar[0] = 0;
+ s->ar[1] = 1;
+ s->ar[2] = 2;
+ s->ar[3] = 3;
+ s->ar[4] = 4;
+ s->ar[5] = 5;
+ s->ar[6] = 6;
+ s->ar[7] = 7;
+ s->ar[8] = 8;
+ s->ar[9] = 9;
+ s->ar[10] = 10;
+ s->ar[11] = 11;
+ s->ar[12] = 12;
+ s->ar[13] = 13;
+ s->ar[14] = 14;
+ s->ar[15] = 15;
+ s->ar[16] = 12;
+ s->ar[17] = 0;
+ s->ar[18] = 15;
+ s->ar[19] = 8;
+ s->ar[20] = 0;
+
+ s->ar_flip_flop = 1;
+
+ s->cr_index = 15;
+ s->cr[0] = 95;
+ s->cr[1] = 79;
+ s->cr[2] = 80;
+ s->cr[3] = 130;
+ s->cr[4] = 85;
+ s->cr[5] = 129;
+ s->cr[6] = 191;
+ s->cr[7] = 31;
+ s->cr[8] = 0;
+ s->cr[9] = 79;
+ s->cr[10] = 14;
+ s->cr[11] = 15;
+ s->cr[12] = 0;
+ s->cr[13] = 0;
+ s->cr[14] = 5;
+ s->cr[15] = 160;
+ s->cr[16] = 156;
+ s->cr[17] = 142;
+ s->cr[18] = 143;
+ s->cr[19] = 40;
+ s->cr[20] = 31;
+ s->cr[21] = 150;
+ s->cr[22] = 185;
+ s->cr[23] = 163;
+ s->cr[24] = 255;
+
+ s->msr = 103;
+ s->fcr = 0;
+ s->st00 = 0;
+ s->st01 = 0;
+
+ /* dac_* & palette will be initialized by os through out 0x03c8 &
+ * out 0c03c9(1:3) */
+ s->dac_state = 0;
+ s->dac_sub_index = 0;
+ s->dac_read_index = 0;
+ s->dac_write_index = 16;
+ s->dac_cache[0] = 255;
+ s->dac_cache[1] = 255;
+ s->dac_cache[2] = 255;
+
+ /* palette */
+ memcpy(s->palette, palette_model, 192);
+
+ s->bank_offset = 0;
+ s->graphic_mode = -1;
+
+ /* TODO: add vbe support if enabled */
+}
+
/* when used on xen environment, the vga_ram_base is not used */
void vga_common_init(VGAState *s, DisplayState *ds, uint8_t *vga_ram_base,
unsigned long vga_ram_offset, int vga_ram_size)
diff -r 4e7318b0c1e0 -r 21918b22746e tools/ioemu/patches/domain-timeoffset
--- a/tools/ioemu/patches/domain-timeoffset Wed Jul 26 09:41:24 2006 -0600
+++ b/tools/ioemu/patches/domain-timeoffset Wed Jul 26 10:49:32 2006 -0600
@@ -1,7 +1,7 @@ Index: ioemu/hw/mc146818rtc.c
Index: ioemu/hw/mc146818rtc.c
===================================================================
---- ioemu.orig/hw/mc146818rtc.c 2006-07-14 15:55:55.450963213 +0100
-+++ ioemu/hw/mc146818rtc.c 2006-07-14 15:56:02.195195680 +0100
+--- ioemu.orig/hw/mc146818rtc.c 2006-07-26 15:17:35.110819901 +0100
++++ ioemu/hw/mc146818rtc.c 2006-07-26 15:17:40.292255496 +0100
@@ -178,10 +178,27 @@
}
}
@@ -46,8 +46,8 @@ Index: ioemu/hw/mc146818rtc.c
static void rtc_copy_date(RTCState *s)
Index: ioemu/hw/pc.c
===================================================================
---- ioemu.orig/hw/pc.c 2006-07-14 15:56:01.774243586 +0100
-+++ ioemu/hw/pc.c 2006-07-14 15:56:02.196195566 +0100
+--- ioemu.orig/hw/pc.c 2006-07-26 15:17:39.820306906 +0100
++++ ioemu/hw/pc.c 2006-07-26 15:17:40.293255388 +0100
@@ -151,7 +151,7 @@
}
@@ -117,8 +117,8 @@ Index: ioemu/hw/pc.c
QEMUMachine pc_machine = {
Index: ioemu/vl.c
===================================================================
---- ioemu.orig/vl.c 2006-07-14 15:56:02.010216731 +0100
-+++ ioemu/vl.c 2006-07-14 15:56:02.198195338 +0100
+--- ioemu.orig/vl.c 2006-07-26 15:17:40.169268893 +0100
++++ ioemu/vl.c 2006-07-26 15:17:40.296255061 +0100
@@ -164,6 +164,8 @@
int xc_handle;
@@ -162,7 +162,7 @@ Index: ioemu/vl.c
}
}
}
-@@ -5963,7 +5971,8 @@
+@@ -5992,7 +6000,8 @@
machine->init(ram_size, vga_ram_size, boot_device,
ds, fd_filename, snapshot,
@@ -174,8 +174,8 @@ Index: ioemu/vl.c
qemu_mod_timer(gui_timer, qemu_get_clock(rt_clock));
Index: ioemu/vl.h
===================================================================
---- ioemu.orig/vl.h 2006-07-14 15:56:01.779243017 +0100
-+++ ioemu/vl.h 2006-07-14 15:56:02.199195224 +0100
+--- ioemu.orig/vl.h 2006-07-26 15:17:39.825306361 +0100
++++ ioemu/vl.h 2006-07-26 15:17:40.297254952 +0100
@@ -556,7 +556,7 @@
int boot_device,
DisplayState *ds, const char **fd_filename, int snapshot,
diff -r 4e7318b0c1e0 -r 21918b22746e tools/ioemu/patches/qemu-64bit
--- a/tools/ioemu/patches/qemu-64bit Wed Jul 26 09:41:24 2006 -0600
+++ b/tools/ioemu/patches/qemu-64bit Wed Jul 26 10:49:32 2006 -0600
@@ -1,7 +1,8 @@ diff -r 2b3e57b3e1ec cpu-all.h
-diff -r 2b3e57b3e1ec cpu-all.h
---- a/cpu-all.h Mon Jun 26 15:16:39 2006 +0100
-+++ b/cpu-all.h Mon Jun 26 15:16:44 2006 +0100
-@@ -822,7 +822,7 @@ int cpu_inl(CPUState *env, int addr);
+Index: ioemu/cpu-all.h
+===================================================================
+--- ioemu.orig/cpu-all.h 2006-07-26 13:19:49.515051864 +0100
++++ ioemu/cpu-all.h 2006-07-26 13:19:49.563046860 +0100
+@@ -822,7 +822,7 @@
/* memory API */
@@ -10,10 +11,11 @@ diff -r 2b3e57b3e1ec cpu-all.h
extern int phys_ram_fd;
extern uint8_t *phys_ram_base;
extern uint8_t *phys_ram_dirty;
-diff -r 2b3e57b3e1ec hw/pc.c
---- a/hw/pc.c Mon Jun 26 15:16:39 2006 +0100
-+++ b/hw/pc.c Mon Jun 26 15:16:44 2006 +0100
-@@ -147,7 +147,7 @@ static void cmos_init_hd(int type_ofs, i
+Index: ioemu/hw/pc.c
+===================================================================
+--- ioemu.orig/hw/pc.c 2006-07-26 13:19:49.516051760 +0100
++++ ioemu/hw/pc.c 2006-07-26 13:19:49.564046755 +0100
+@@ -147,7 +147,7 @@
}
/* hd_table must contain 4 block drivers */
@@ -22,7 +24,7 @@ diff -r 2b3e57b3e1ec hw/pc.c
{
RTCState *s = rtc_state;
int val;
-@@ -604,7 +604,7 @@ static void pc_init_ne2k_isa(NICInfo *nd
+@@ -604,7 +604,7 @@
}
/* PC hardware initialisation */
@@ -31,7 +33,7 @@ diff -r 2b3e57b3e1ec hw/pc.c
DisplayState *ds, const char **fd_filename, int snapshot,
const char *kernel_filename, const char *kernel_cmdline,
const char *initrd_filename,
-@@ -853,7 +853,7 @@ static void pc_init1(int ram_size, int v
+@@ -853,7 +853,7 @@
}
}
@@ -40,7 +42,7 @@ diff -r 2b3e57b3e1ec hw/pc.c
DisplayState *ds, const char **fd_filename,
int snapshot,
const char *kernel_filename,
-@@ -866,7 +866,7 @@ static void pc_init_pci(int ram_size, in
+@@ -866,7 +866,7 @@
initrd_filename, 1);
}
@@ -49,10 +51,11 @@ diff -r 2b3e57b3e1ec hw/pc.c
DisplayState *ds, const char **fd_filename,
int snapshot,
const char *kernel_filename,
-diff -r 2b3e57b3e1ec vl.c
---- a/vl.c Mon Jun 26 15:16:39 2006 +0100
-+++ b/vl.c Mon Jun 26 15:16:44 2006 +0100
-@@ -123,7 +123,7 @@ const char* keyboard_layout = NULL;
+Index: ioemu/vl.c
+===================================================================
+--- ioemu.orig/vl.c 2006-07-26 13:19:49.552048007 +0100
++++ ioemu/vl.c 2006-07-26 13:19:49.566046547 +0100
+@@ -123,7 +123,7 @@
const char* keyboard_layout = NULL;
int64_t ticks_per_sec;
int boot_device = 'c';
@@ -61,7 +64,7 @@ diff -r 2b3e57b3e1ec vl.c
int pit_min_timer_count = 0;
int nb_nics;
NICInfo nd_table[MAX_NICS];
-@@ -5320,7 +5320,7 @@ int main(int argc, char **argv)
+@@ -5320,7 +5320,7 @@
help();
break;
case QEMU_OPTION_m:
@@ -70,10 +73,11 @@ diff -r 2b3e57b3e1ec vl.c
if (ram_size <= 0)
help();
if (ram_size > PHYS_RAM_MAX_SIZE) {
-diff -r 2b3e57b3e1ec vl.h
---- a/vl.h Mon Jun 26 15:16:39 2006 +0100
-+++ b/vl.h Mon Jun 26 15:16:44 2006 +0100
-@@ -138,7 +138,7 @@ extern int xc_handle;
+Index: ioemu/vl.h
+===================================================================
+--- ioemu.orig/vl.h 2006-07-26 13:19:49.552048007 +0100
++++ ioemu/vl.h 2006-07-26 13:19:49.567046443 +0100
+@@ -138,7 +138,7 @@
extern int xc_handle;
extern int domid;
@@ -82,7 +86,7 @@ diff -r 2b3e57b3e1ec vl.h
extern int bios_size;
extern int rtc_utc;
extern int cirrus_vga_enabled;
-@@ -542,7 +542,7 @@ int qcow_compress_cluster(BlockDriverSta
+@@ -542,7 +542,7 @@
#ifndef QEMU_TOOL
@@ -91,3 +95,17 @@ diff -r 2b3e57b3e1ec vl.h
int boot_device,
DisplayState *ds, const char **fd_filename, int snapshot,
const char *kernel_filename, const char *kernel_cmdline,
+Index: ioemu/hw/vga.c
+===================================================================
+--- ioemu.orig/hw/vga.c 2006-07-26 13:19:49.549048319 +0100
++++ ioemu/hw/vga.c 2006-07-26 13:20:17.956085603 +0100
+@@ -1293,7 +1293,8 @@
+ static void vga_draw_graphic(VGAState *s, int full_update)
+ {
+ int y1, y, update, page_min, page_max, linesize, y_start, double_scan,
mask;
+- int width, height, shift_control, line_offset, page0, page1, bwidth;
++ int width, height, shift_control, line_offset, bwidth;
++ ram_addr_t page0, page1;
+ int disp_width, multi_scan, multi_run;
+ uint8_t *d;
+ uint32_t v, addr1, addr;
diff -r 4e7318b0c1e0 -r 21918b22746e tools/ioemu/patches/qemu-bugfixes
--- a/tools/ioemu/patches/qemu-bugfixes Wed Jul 26 09:41:24 2006 -0600
+++ b/tools/ioemu/patches/qemu-bugfixes Wed Jul 26 10:49:32 2006 -0600
@@ -1,7 +1,8 @@ diff -r d76fb4ee3e48 console.c
-diff -r d76fb4ee3e48 console.c
---- a/console.c Mon Jun 26 15:16:44 2006 +0100
-+++ b/console.c Mon Jun 26 15:47:43 2006 +0100
-@@ -449,7 +449,7 @@ static void text_console_resize(TextCons
+Index: ioemu/console.c
+===================================================================
+--- ioemu.orig/console.c 2006-07-26 13:39:11.999009495 +0100
++++ ioemu/console.c 2006-07-26 14:15:19.413719225 +0100
+@@ -449,7 +449,7 @@
c++;
}
}
@@ -10,9 +11,47 @@ diff -r d76fb4ee3e48 console.c
s->cells = cells;
}
-diff -r d76fb4ee3e48 usb-linux.c
---- a/usb-linux.c Mon Jun 26 15:16:44 2006 +0100
-+++ b/usb-linux.c Mon Jun 26 15:47:43 2006 +0100
+@@ -954,11 +954,21 @@
+ return !active_console->text_console;
+ }
+
++void set_color_table(DisplayState *ds)
++{
++ int i, j;
++ for(j = 0; j < 2; j++) {
++ for(i = 0; i < 8; i++) {
++ color_table[j][i] =
++ col_expand(ds, vga_get_color(ds, color_table_rgb[j][i]));
++ }
++ }
++}
++
+ CharDriverState *text_console_init(DisplayState *ds)
+ {
+ CharDriverState *chr;
+ TextConsole *s;
+- int i,j;
+ static int color_inited;
+
+ chr = qemu_mallocz(sizeof(CharDriverState));
+@@ -976,12 +986,7 @@
+
+ if (!color_inited) {
+ color_inited = 1;
+- for(j = 0; j < 2; j++) {
+- for(i = 0; i < 8; i++) {
+- color_table[j][i] = col_expand(s->ds,
+- vga_get_color(s->ds, color_table_rgb[j][i]));
+- }
+- }
++ set_color_table(ds);
+ }
+ s->y_displayed = 0;
+ s->y_base = 0;
+Index: ioemu/usb-linux.c
+===================================================================
+--- ioemu.orig/usb-linux.c 2006-07-26 13:39:11.999009495 +0100
++++ ioemu/usb-linux.c 2006-07-26 13:39:16.622514851 +0100
@@ -26,6 +26,7 @@
#if defined(__linux__)
#include <dirent.h>
diff -r 4e7318b0c1e0 -r 21918b22746e tools/ioemu/patches/qemu-target-i386-dm
--- a/tools/ioemu/patches/qemu-target-i386-dm Wed Jul 26 09:41:24 2006 -0600
+++ b/tools/ioemu/patches/qemu-target-i386-dm Wed Jul 26 10:49:32 2006 -0600
@@ -1,7 +1,8 @@ diff -r 9af27fed6713 Makefile.target
-diff -r 9af27fed6713 Makefile.target
---- a/Makefile.target Wed Jun 21 17:46:33 2006 +0100
-+++ b/Makefile.target Mon Jun 26 15:59:21 2006 +0100
-@@ -57,6 +57,8 @@ QEMU_SYSTEM=qemu-fast
+Index: ioemu/Makefile.target
+===================================================================
+--- ioemu.orig/Makefile.target 2006-07-26 11:45:57.572129351 +0100
++++ ioemu/Makefile.target 2006-07-26 11:45:57.589127569 +0100
+@@ -57,6 +57,8 @@
QEMU_SYSTEM=qemu-fast
endif
@@ -10,7 +11,7 @@ diff -r 9af27fed6713 Makefile.target
ifdef CONFIG_USER_ONLY
PROGS=$(QEMU_USER)
else
-@@ -274,6 +276,9 @@ OBJS+=gdbstub.o
+@@ -274,6 +276,9 @@
OBJS+=gdbstub.o
endif
@@ -20,7 +21,7 @@ diff -r 9af27fed6713 Makefile.target
all: $(PROGS)
$(QEMU_USER): $(OBJS)
-@@ -328,7 +333,7 @@ ifeq ($(TARGET_BASE_ARCH), i386)
+@@ -328,7 +333,7 @@
ifeq ($(TARGET_BASE_ARCH), i386)
# Hardware support
VL_OBJS+= ide.o pckbd.o ps2.o vga.o $(SOUND_HW) dma.o $(AUDIODRV)
@@ -29,10 +30,11 @@ diff -r 9af27fed6713 Makefile.target
VL_OBJS+= cirrus_vga.o mixeng.o apic.o parallel.o
DEFINES += -DHAS_AUDIO
endif
-diff -r 9af27fed6713 configure
---- a/configure Wed Jun 21 17:46:33 2006 +0100
-+++ b/configure Mon Jun 26 15:59:21 2006 +0100
-@@ -359,6 +359,8 @@ if test -z "$target_list" ; then
+Index: ioemu/configure
+===================================================================
+--- ioemu.orig/configure 2006-07-26 11:45:57.573129246 +0100
++++ ioemu/configure 2006-07-26 11:45:57.590127464 +0100
+@@ -359,6 +359,8 @@
if [ "$user" = "yes" ] ; then
target_list="i386-user arm-user armeb-user sparc-user ppc-user
mips-user mipsel-user $target_list"
fi
@@ -41,10 +43,11 @@ diff -r 9af27fed6713 configure
else
target_list=`echo "$target_list" | sed -e 's/,/ /g'`
fi
-diff -r 9af27fed6713 monitor.c
---- a/monitor.c Wed Jun 21 17:46:33 2006 +0100
-+++ b/monitor.c Mon Jun 26 15:59:21 2006 +0100
-@@ -1142,6 +1142,10 @@ static term_cmd_t info_cmds[] = {
+Index: ioemu/monitor.c
+===================================================================
+--- ioemu.orig/monitor.c 2006-07-26 11:45:57.576128931 +0100
++++ ioemu/monitor.c 2006-07-26 11:45:57.591127359 +0100
+@@ -1142,6 +1142,10 @@
"", "show host USB devices", },
{ "profile", "", do_info_profile,
"", "show profiling information", },
@@ -55,9 +58,10 @@ diff -r 9af27fed6713 monitor.c
{ NULL, NULL, },
};
-diff -r 9af27fed6713 vl.c
---- a/vl.c Wed Jun 21 17:46:33 2006 +0100
-+++ b/vl.c Mon Jun 26 15:59:21 2006 +0100
+Index: ioemu/vl.c
+===================================================================
+--- ioemu.orig/vl.c 2006-07-26 11:45:57.579128617 +0100
++++ ioemu/vl.c 2006-07-26 11:45:57.593127149 +0100
@@ -87,7 +87,7 @@
#include "exec-all.h"
@@ -67,7 +71,7 @@ diff -r 9af27fed6713 vl.c
//#define DEBUG_UNUSED_IOPORT
//#define DEBUG_IOPORT
-@@ -4382,7 +4382,7 @@ typedef struct QEMUResetEntry {
+@@ -4382,7 +4382,7 @@
static QEMUResetEntry *first_reset_entry;
static int reset_requested;
@@ -76,7 +80,7 @@ diff -r 9af27fed6713 vl.c
static int powerdown_requested;
void qemu_register_reset(QEMUResetHandler *func, void *opaque)
-@@ -4534,6 +4534,7 @@ void main_loop_wait(int timeout)
+@@ -4534,6 +4534,7 @@
qemu_get_clock(rt_clock));
}
@@ -84,7 +88,7 @@ diff -r 9af27fed6713 vl.c
static CPUState *cur_cpu;
int main_loop(void)
-@@ -4608,6 +4609,7 @@ int main_loop(void)
+@@ -4608,6 +4609,7 @@
cpu_disable_ticks();
return ret;
}
@@ -92,9 +96,10 @@ diff -r 9af27fed6713 vl.c
void help(void)
{
-diff -r 9af27fed6713 vl.h
---- a/vl.h Wed Jun 21 17:46:33 2006 +0100
-+++ b/vl.h Mon Jun 26 15:59:21 2006 +0100
+Index: ioemu/vl.h
+===================================================================
+--- ioemu.orig/vl.h 2006-07-26 11:45:39.289045710 +0100
++++ ioemu/vl.h 2006-07-26 11:45:57.594127044 +0100
@@ -38,6 +38,8 @@
#include <fcntl.h>
#include <sys/stat.h>
@@ -104,19 +109,19 @@ diff -r 9af27fed6713 vl.h
#ifndef O_LARGEFILE
#define O_LARGEFILE 0
-@@ -130,6 +132,11 @@ void qemu_system_powerdown(void);
- #endif
+@@ -131,6 +133,11 @@
void main_loop_wait(int timeout);
-+
+
+extern FILE *logfile;
+
+extern int xc_handle;
+extern int domid;
-
++
extern int ram_size;
extern int bios_size;
-@@ -814,6 +821,7 @@ uint32_t pic_intack_read(PicState2 *s);
+ extern int rtc_utc;
+@@ -814,6 +821,7 @@
uint32_t pic_intack_read(PicState2 *s);
void pic_info(void);
void irq_info(void);
@@ -124,9 +129,10 @@ diff -r 9af27fed6713 vl.h
/* APIC */
typedef struct IOAPICState IOAPICState;
-diff -r 9af27fed6713 target-i386-dm/cpu.h
---- /dev/null Thu Jan 01 00:00:00 1970 +0000
-+++ b/target-i386-dm/cpu.h Mon Jun 26 15:59:21 2006 +0100
+Index: ioemu/target-i386-dm/cpu.h
+===================================================================
+--- /dev/null 1970-01-01 00:00:00.000000000 +0000
++++ ioemu/target-i386-dm/cpu.h 2006-07-26 11:45:57.594127044 +0100
@@ -0,0 +1,86 @@
+/*
+ * i386 virtual CPU header
@@ -214,9 +220,10 @@ diff -r 9af27fed6713 target-i386-dm/cpu.
+#include "cpu-all.h"
+
+#endif /* CPU_I386_H */
-diff -r 9af27fed6713 target-i386-dm/exec-dm.c
---- /dev/null Thu Jan 01 00:00:00 1970 +0000
-+++ b/target-i386-dm/exec-dm.c Mon Jun 26 15:59:21 2006 +0100
+Index: ioemu/target-i386-dm/exec-dm.c
+===================================================================
+--- /dev/null 1970-01-01 00:00:00.000000000 +0000
++++ ioemu/target-i386-dm/exec-dm.c 2006-07-26 11:46:01.059763730 +0100
@@ -0,0 +1,512 @@
+/*
+ * virtual page mapping and translated block handling
@@ -602,7 +609,7 @@ diff -r 9af27fed6713 target-i386-dm/exec
+ start = mmio[i].start;
+ end = mmio[i].start + mmio[i].size;
+
-+ if ((addr >= start) && (addr <= end)){
++ if ((addr >= start) && (addr < end)){
+ return (mmio[i].io_index >> IO_MEM_SHIFT) &
(IO_MEM_NB_ENTRIES - 1);
+ }
+ }
@@ -730,9 +737,10 @@ diff -r 9af27fed6713 target-i386-dm/exec
+
+ return;
+}
-diff -r 9af27fed6713 target-i386-dm/helper2.c
---- /dev/null Thu Jan 01 00:00:00 1970 +0000
-+++ b/target-i386-dm/helper2.c Mon Jun 26 15:59:21 2006 +0100
+Index: ioemu/target-i386-dm/helper2.c
+===================================================================
+--- /dev/null 1970-01-01 00:00:00.000000000 +0000
++++ ioemu/target-i386-dm/helper2.c 2006-07-26 11:45:57.596126835 +0100
@@ -0,0 +1,464 @@
+/*
+ * i386 helpers (without register variable usage)
@@ -1198,9 +1206,10 @@ diff -r 9af27fed6713 target-i386-dm/help
+ }
+ return 0;
+}
-diff -r 9af27fed6713 target-i386-dm/i8259-dm.c
---- /dev/null Thu Jan 01 00:00:00 1970 +0000
-+++ b/target-i386-dm/i8259-dm.c Mon Jun 26 15:59:21 2006 +0100
+Index: ioemu/target-i386-dm/i8259-dm.c
+===================================================================
+--- /dev/null 1970-01-01 00:00:00.000000000 +0000
++++ ioemu/target-i386-dm/i8259-dm.c 2006-07-26 11:45:57.596126835 +0100
@@ -0,0 +1,107 @@
+/* Xen 8259 stub for interrupt controller emulation
+ *
@@ -1309,18 +1318,20 @@ diff -r 9af27fed6713 target-i386-dm/i825
+ void *alt_irq_opaque)
+{
+}
-diff -r 9af27fed6713 target-i386-dm/qemu-dm.debug
---- /dev/null Thu Jan 01 00:00:00 1970 +0000
-+++ b/target-i386-dm/qemu-dm.debug Mon Jun 26 15:59:21 2006 +0100
+Index: ioemu/target-i386-dm/qemu-dm.debug
+===================================================================
+--- /dev/null 1970-01-01 00:00:00.000000000 +0000
++++ ioemu/target-i386-dm/qemu-dm.debug 2006-07-26 11:45:57.596126835 +0100
@@ -0,0 +1,5 @@
+#!/bin/sh
+
+echo $* > /tmp/args
+echo $DISPLAY >> /tmp/args
+exec /usr/lib/xen/bin/qemu-dm $*
-diff -r 9af27fed6713 target-i386-dm/qemu-ifup
---- /dev/null Thu Jan 01 00:00:00 1970 +0000
-+++ b/target-i386-dm/qemu-ifup Mon Jun 26 15:59:21 2006 +0100
+Index: ioemu/target-i386-dm/qemu-ifup
+===================================================================
+--- /dev/null 1970-01-01 00:00:00.000000000 +0000
++++ ioemu/target-i386-dm/qemu-ifup 2006-07-26 11:45:57.597126730 +0100
@@ -0,0 +1,10 @@
+#!/bin/sh
+
diff -r 4e7318b0c1e0 -r 21918b22746e tools/ioemu/patches/series
--- a/tools/ioemu/patches/series Wed Jul 26 09:41:24 2006 -0600
+++ b/tools/ioemu/patches/series Wed Jul 26 10:49:32 2006 -0600
@@ -10,9 +10,11 @@ xen-domain-name
xen-domain-name
xen-domid
xen-mm
+ioemu-ia64
qemu-smp
qemu-no-apic
qemu-nobios
+qemu-init-vgabios
xen-network
qemu-timer
domain-reset
@@ -31,3 +33,5 @@ vnc-cleanup
vnc-cleanup
vnc-fixes
vnc-start-vncviewer
+vnc-title-domain-name
+vnc-access-monitor-vt
diff -r 4e7318b0c1e0 -r 21918b22746e tools/ioemu/patches/shadow-vram
--- a/tools/ioemu/patches/shadow-vram Wed Jul 26 09:41:24 2006 -0600
+++ b/tools/ioemu/patches/shadow-vram Wed Jul 26 10:49:32 2006 -0600
@@ -1,7 +1,8 @@ diff -r 0ef2ae12258c hw/vga.c
-diff -r 0ef2ae12258c hw/vga.c
---- a/hw/vga.c Mon Jun 26 16:07:22 2006 +0100
-+++ b/hw/vga.c Tue Jun 27 09:42:44 2006 +0100
-@@ -1287,6 +1287,105 @@ void vga_invalidate_scanlines(VGAState *
+Index: ioemu/hw/vga.c
+===================================================================
+--- ioemu.orig/hw/vga.c 2006-07-26 15:17:39.821306797 +0100
++++ ioemu/hw/vga.c 2006-07-26 15:17:40.017285449 +0100
+@@ -1287,6 +1287,105 @@
}
}
@@ -107,7 +108,7 @@ diff -r 0ef2ae12258c hw/vga.c
/*
* graphic modes
*/
-@@ -1381,6 +1480,11 @@ static void vga_draw_graphic(VGAState *s
+@@ -1382,6 +1481,11 @@
printf("w=%d h=%d v=%d line_offset=%d cr[0x09]=0x%02x cr[0x17]=0x%02x
linecmp=%d sr[0x01]=0x%02x\n",
width, height, v, line_offset, s->cr[9], s->cr[0x17],
s->line_compare, s->sr[0x01]);
#endif
@@ -119,7 +120,7 @@ diff -r 0ef2ae12258c hw/vga.c
addr1 = (s->start_addr * 4);
bwidth = width * 4;
y_start = -1;
-@@ -1699,6 +1803,14 @@ void vga_common_init(VGAState *s, Displa
+@@ -1830,6 +1934,14 @@
vga_reset(s);
@@ -134,9 +135,10 @@ diff -r 0ef2ae12258c hw/vga.c
s->vram_ptr = qemu_malloc(vga_ram_size);
s->vram_offset = vga_ram_offset;
s->vram_size = vga_ram_size;
-diff -r 0ef2ae12258c hw/vga_int.h
---- a/hw/vga_int.h Mon Jun 26 16:07:22 2006 +0100
-+++ b/hw/vga_int.h Tue Jun 27 09:42:44 2006 +0100
+Index: ioemu/hw/vga_int.h
+===================================================================
+--- ioemu.orig/hw/vga_int.h 2006-07-26 15:17:39.822306688 +0100
++++ ioemu/hw/vga_int.h 2006-07-26 15:17:40.017285449 +0100
@@ -76,6 +76,7 @@
#define VGA_STATE_COMMON \
diff -r 4e7318b0c1e0 -r 21918b22746e tools/ioemu/patches/shared-vram
--- a/tools/ioemu/patches/shared-vram Wed Jul 26 09:41:24 2006 -0600
+++ b/tools/ioemu/patches/shared-vram Wed Jul 26 10:49:32 2006 -0600
@@ -1,6 +1,7 @@ diff -r 62e05863ec04 hw/cirrus_vga.c
-diff -r 62e05863ec04 hw/cirrus_vga.c
---- a/hw/cirrus_vga.c Mon Jun 26 15:18:40 2006 +0100
-+++ b/hw/cirrus_vga.c Mon Jun 26 15:19:40 2006 +0100
+Index: ioemu/hw/cirrus_vga.c
+===================================================================
+--- ioemu.orig/hw/cirrus_vga.c 2006-07-26 15:17:35.230806831 +0100
++++ ioemu/hw/cirrus_vga.c 2006-07-26 15:17:39.819307015 +0100
@@ -28,6 +28,9 @@
*/
#include "vl.h"
@@ -11,7 +12,7 @@ diff -r 62e05863ec04 hw/cirrus_vga.c
/*
* TODO:
-@@ -231,6 +234,8 @@ typedef struct CirrusVGAState {
+@@ -231,6 +234,8 @@
int cirrus_linear_io_addr;
int cirrus_linear_bitblt_io_addr;
int cirrus_mmio_io_addr;
@@ -20,7 +21,7 @@ diff -r 62e05863ec04 hw/cirrus_vga.c
uint32_t cirrus_addr_mask;
uint32_t linear_mmio_mask;
uint8_t cirrus_shadow_gr0;
-@@ -267,6 +272,8 @@ typedef struct CirrusVGAState {
+@@ -267,6 +272,8 @@
int last_hw_cursor_y_end;
int real_vram_size; /* XXX: suppress that */
CPUWriteMemoryFunc **cirrus_linear_write;
@@ -29,7 +30,7 @@ diff -r 62e05863ec04 hw/cirrus_vga.c
} CirrusVGAState;
typedef struct PCICirrusVGAState {
-@@ -276,6 +283,8 @@ typedef struct PCICirrusVGAState {
+@@ -276,6 +283,8 @@
static uint8_t rop_to_index[256];
@@ -38,7 +39,7 @@ diff -r 62e05863ec04 hw/cirrus_vga.c
/***************************************
*
* prototypes.
-@@ -2520,6 +2529,80 @@ static CPUWriteMemoryFunc *cirrus_linear
+@@ -2520,6 +2529,80 @@
cirrus_linear_bitblt_writel,
};
@@ -119,7 +120,7 @@ diff -r 62e05863ec04 hw/cirrus_vga.c
/* Compute the memory access functions */
static void cirrus_update_memory_access(CirrusVGAState *s)
{
-@@ -2538,11 +2621,39 @@ static void cirrus_update_memory_access(
+@@ -2538,11 +2621,39 @@
mode = s->gr[0x05] & 0x7;
if (mode < 4 || mode > 5 || ((s->gr[0x0B] & 0x4) == 0)) {
@@ -159,7 +160,7 @@ diff -r 62e05863ec04 hw/cirrus_vga.c
s->cirrus_linear_write[0] = cirrus_linear_writeb;
s->cirrus_linear_write[1] = cirrus_linear_writew;
s->cirrus_linear_write[2] = cirrus_linear_writel;
-@@ -3136,6 +3247,13 @@ static void cirrus_pci_lfb_map(PCIDevice
+@@ -3136,6 +3247,13 @@
/* XXX: add byte swapping apertures */
cpu_register_physical_memory(addr, s->vram_size,
s->cirrus_linear_io_addr);
@@ -173,10 +174,11 @@ diff -r 62e05863ec04 hw/cirrus_vga.c
cpu_register_physical_memory(addr + 0x1000000, 0x400000,
s->cirrus_linear_bitblt_io_addr);
}
-diff -r 62e05863ec04 hw/pc.c
---- a/hw/pc.c Mon Jun 26 15:18:40 2006 +0100
-+++ b/hw/pc.c Mon Jun 26 15:19:40 2006 +0100
-@@ -783,14 +783,14 @@ static void pc_init1(uint64_t ram_size,
+Index: ioemu/hw/pc.c
+===================================================================
+--- ioemu.orig/hw/pc.c 2006-07-26 15:17:39.752314312 +0100
++++ ioemu/hw/pc.c 2006-07-26 15:17:39.820306906 +0100
+@@ -783,14 +783,14 @@
if (cirrus_vga_enabled) {
if (pci_enabled) {
pci_cirrus_vga_init(pci_bus,
@@ -194,18 +196,19 @@ diff -r 62e05863ec04 hw/pc.c
vga_ram_size, 0, 0);
}
-diff -r 62e05863ec04 hw/vga.c
---- a/hw/vga.c Mon Jun 26 15:18:40 2006 +0100
-+++ b/hw/vga.c Mon Jun 26 15:19:40 2006 +0100
-@@ -1668,6 +1668,7 @@ static void vga_map(PCIDevice *pci_dev,
- }
+Index: ioemu/hw/vga.c
+===================================================================
+--- ioemu.orig/hw/vga.c 2006-07-26 15:17:39.352357879 +0100
++++ ioemu/hw/vga.c 2006-07-26 15:17:39.821306797 +0100
+@@ -1799,6 +1799,7 @@
+ /* TODO: add vbe support if enabled */
}
+/* when used on xen environment, the vga_ram_base is not used */
void vga_common_init(VGAState *s, DisplayState *ds, uint8_t *vga_ram_base,
unsigned long vga_ram_offset, int vga_ram_size)
{
-@@ -1698,7 +1699,7 @@ void vga_common_init(VGAState *s, Displa
+@@ -1829,7 +1830,7 @@
vga_reset(s);
@@ -214,12 +217,10 @@ diff -r 62e05863ec04 hw/vga.c
s->vram_offset = vga_ram_offset;
s->vram_size = vga_ram_size;
s->ds = ds;
-@@ -1808,6 +1809,31 @@ int vga_initialize(PCIBus *bus, DisplayS
- #endif
- }
+@@ -1941,6 +1942,31 @@
return 0;
-+}
-+
+ }
+
+void *vga_update_vram(VGAState *s, void *vga_ram_base, int vga_ram_size)
+{
+ uint8_t *old_pointer;
@@ -243,27 +244,30 @@ diff -r 62e05863ec04 hw/vga.c
+ s->vram_ptr = vga_ram_base;
+
+ return old_pointer;
- }
-
++}
++
/********************************************************/
-diff -r 62e05863ec04 hw/vga_int.h
---- a/hw/vga_int.h Mon Jun 26 15:18:40 2006 +0100
-+++ b/hw/vga_int.h Mon Jun 26 15:19:40 2006 +0100
-@@ -166,5 +166,6 @@ void vga_draw_cursor_line_32(uint8_t *d1
+ /* vga screen dump */
+
+Index: ioemu/hw/vga_int.h
+===================================================================
+--- ioemu.orig/hw/vga_int.h 2006-07-26 15:17:38.201483242 +0100
++++ ioemu/hw/vga_int.h 2006-07-26 15:17:39.822306688 +0100
+@@ -166,5 +166,6 @@
unsigned int color0, unsigned int color1,
unsigned int color_xor);
+void *vga_update_vram(VGAState *s, void *vga_ram_base, int vga_ram_size);
extern const uint8_t sr_mask[8];
extern const uint8_t gr_mask[16];
-diff -r 62e05863ec04 vl.c
---- a/vl.c Mon Jun 26 15:18:40 2006 +0100
-+++ b/vl.c Mon Jun 26 15:19:40 2006 +0100
-@@ -5147,6 +5147,78 @@ static void select_soundhw (const char *
- #endif
+Index: ioemu/vl.c
+===================================================================
+--- ioemu.orig/vl.c 2006-07-26 15:17:39.755313985 +0100
++++ ioemu/vl.c 2006-07-26 15:17:39.824306470 +0100
+@@ -5148,6 +5148,78 @@
#define MAX_NET_CLIENTS 32
-+
+
+#include <xg_private.h>
+
+/* FIXME Flush the shadow page */
@@ -335,13 +339,15 @@ diff -r 62e05863ec04 vl.c
+
+ return 0;
+}
-
++
int main(int argc, char **argv)
{
-diff -r 62e05863ec04 vl.h
---- a/vl.h Mon Jun 26 15:18:40 2006 +0100
-+++ b/vl.h Mon Jun 26 15:19:40 2006 +0100
-@@ -136,6 +136,13 @@ extern int reset_requested;
+ #ifdef CONFIG_GDBSTUB
+Index: ioemu/vl.h
+===================================================================
+--- ioemu.orig/vl.h 2006-07-26 15:17:39.621328580 +0100
++++ ioemu/vl.h 2006-07-26 15:17:39.825306361 +0100
+@@ -136,6 +136,13 @@
void main_loop_wait(int timeout);
diff -r 4e7318b0c1e0 -r 21918b22746e tools/ioemu/patches/vnc-fixes
--- a/tools/ioemu/patches/vnc-fixes Wed Jul 26 09:41:24 2006 -0600
+++ b/tools/ioemu/patches/vnc-fixes Wed Jul 26 10:49:32 2006 -0600
@@ -1,8 +1,8 @@ Index: ioemu/vl.c
Index: ioemu/vl.c
===================================================================
---- ioemu.orig/vl.c 2006-07-14 15:56:03.043099185 +0100
-+++ ioemu/vl.c 2006-07-14 15:56:03.123090082 +0100
-@@ -5974,8 +5974,10 @@
+--- ioemu.orig/vl.c 2006-07-26 14:29:04.481598583 +0100
++++ ioemu/vl.c 2006-07-26 14:31:22.668325993 +0100
+@@ -6003,8 +6003,10 @@
kernel_filename, kernel_cmdline, initrd_filename,
timeoffset);
@@ -17,8 +17,8 @@ Index: ioemu/vl.c
if (use_gdbstub) {
Index: ioemu/vnc.c
===================================================================
---- ioemu.orig/vnc.c 2006-07-14 15:56:03.040099527 +0100
-+++ ioemu/vnc.c 2006-07-14 15:56:03.124089968 +0100
+--- ioemu.orig/vnc.c 2006-07-26 14:29:04.479598804 +0100
++++ ioemu/vnc.c 2006-07-26 14:31:22.669325883 +0100
@@ -3,6 +3,7 @@
*
* Copyright (C) 2006 Anthony Liguori <anthony@xxxxxxxxxxxxx>
@@ -112,7 +112,7 @@ Index: ioemu/vnc.c
}
static void vnc_framebuffer_update(VncState *vs, int x, int y, int w, int h,
-@@ -109,11 +142,15 @@
+@@ -109,16 +142,23 @@
static void vnc_dpy_resize(DisplayState *ds, int w, int h)
{
VncState *vs = ds->opaque;
@@ -129,7 +129,16 @@ Index: ioemu/vnc.c
fprintf(stderr, "vnc: memory allocation failed\n");
exit(1);
}
-@@ -131,6 +168,10 @@
+
+- ds->depth = vs->depth * 8;
++ if (ds->depth != vs->depth * 8) {
++ ds->depth = vs->depth * 8;
++ set_color_table(ds);
++ }
+ ds->width = w;
+ ds->height = h;
+ ds->linesize = w * vs->depth;
+@@ -131,6 +171,10 @@
vs->width = ds->width;
vs->height = ds->height;
}
@@ -140,7 +149,7 @@ Index: ioemu/vnc.c
}
static void send_framebuffer_update_raw(VncState *vs, int x, int y, int w,
int h)
-@@ -215,8 +256,20 @@
+@@ -215,8 +259,20 @@
int y = 0;
int pitch = ds->linesize;
VncState *vs = ds->opaque;
@@ -162,7 +171,7 @@ Index: ioemu/vnc.c
if (dst_y > src_y) {
y = h - 1;
-@@ -238,31 +291,34 @@
+@@ -238,31 +294,34 @@
old_row += pitch;
}
@@ -209,16 +218,16 @@ Index: ioemu/vnc.c
{
VncState *vs = opaque;
int64_t now = qemu_get_clock(rt_clock);
-@@ -274,11 +330,12 @@
+@@ -274,11 +333,12 @@
uint64_t width_mask;
int n_rectangles;
int saved_offset;
- int has_dirty = 0;
+-
+- width_mask = (1ULL << (vs->width / 16)) - 1;
+ int maxx, maxy;
+ int tile_bytes = vs->depth * DP2X(vs, 1);
-- width_mask = (1ULL << (vs->width / 16)) - 1;
--
- if (vs->width == 1024)
+ if (vs->width != DP2X(vs, DIRTY_PIXEL_BITS))
+ width_mask = (1ULL << X2DP_UP(vs, vs->ds->width)) - 1;
@@ -226,7 +235,7 @@ Index: ioemu/vnc.c
width_mask = ~(0ULL);
/* Walk through the dirty map and eliminate tiles that
-@@ -294,16 +351,18 @@
+@@ -294,16 +354,18 @@
ptr = row;
old_ptr = old_row;
@@ -253,7 +262,7 @@ Index: ioemu/vnc.c
}
}
-@@ -311,7 +370,8 @@
+@@ -311,7 +373,8 @@
old_row += vs->ds->linesize;
}
@@ -263,7 +272,7 @@ Index: ioemu/vnc.c
goto out;
/* Count rectangles */
-@@ -321,40 +381,61 @@
+@@ -321,40 +384,61 @@
saved_offset = vs->output.offset;
vnc_write_u16(vs, 0);
@@ -337,7 +346,7 @@ Index: ioemu/vnc.c
static void vnc_timer_init(VncState *vs)
{
if (vs->timer == NULL) {
-@@ -365,8 +446,6 @@
+@@ -365,8 +449,6 @@
static void vnc_dpy_refresh(DisplayState *ds)
{
@@ -346,7 +355,7 @@ Index: ioemu/vnc.c
vga_hw_update();
}
-@@ -402,7 +481,7 @@
+@@ -402,7 +484,7 @@
static void buffer_reset(Buffer *buffer)
{
@@ -355,7 +364,7 @@ Index: ioemu/vnc.c
}
static void buffer_append(Buffer *buffer, const void *data, size_t len)
-@@ -443,12 +522,12 @@
+@@ -443,12 +525,12 @@
if (!ret)
return;
@@ -371,7 +380,7 @@ Index: ioemu/vnc.c
}
static void vnc_read_when(VncState *vs, VncReadEvent *func, size_t expecting)
-@@ -480,11 +559,11 @@
+@@ -480,11 +562,11 @@
return;
if (!ret) {
@@ -386,7 +395,7 @@ Index: ioemu/vnc.c
}
}
-@@ -492,9 +571,9 @@
+@@ -492,9 +574,9 @@
{
buffer_reserve(&vs->output, len);
@@ -399,7 +408,7 @@ Index: ioemu/vnc.c
buffer_append(&vs->output, data, len);
}
-@@ -616,24 +695,25 @@
+@@ -616,24 +698,25 @@
do_key_event(vs, down, sym);
}
@@ -438,7 +447,7 @@ Index: ioemu/vnc.c
}
static void set_encodings(VncState *vs, int32_t *encodings, size_t
n_encodings)
-@@ -690,8 +770,6 @@
+@@ -690,8 +773,6 @@
vnc_client_error(vs);
vnc_dpy_resize(vs->ds, vs->ds->width, vs->ds->height);
@@ -447,7 +456,7 @@ Index: ioemu/vnc.c
vga_hw_invalidate();
vga_hw_update();
-@@ -848,11 +926,11 @@
+@@ -848,11 +929,11 @@
vnc_write(vs, "RFB 003.003\n", 12);
vnc_flush(vs);
vnc_read_when(vs, protocol_version, 12);
@@ -461,7 +470,7 @@ Index: ioemu/vnc.c
}
}
-@@ -909,17 +987,15 @@
+@@ -909,17 +990,15 @@
exit(1);
}
@@ -482,3 +491,15 @@ Index: ioemu/vnc.c
-
vnc_dpy_resize(vs->ds, 640, 400);
}
+Index: ioemu/vl.h
+===================================================================
+--- ioemu.orig/vl.h 2006-07-26 14:31:22.669325883 +0100
++++ ioemu/vl.h 2006-07-26 14:32:44.505279724 +0100
+@@ -301,6 +301,7 @@
+ int is_graphic_console(void);
+ CharDriverState *text_console_init(DisplayState *ds);
+ void console_select(unsigned int index);
++void set_color_table(DisplayState *ds);
+
+ /* serial ports */
+
diff -r 4e7318b0c1e0 -r 21918b22746e tools/ioemu/patches/vnc-start-vncviewer
--- a/tools/ioemu/patches/vnc-start-vncviewer Wed Jul 26 09:41:24 2006 -0600
+++ b/tools/ioemu/patches/vnc-start-vncviewer Wed Jul 26 10:49:32 2006 -0600
@@ -1,8 +1,8 @@ Index: ioemu/vnc.c
Index: ioemu/vnc.c
===================================================================
---- ioemu.orig/vnc.c 2006-07-14 18:29:36.810169908 +0100
-+++ ioemu/vnc.c 2006-07-14 18:30:17.437628819 +0100
-@@ -999,3 +999,25 @@
+--- ioemu.orig/vnc.c 2006-07-26 14:33:08.166663983 +0100
++++ ioemu/vnc.c 2006-07-26 14:33:08.225657462 +0100
+@@ -1002,3 +1002,25 @@
vnc_dpy_resize(vs->ds, 640, 400);
}
@@ -30,8 +30,8 @@ Index: ioemu/vnc.c
+}
Index: ioemu/vl.c
===================================================================
---- ioemu.orig/vl.c 2006-07-14 18:29:36.809170020 +0100
-+++ ioemu/vl.c 2006-07-14 18:30:17.435629043 +0100
+--- ioemu.orig/vl.c 2006-07-26 14:33:08.165664094 +0100
++++ ioemu/vl.c 2006-07-26 14:33:08.227657240 +0100
@@ -121,6 +121,7 @@
int bios_size;
static DisplayState display_state;
@@ -82,7 +82,7 @@ Index: ioemu/vl.c
case QEMU_OPTION_domainname:
strncat(domain_name, optarg, sizeof(domain_name) - 20);
break;
-@@ -5881,6 +5889,8 @@
+@@ -5910,6 +5918,8 @@
dumb_display_init(ds);
} else if (vnc_display != -1) {
vnc_display_init(ds, vnc_display);
@@ -93,9 +93,9 @@ Index: ioemu/vl.c
sdl_display_init(ds, full_screen);
Index: ioemu/vl.h
===================================================================
---- ioemu.orig/vl.h 2006-07-14 18:29:36.810169908 +0100
-+++ ioemu/vl.h 2006-07-14 18:30:17.436628931 +0100
-@@ -732,6 +732,7 @@
+--- ioemu.orig/vl.h 2006-07-26 14:33:08.167663873 +0100
++++ ioemu/vl.h 2006-07-26 14:33:08.228657130 +0100
+@@ -733,6 +733,7 @@
/* vnc.c */
void vnc_display_init(DisplayState *ds, int display);
diff -r 4e7318b0c1e0 -r 21918b22746e tools/ioemu/target-i386-dm/cpu.h
--- a/tools/ioemu/target-i386-dm/cpu.h Wed Jul 26 09:41:24 2006 -0600
+++ b/tools/ioemu/target-i386-dm/cpu.h Wed Jul 26 10:49:32 2006 -0600
@@ -80,7 +80,11 @@ int cpu_x86_inl(CPUX86State *env, int ad
/* helper2.c */
int main_loop(void);
+#if defined(__i386__) || defined(__x86_64__)
#define TARGET_PAGE_BITS 12
+#elif defined(__ia64__)
+#define TARGET_PAGE_BITS 14
+#endif
#include "cpu-all.h"
#endif /* CPU_I386_H */
diff -r 4e7318b0c1e0 -r 21918b22746e tools/ioemu/target-i386-dm/exec-dm.c
--- a/tools/ioemu/target-i386-dm/exec-dm.c Wed Jul 26 09:41:24 2006 -0600
+++ b/tools/ioemu/target-i386-dm/exec-dm.c Wed Jul 26 10:49:32 2006 -0600
@@ -340,6 +340,23 @@ CPUReadMemoryFunc **cpu_get_io_memory_re
return io_mem_read[io_index >> IO_MEM_SHIFT];
}
+#ifdef __ia64__
+/* IA64 has seperate I/D cache, with coherence maintained by DMA controller.
+ * So to emulate right behavior that guest OS is assumed, we need to flush
+ * I/D cache here.
+ */
+static void sync_icache(unsigned long address, int len)
+{
+ int l;
+
+ for(l = 0; l < (len + 32); l += 32)
+ __ia64_fc(address + l);
+
+ ia64_sync_i();
+ ia64_srlz_i();
+}
+#endif
+
/* physical memory access (slow version, mainly for debug) */
#if defined(CONFIG_USER_ONLY)
void cpu_physical_memory_rw(target_phys_addr_t addr, uint8_t *buf,
@@ -382,7 +399,7 @@ int iomem_index(target_phys_addr_t addr)
start = mmio[i].start;
end = mmio[i].start + mmio[i].size;
- if ((addr >= start) && (addr <= end)){
+ if ((addr >= start) && (addr < end)){
return (mmio[i].io_index >> IO_MEM_SHIFT) &
(IO_MEM_NB_ENTRIES - 1);
}
}
@@ -455,6 +472,9 @@ void cpu_physical_memory_rw(target_phys_
ptr = phys_ram_base + (pd & TARGET_PAGE_MASK) +
(addr & ~TARGET_PAGE_MASK);
memcpy(buf, ptr, l);
+#ifdef __ia64__
+ sync_icache((unsigned long)ptr, l);
+#endif
}
}
len -= l;
diff -r 4e7318b0c1e0 -r 21918b22746e tools/ioemu/vl.c
--- a/tools/ioemu/vl.c Wed Jul 26 09:41:24 2006 -0600
+++ b/tools/ioemu/vl.c Wed Jul 26 10:49:32 2006 -0600
@@ -5754,6 +5754,7 @@ int main(int argc, char **argv)
exit(-1);
}
+#if defined(__i386__) || defined(__x86_64__)
if (xc_get_pfn_list(xc_handle, domid, page_array, nr_pages) != nr_pages) {
fprintf(logfile, "xc_get_pfn_list returned error %d\n", errno);
exit(-1);
@@ -5774,6 +5775,34 @@ int main(int argc, char **argv)
fprintf(logfile, "shared page at pfn:%lx, mfn: %"PRIx64"\n", nr_pages - 1,
(uint64_t)(page_array[nr_pages - 1]));
+#elif defined(__ia64__)
+ if (xc_ia64_get_pfn_list(xc_handle, domid,
+ page_array, 0, nr_pages) != nr_pages) {
+ fprintf(logfile, "xc_ia64_get_pfn_list returned error %d\n", errno);
+ exit(-1);
+ }
+
+ phys_ram_base = xc_map_foreign_batch(xc_handle, domid,
+ PROT_READ|PROT_WRITE,
+ page_array, nr_pages);
+ if (phys_ram_base == 0) {
+ fprintf(logfile, "xc_map_foreign_batch returned error %d\n", errno);
+ exit(-1);
+ }
+
+ if (xc_ia64_get_pfn_list(xc_handle, domid, page_array,
+ nr_pages + (GFW_SIZE >> PAGE_SHIFT), 1)!= 1){
+ fprintf(logfile, "xc_ia64_get_pfn_list returned error %d\n", errno);
+ exit(-1);
+ }
+
+ shared_page = xc_map_foreign_range(xc_handle, domid, PAGE_SIZE,
+ PROT_READ|PROT_WRITE,
+ page_array[0]);
+
+ fprintf(logfile, "shared page at pfn:%lx, mfn: %l016x\n",
+ IO_PAGE_START >> PAGE_SHIFT, page_array[0]);
+#endif
#else /* !CONFIG_DM */
#ifdef CONFIG_SOFTMMU
diff -r 4e7318b0c1e0 -r 21918b22746e tools/ioemu/vl.h
--- a/tools/ioemu/vl.h Wed Jul 26 09:41:24 2006 -0600
+++ b/tools/ioemu/vl.h Wed Jul 26 10:49:32 2006 -0600
@@ -301,6 +301,7 @@ int is_graphic_console(void);
int is_graphic_console(void);
CharDriverState *text_console_init(DisplayState *ds);
void console_select(unsigned int index);
+void set_color_table(DisplayState *ds);
/* serial ports */
diff -r 4e7318b0c1e0 -r 21918b22746e tools/ioemu/vnc.c
--- a/tools/ioemu/vnc.c Wed Jul 26 09:41:24 2006 -0600
+++ b/tools/ioemu/vnc.c Wed Jul 26 10:49:32 2006 -0600
@@ -32,6 +32,10 @@
#include "vnc_keysym.h"
#include "keymaps.c"
+#define XK_MISCELLANY
+#define XK_LATIN1
+#include <X11/keysymdef.h>
+
typedef struct Buffer
{
size_t capacity;
@@ -64,6 +68,7 @@ struct VncState
Buffer output;
Buffer input;
kbd_layout_t *kbd_layout;
+ int ctl_keys; /* Ctrl+Alt starts calibration */
VncReadEvent *read_handler;
size_t read_handler_expect;
@@ -155,7 +160,10 @@ static void vnc_dpy_resize(DisplayState
exit(1);
}
- ds->depth = vs->depth * 8;
+ if (ds->depth != vs->depth * 8) {
+ ds->depth = vs->depth * 8;
+ set_color_table(ds);
+ }
ds->width = w;
ds->height = h;
ds->linesize = w * vs->depth;
@@ -676,16 +684,80 @@ static void pointer_event(VncState *vs,
static void do_key_event(VncState *vs, int down, uint32_t sym)
{
- int keycode;
-
- keycode = keysym2scancode(vs->kbd_layout, sym & 0xFFFF);
-
- if (keycode & 0x80)
- kbd_put_keycode(0xe0);
- if (down)
- kbd_put_keycode(keycode & 0x7f);
- else
- kbd_put_keycode(keycode | 0x80);
+ sym &= 0xFFFF;
+
+ if (is_graphic_console()) {
+ int keycode;
+
+ keycode = keysym2scancode(vs->kbd_layout, sym);
+ if (keycode & 0x80)
+ kbd_put_keycode(0xe0);
+ if (down)
+ kbd_put_keycode(keycode & 0x7f);
+ else
+ kbd_put_keycode(keycode | 0x80);
+ } else if (down) {
+ int qemu_keysym = 0;
+
+ if (sym <= 128) /* normal ascii */
+ qemu_keysym = sym;
+ else {
+ switch (sym) {
+ case XK_Up: qemu_keysym = QEMU_KEY_UP; break;
+ case XK_Down: qemu_keysym = QEMU_KEY_DOWN; break;
+ case XK_Left: qemu_keysym = QEMU_KEY_LEFT; break;
+ case XK_Right: qemu_keysym = QEMU_KEY_RIGHT; break;
+ case XK_Home: qemu_keysym = QEMU_KEY_HOME; break;
+ case XK_End: qemu_keysym = QEMU_KEY_END; break;
+ case XK_Page_Up: qemu_keysym = QEMU_KEY_PAGEUP; break;
+ case XK_Page_Down: qemu_keysym = QEMU_KEY_PAGEDOWN; break;
+ case XK_BackSpace: qemu_keysym = QEMU_KEY_BACKSPACE; break;
+ case XK_Delete: qemu_keysym = QEMU_KEY_DELETE; break;
+ case XK_Return:
+ case XK_Linefeed: qemu_keysym = sym; break;
+ default: break;
+ }
+ }
+ if (qemu_keysym != 0)
+ kbd_put_keysym(qemu_keysym);
+ }
+
+ if (down) {
+ switch (sym) {
+ case XK_Control_L:
+ vs->ctl_keys |= 1;
+ break;
+
+ case XK_Alt_L:
+ vs->ctl_keys |= 2;
+ break;
+
+ default:
+ break;
+ }
+ } else {
+ switch (sym) {
+ case XK_Control_L:
+ vs->ctl_keys &= ~1;
+ break;
+
+ case XK_Alt_L:
+ vs->ctl_keys &= ~2;
+ break;
+
+ case XK_1 ... XK_9:
+ if ((vs->ctl_keys & 3) != 3)
+ break;
+
+ console_select(sym - XK_1);
+ if (is_graphic_console()) {
+ /* tell the vga console to redisplay itself */
+ vga_hw_invalidate();
+ vnc_dpy_update(vs->ds, 0, 0, vs->ds->width, vs->ds->height);
+ }
+ break;
+ }
+ }
}
static void key_event(VncState *vs, int down, uint32_t sym)
@@ -847,6 +919,7 @@ static int protocol_client_msg(VncState
static int protocol_client_init(VncState *vs, char *data, size_t len)
{
+ size_t l;
char pad[3] = { 0, 0, 0 };
vs->width = vs->ds->width;
@@ -883,8 +956,10 @@ static int protocol_client_init(VncState
vnc_write(vs, pad, 3); /* padding */
- vnc_write_u32(vs, 4);
- vnc_write(vs, "QEMU", 4);
+ l = strlen(domain_name);
+ vnc_write_u32(vs, l);
+ vnc_write(vs, domain_name, l);
+
vnc_flush(vs);
vnc_read_when(vs, protocol_client_msg, 1);
diff -r 4e7318b0c1e0 -r 21918b22746e tools/xenstat/libxenstat/src/xenstat.c
--- a/tools/xenstat/libxenstat/src/xenstat.c Wed Jul 26 09:41:24 2006 -0600
+++ b/tools/xenstat/libxenstat/src/xenstat.c Wed Jul 26 10:49:32 2006 -0600
@@ -20,7 +20,6 @@
#include <stdio.h>
#include <string.h>
#include <unistd.h>
-#include <linux/compiler.h>
#include <fcntl.h>
#include <dirent.h>
#include <sys/types.h>
diff -r 4e7318b0c1e0 -r 21918b22746e xen/arch/x86/hvm/svm/svm.c
--- a/xen/arch/x86/hvm/svm/svm.c Wed Jul 26 09:41:24 2006 -0600
+++ b/xen/arch/x86/hvm/svm/svm.c Wed Jul 26 10:49:32 2006 -0600
@@ -1766,7 +1766,7 @@ static int mov_to_cr(int gpreg, int cr,
if ( svm_pgbit_test(v) )
{
/* The guest is a 32-bit PAE guest. */
-#if CONFIG_PAGING_LEVELS >= 4
+#if CONFIG_PAGING_LEVELS >= 3
unsigned long mfn, old_base_mfn;
if( !shadow_set_guest_paging_levels(v->domain, PAGING_L3) )
@@ -1810,7 +1810,7 @@ static int mov_to_cr(int gpreg, int cr,
else
{
/* The guest is a 64 bit or 32-bit PAE guest. */
-#if CONFIG_PAGING_LEVELS >= 4
+#if CONFIG_PAGING_LEVELS >= 3
if ( (v->domain->arch.ops != NULL) &&
v->domain->arch.ops->guest_paging_levels == PAGING_L2)
{
diff -r 4e7318b0c1e0 -r 21918b22746e xen/arch/x86/mm.c
--- a/xen/arch/x86/mm.c Wed Jul 26 09:41:24 2006 -0600
+++ b/xen/arch/x86/mm.c Wed Jul 26 10:49:32 2006 -0600
@@ -3881,6 +3881,13 @@ void memguard_unguard_range(void *p, uns
#endif
+void memguard_guard_stack(void *p)
+{
+ BUILD_BUG_ON((DEBUG_STACK_SIZE + PAGE_SIZE) > STACK_SIZE);
+ p = (void *)((unsigned long)p + STACK_SIZE - DEBUG_STACK_SIZE - PAGE_SIZE);
+ memguard_guard_range(p, PAGE_SIZE);
+}
+
/*
* Local variables:
* mode: C
diff -r 4e7318b0c1e0 -r 21918b22746e xen/arch/x86/shadow_public.c
--- a/xen/arch/x86/shadow_public.c Wed Jul 26 09:41:24 2006 -0600
+++ b/xen/arch/x86/shadow_public.c Wed Jul 26 10:49:32 2006 -0600
@@ -398,7 +398,7 @@ static void alloc_monitor_pagetable(stru
unsigned long m2mfn, m3mfn;
l2_pgentry_t *mpl2e;
l3_pgentry_t *mpl3e;
- struct page_info *m2mfn_info, *m3mfn_info, *page;
+ struct page_info *m2mfn_info, *m3mfn_info;
struct domain *d = v->domain;
int i;
@@ -411,40 +411,62 @@ static void alloc_monitor_pagetable(stru
mpl3e = (l3_pgentry_t *) map_domain_page_global(m3mfn);
memset(mpl3e, 0, L3_PAGETABLE_ENTRIES * sizeof(l3_pgentry_t));
+ v->arch.monitor_table = pagetable_from_pfn(m3mfn);
+ v->arch.monitor_vtable = (l2_pgentry_t *) mpl3e;
+
m2mfn_info = alloc_domheap_page(NULL);
ASSERT( m2mfn_info );
m2mfn = page_to_mfn(m2mfn_info);
mpl2e = (l2_pgentry_t *) map_domain_page(m2mfn);
- memset(mpl2e, 0, L2_PAGETABLE_ENTRIES * sizeof(l2_pgentry_t));
+ memset(mpl2e, 0, PAGE_SIZE);
+
+ /* Map L2 page into L3 */
+ mpl3e[L3_PAGETABLE_ENTRIES - 1] = l3e_from_pfn(m2mfn, _PAGE_PRESENT);
memcpy(&mpl2e[L2_PAGETABLE_FIRST_XEN_SLOT & (L2_PAGETABLE_ENTRIES-1)],
&idle_pg_table_l2[L2_PAGETABLE_FIRST_XEN_SLOT],
L2_PAGETABLE_XEN_SLOTS * sizeof(l2_pgentry_t));
- /*
- * Map L2 page into L3
- */
- mpl3e[L3_PAGETABLE_ENTRIES - 1] = l3e_from_pfn(m2mfn, _PAGE_PRESENT);
- page = l3e_get_page(mpl3e[L3_PAGETABLE_ENTRIES - 1]);
for ( i = 0; i < PDPT_L2_ENTRIES; i++ )
mpl2e[l2_table_offset(PERDOMAIN_VIRT_START) + i] =
l2e_from_page(
- virt_to_page(d->arch.mm_perdomain_pt) + i,
+ virt_to_page(d->arch.mm_perdomain_pt) + i,
__PAGE_HYPERVISOR);
for ( i = 0; i < (LINEARPT_MBYTES >> (L2_PAGETABLE_SHIFT - 20)); i++ )
mpl2e[l2_table_offset(LINEAR_PT_VIRT_START) + i] =
(l3e_get_flags(mpl3e[i]) & _PAGE_PRESENT) ?
l2e_from_pfn(l3e_get_pfn(mpl3e[i]), __PAGE_HYPERVISOR) :
l2e_empty();
- for ( i = 0; i < (MACHPHYS_MBYTES >> (L2_PAGETABLE_SHIFT - 20)); i++ )
- mpl2e[l2_table_offset(RO_MPT_VIRT_START) + i] = l2e_empty();
-
- v->arch.monitor_table = pagetable_from_pfn(m3mfn);
- v->arch.monitor_vtable = (l2_pgentry_t *) mpl3e;
if ( v->vcpu_id == 0 )
+ {
+ unsigned long m1mfn;
+ l1_pgentry_t *mpl1e;
+ struct page_info *m1mfn_info;
+
+ /*
+ * 2 l2 slots are allocated here, so that 4M for p2m table,
+ * with this we can guarantee PCI MMIO p2m entries, especially
+ * Cirrus VGA, can be seen by all other vcpus.
+ */
+ for ( i = 0; i < 2; i++ )
+ {
+ m1mfn_info = alloc_domheap_page(NULL);
+ ASSERT( m1mfn_info );
+
+ m1mfn = page_to_mfn(m1mfn_info);
+ mpl1e = (l1_pgentry_t *) map_domain_page(m1mfn);
+ memset(mpl1e, 0, PAGE_SIZE);
+ unmap_domain_page(mpl1e);
+
+ /* Map L1 page into L2 */
+ mpl2e[l2_table_offset(RO_MPT_VIRT_START) + i] =
+ l2e_from_pfn(m1mfn, __PAGE_HYPERVISOR);
+ }
+
alloc_p2m_table(d);
+ }
else
{
unsigned long mfn;
@@ -468,14 +490,9 @@ static void alloc_monitor_pagetable(stru
l2tab = map_domain_page(l3e_get_pfn(l3e));
- /*
- * Just one l2 slot is used here, so at most 2M for p2m table:
- * ((4K * 512)/sizeof(unsigned long)) * 4K = 2G
- * should be OK on PAE xen, since Qemu DM can only map 1.5G VMX
- * guest memory.
- */
- mpl2e[l2_table_offset(RO_MPT_VIRT_START)] =
- l2tab[l2_table_offset(RO_MPT_VIRT_START)];
+ for ( i = 0; i < (MACHPHYS_MBYTES >> (L2_PAGETABLE_SHIFT - 20));
i++ )
+ mpl2e[l2_table_offset(RO_MPT_VIRT_START) + i] =
+ l2tab[l2_table_offset(RO_MPT_VIRT_START) + i];
unmap_domain_page(l2tab);
unmap_domain_page(l3tab);
diff -r 4e7318b0c1e0 -r 21918b22746e xen/arch/x86/traps.c
--- a/xen/arch/x86/traps.c Wed Jul 26 09:41:24 2006 -0600
+++ b/xen/arch/x86/traps.c Wed Jul 26 10:49:32 2006 -0600
@@ -279,11 +279,14 @@ void show_stack_overflow(unsigned long e
void show_stack_overflow(unsigned long esp)
{
#ifdef MEMORY_GUARD
- unsigned long esp_top = get_stack_bottom() & PAGE_MASK;
+ unsigned long esp_top;
unsigned long *stack, addr;
- /* Trigger overflow trace if %esp is within 100 bytes of the guard page. */
- if ( ((esp - esp_top) > 100) && ((esp_top - esp) > 100) )
+ esp_top = (esp | (STACK_SIZE - 1)) - DEBUG_STACK_SIZE;
+
+ /* Trigger overflow trace if %esp is within 512 bytes of the guard page. */
+ if ( ((unsigned long)(esp - esp_top) > 512) &&
+ ((unsigned long)(esp_top - esp) > 512) )
return;
if ( esp < esp_top )
diff -r 4e7318b0c1e0 -r 21918b22746e xen/arch/x86/x86_32/mm.c
--- a/xen/arch/x86/x86_32/mm.c Wed Jul 26 09:41:24 2006 -0600
+++ b/xen/arch/x86/x86_32/mm.c Wed Jul 26 10:49:32 2006 -0600
@@ -345,11 +345,6 @@ int check_descriptor(struct desc_struct
return 0;
}
-void memguard_guard_stack(void *p)
-{
- memguard_guard_range(p, PAGE_SIZE);
-}
-
/*
* Local variables:
* mode: C
diff -r 4e7318b0c1e0 -r 21918b22746e xen/arch/x86/x86_32/traps.c
--- a/xen/arch/x86/x86_32/traps.c Wed Jul 26 09:41:24 2006 -0600
+++ b/xen/arch/x86/x86_32/traps.c Wed Jul 26 10:49:32 2006 -0600
@@ -122,6 +122,7 @@ asmlinkage void do_double_fault(void)
{
struct tss_struct *tss = &doublefault_tss;
unsigned int cpu = ((tss->back_link>>3)-__FIRST_TSS_ENTRY)>>1;
+ char taint_str[TAINT_STRING_MAX_LEN];
watchdog_disable();
@@ -129,6 +130,9 @@ asmlinkage void do_double_fault(void)
/* Find information saved during fault and dump it to the console. */
tss = &init_tss[cpu];
+ printk("*** DOUBLE FAULT: Xen-%d.%d%s %s\n",
+ XEN_VERSION, XEN_SUBVERSION, XEN_EXTRAVERSION,
+ print_tainted(taint_str));
printk("CPU: %d\nEIP: %04x:[<%08x>]",
cpu, tss->cs, tss->eip);
print_symbol(" %s\n", tss->eip);
diff -r 4e7318b0c1e0 -r 21918b22746e xen/arch/x86/x86_64/entry.S
--- a/xen/arch/x86/x86_64/entry.S Wed Jul 26 09:41:24 2006 -0600
+++ b/xen/arch/x86/x86_64/entry.S Wed Jul 26 10:49:32 2006 -0600
@@ -471,8 +471,10 @@ ENTRY(spurious_interrupt_bug)
jmp handle_exception
ENTRY(double_fault)
- movl $TRAP_double_fault,4(%rsp)
- jmp handle_exception
+ SAVE_ALL
+ movq %rsp,%rdi
+ call do_double_fault
+ ud2
ENTRY(nmi)
pushq $0
@@ -518,7 +520,7 @@ ENTRY(exception_table)
.quad do_bounds
.quad do_invalid_op
.quad math_state_restore
- .quad do_double_fault
+ .quad 0 # double_fault
.quad do_coprocessor_segment_overrun
.quad do_invalid_TSS
.quad do_segment_not_present
diff -r 4e7318b0c1e0 -r 21918b22746e xen/arch/x86/x86_64/mm.c
--- a/xen/arch/x86/x86_64/mm.c Wed Jul 26 09:41:24 2006 -0600
+++ b/xen/arch/x86/x86_64/mm.c Wed Jul 26 10:49:32 2006 -0600
@@ -323,12 +323,6 @@ int check_descriptor(struct desc_struct
return 0;
}
-void memguard_guard_stack(void *p)
-{
- p = (void *)((unsigned long)p + PAGE_SIZE);
- memguard_guard_range(p, 2 * PAGE_SIZE);
-}
-
/*
* Local variables:
* mode: C
diff -r 4e7318b0c1e0 -r 21918b22746e xen/arch/x86/x86_64/traps.c
--- a/xen/arch/x86/x86_64/traps.c Wed Jul 26 09:41:24 2006 -0600
+++ b/xen/arch/x86/x86_64/traps.c Wed Jul 26 10:49:32 2006 -0600
@@ -116,16 +116,38 @@ asmlinkage void double_fault(void);
asmlinkage void double_fault(void);
asmlinkage void do_double_fault(struct cpu_user_regs *regs)
{
+ unsigned int cpu, tr;
+ char taint_str[TAINT_STRING_MAX_LEN];
+
+ asm ( "str %0" : "=r" (tr) );
+ cpu = ((tr >> 3) - __FIRST_TSS_ENTRY) >> 2;
+
watchdog_disable();
console_force_unlock();
/* Find information saved during fault and dump it to the console. */
- printk("************************************\n");
- show_registers(regs);
+ printk("*** DOUBLE FAULT: Xen-%d.%d%s %s\n",
+ XEN_VERSION, XEN_SUBVERSION, XEN_EXTRAVERSION,
+ print_tainted(taint_str));
+ printk("CPU: %d\nRIP: %04x:[<%016lx>]",
+ cpu, regs->cs, regs->rip);
+ print_symbol(" %s", regs->rip);
+ printk("\nRFLAGS: %016lx\n", regs->rflags);
+ printk("rax: %016lx rbx: %016lx rcx: %016lx\n",
+ regs->rax, regs->rbx, regs->rcx);
+ printk("rdx: %016lx rsi: %016lx rdi: %016lx\n",
+ regs->rdx, regs->rsi, regs->rdi);
+ printk("rbp: %016lx rsp: %016lx r8: %016lx\n",
+ regs->rbp, regs->rsp, regs->r8);
+ printk("r9: %016lx r10: %016lx r11: %016lx\n",
+ regs->r9, regs->r10, regs->r11);
+ printk("r12: %016lx r13: %016lx r14: %016lx\n",
+ regs->r12, regs->r13, regs->r14);
+ printk("r15: %016lx\n", regs->r15);
show_stack_overflow(regs->rsp);
printk("************************************\n");
- printk("CPU%d DOUBLE FAULT -- system shutdown\n", smp_processor_id());
+ printk("CPU%d DOUBLE FAULT -- system shutdown\n", cpu);
printk("System needs manual reset.\n");
printk("************************************\n");
diff -r 4e7318b0c1e0 -r 21918b22746e xen/common/schedule.c
--- a/xen/common/schedule.c Wed Jul 26 09:41:24 2006 -0600
+++ b/xen/common/schedule.c Wed Jul 26 10:49:32 2006 -0600
@@ -404,12 +404,15 @@ long do_set_timer_op(s_time_t timeout)
* for timeouts wrapped negative, and for positive timeouts more than
* about 13 days in the future (2^50ns). The correct fix is to trigger
* an interrupt immediately (since Linux in fact has pending work to
- * do in this situation).
+ * do in this situation). However, older guests also set a long timeout
+ * when they have *no* pending timers at all: setting an immediate
+ * timeout in this case can burn a lot of CPU. We therefore go for a
+ * reasonable middleground of triggering a timer event in 100ms.
*/
DPRINTK("Warning: huge timeout set by domain %d (vcpu %d):"
" %"PRIx64"\n",
v->domain->domain_id, v->vcpu_id, (uint64_t)timeout);
- send_timer_event(v);
+ set_timer(&v->timer, NOW() + MILLISECS(100));
}
else
{
diff -r 4e7318b0c1e0 -r 21918b22746e xen/include/asm-x86/config.h
--- a/xen/include/asm-x86/config.h Wed Jul 26 09:41:24 2006 -0600
+++ b/xen/include/asm-x86/config.h Wed Jul 26 10:49:32 2006 -0600
@@ -67,15 +67,13 @@
#ifndef NDEBUG
#define MEMORY_GUARD
-#ifdef __x86_64__
+#endif
+
#define STACK_ORDER 2
-#endif
-#endif
-
-#ifndef STACK_ORDER
-#define STACK_ORDER 1
-#endif
#define STACK_SIZE (PAGE_SIZE << STACK_ORDER)
+
+/* Debug stack is restricted to 8kB by guard pages. */
+#define DEBUG_STACK_SIZE 8192
#define MAX_DMADOM_PFN 0x7FFFFUL /* 31 addressable bits */
diff -r 4e7318b0c1e0 -r 21918b22746e xen/include/xen/perfc_defn.h
--- a/xen/include/xen/perfc_defn.h Wed Jul 26 09:41:24 2006 -0600
+++ b/xen/include/xen/perfc_defn.h Wed Jul 26 10:49:32 2006 -0600
@@ -2,154 +2,18 @@
/*#ifndef __XEN_PERFC_DEFN_H__*/
/*#define __XEN_PERFC_DEFN_H__*/
-#define PERFC_MAX_PT_UPDATES 64
-#define PERFC_PT_UPDATES_BUCKET_SIZE 3
-PERFCOUNTER_ARRAY(wpt_updates, "writable pt updates",
- PERFC_MAX_PT_UPDATES)
-PERFCOUNTER_ARRAY(bpt_updates, "batched pt updates",
- PERFC_MAX_PT_UPDATES)
-PERFCOUNTER_ARRAY(l1_entries_checked, "l1 entries checked",
- PERFC_MAX_PT_UPDATES)
-PERFCOUNTER_ARRAY(shm_l2_updates, "shadow mode L2 pt updates",
- PERFC_MAX_PT_UPDATES)
-PERFCOUNTER_ARRAY(shm_hl2_updates, "shadow mode HL2 pt updates",
- PERFC_MAX_PT_UPDATES)
-#if defined(CONFIG_X86_64) || defined(CONFIG_X86_PAE)
-PERFCOUNTER_ARRAY(shm_l3_updates, "shadow mode L3 pt updates",
- PERFC_MAX_PT_UPDATES)
-PERFCOUNTER_ARRAY(shm_l4_updates, "shadow mode L4 pt updates",
- PERFC_MAX_PT_UPDATES)
-#endif
-PERFCOUNTER_ARRAY(snapshot_copies, "entries copied per snapshot",
- PERFC_MAX_PT_UPDATES)
+#include <asm/perfc_defn.h>
PERFCOUNTER_ARRAY(hypercalls, "hypercalls", NR_hypercalls)
-PERFCOUNTER_ARRAY(exceptions, "exceptions", 32)
-
-#define VMX_PERF_EXIT_REASON_SIZE 44
-#define VMX_PERF_VECTOR_SIZE 0x20
-PERFCOUNTER_ARRAY(vmexits, "vmexits", VMX_PERF_EXIT_REASON_SIZE)
-PERFCOUNTER_ARRAY(cause_vector, "cause vector", VMX_PERF_VECTOR_SIZE)
-#define SVM_PERF_EXIT_REASON_SIZE (1+136)
-PERFCOUNTER_ARRAY(svmexits, "SVMexits", SVM_PERF_EXIT_REASON_SIZE)
-
-PERFCOUNTER_CPU(seg_fixups, "segmentation fixups")
PERFCOUNTER_CPU(irqs, "#interrupts")
PERFCOUNTER_CPU(ipis, "#IPIs")
PERFCOUNTER_CPU(irq_time, "cycles spent in irq handler")
-PERFCOUNTER_CPU(apic_timer, "apic timer interrupts")
-PERFCOUNTER_CPU(timer_max, "timer max error (ns)")
PERFCOUNTER_CPU(sched_irq, "sched: timer")
PERFCOUNTER_CPU(sched_run, "sched: runs through scheduler")
PERFCOUNTER_CPU(sched_ctx, "sched: context switches")
-PERFCOUNTER_CPU(domain_page_tlb_flush, "domain page tlb flushes")
PERFCOUNTER_CPU(need_flush_tlb_flush, "PG_need_flush tlb flushes")
-PERFCOUNTER_CPU(calls_to_mmu_update, "calls_to_mmu_update")
-PERFCOUNTER_CPU(num_page_updates, "num_page_updates")
-PERFCOUNTER_CPU(calls_to_update_va, "calls_to_update_va_map")
-PERFCOUNTER_CPU(page_faults, "page faults")
-PERFCOUNTER_CPU(copy_user_faults, "copy_user faults")
-
-PERFCOUNTER_CPU(shadow_fault_calls, "calls to shadow_fault")
-PERFCOUNTER_CPU(shadow_fault_bail_pde_not_present,
- "sf bailed due to pde not present")
-PERFCOUNTER_CPU(shadow_fault_bail_pte_not_present,
- "sf bailed due to pte not present")
-PERFCOUNTER_CPU(shadow_fault_bail_ro_mapping,
- "sf bailed due to a ro mapping")
-PERFCOUNTER_CPU(shadow_fault_fixed, "sf fixed the pgfault")
-PERFCOUNTER_CPU(write_fault_bail, "sf bailed due to write_fault")
-PERFCOUNTER_CPU(read_fault_bail, "sf bailed due to read_fault")
-
-PERFCOUNTER_CPU(map_domain_page_count, "map_domain_page count")
-PERFCOUNTER_CPU(ptwr_emulations, "writable pt emulations")
-
-#if defined(CONFIG_X86_64) || defined(CONFIG_X86_PAE)
-PERFCOUNTER_CPU(shadow_l4_table_count, "shadow_l4_table count")
-PERFCOUNTER_CPU(shadow_l3_table_count, "shadow_l3_table count")
-#endif
-PERFCOUNTER_CPU(shadow_l2_table_count, "shadow_l2_table count")
-PERFCOUNTER_CPU(shadow_l1_table_count, "shadow_l1_table count")
-PERFCOUNTER_CPU(unshadow_table_count, "unshadow_table count")
-PERFCOUNTER_CPU(shadow_fixup_count, "shadow_fixup count")
-PERFCOUNTER_CPU(shadow_update_va_fail1, "shadow_update_va_fail1")
-PERFCOUNTER_CPU(shadow_update_va_fail2, "shadow_update_va_fail2")
-
-/* STATUS counters do not reset when 'P' is hit */
-#if defined(CONFIG_X86_64) || defined(CONFIG_X86_PAE)
-PERFSTATUS(shadow_l4_pages, "current # shadow L4 pages")
-PERFSTATUS(shadow_l3_pages, "current # shadow L3 pages")
-#endif
-PERFSTATUS(shadow_l2_pages, "current # shadow L2 pages")
-PERFSTATUS(shadow_l1_pages, "current # shadow L1 pages")
-PERFSTATUS(hl2_table_pages, "current # hl2 pages")
-PERFSTATUS(snapshot_pages, "current # fshadow snapshot pages")
-PERFSTATUS(writable_pte_predictions, "# writable pte predictions")
-PERFSTATUS(free_l1_pages, "current # free shadow L1 pages")
-
-PERFCOUNTER_CPU(check_pagetable, "calls to check_pagetable")
-PERFCOUNTER_CPU(check_all_pagetables, "calls to check_all_pagetables")
-
-PERFCOUNTER_CPU(shadow_hl2_table_count, "shadow_hl2_table count")
-PERFCOUNTER_CPU(shadow_set_l1e_force_map, "shadow_set_l1e forced to map l1")
-PERFCOUNTER_CPU(shadow_set_l1e_unlinked, "shadow_set_l1e found unlinked l1")
-PERFCOUNTER_CPU(shadow_set_l1e_fail, "shadow_set_l1e failed (no sl1)")
-#if defined(CONFIG_X86_64) || defined(CONFIG_X86_PAE)
-PERFCOUNTER_CPU(shadow_set_l2e_force_map, "shadow_set_l2e forced to map l2")
-PERFCOUNTER_CPU(shadow_set_l3e_force_map, "shadow_set_l3e forced to map l3")
-#endif
-PERFCOUNTER_CPU(shadow_invlpg_faults, "shadow_invlpg's get_user faulted")
-PERFCOUNTER_CPU(unshadow_l2_count, "unpinned L2 count")
-
-PERFCOUNTER_CPU(shadow_status_shortcut, "fastpath miss on shadow cache")
-PERFCOUNTER_CPU(shadow_status_calls, "calls to shadow_status")
-PERFCOUNTER_CPU(shadow_status_miss, "missed shadow cache")
-PERFCOUNTER_CPU(shadow_status_hit_head, "hits on head of bucket")
-PERFCOUNTER_CPU(shadow_max_type, "calls to shadow_max_type")
-
-PERFCOUNTER_CPU(shadow_sync_all, "calls to shadow_sync_all")
-PERFCOUNTER_CPU(shadow_sync_va, "calls to shadow_sync_va")
-PERFCOUNTER_CPU(resync_l1, "resync L1 page")
-PERFCOUNTER_CPU(resync_l2, "resync L2 page")
-#if defined(CONFIG_X86_64) || defined(CONFIG_X86_PAE)
-PERFCOUNTER_CPU(resync_l3, "resync L3 page")
-PERFCOUNTER_CPU(resync_l4, "resync L4 page")
-#endif
-PERFCOUNTER_CPU(resync_hl2, "resync HL2 page")
-PERFCOUNTER_CPU(shadow_make_snapshot, "snapshots created")
-PERFCOUNTER_CPU(shadow_mark_mfn_out_of_sync_calls,
- "calls to shadow_mk_out_of_sync")
-PERFCOUNTER_CPU(shadow_out_of_sync_calls, "calls to shadow_out_of_sync")
-PERFCOUNTER_CPU(snapshot_entry_matches_calls, "calls to ss_entry_matches")
-PERFCOUNTER_CPU(snapshot_entry_matches_true, "ss_entry_matches returns true")
-
-PERFCOUNTER_CPU(validate_pte_calls, "calls to validate_pte_change")
-PERFCOUNTER_CPU(validate_pte_changes1, "validate_pte makes changes1")
-PERFCOUNTER_CPU(validate_pte_changes2, "validate_pte makes changes2")
-PERFCOUNTER_CPU(validate_pte_changes3, "validate_pte makes changes3")
-PERFCOUNTER_CPU(validate_pte_changes4, "validate_pte makes changes4")
-PERFCOUNTER_CPU(validate_pde_calls, "calls to validate_pde_change")
-PERFCOUNTER_CPU(validate_pde_changes, "validate_pde makes changes")
-PERFCOUNTER_CPU(shadow_get_page_fail, "shadow_get_page_from_l1e fails")
-PERFCOUNTER_CPU(validate_hl2e_calls, "calls to validate_hl2e_change")
-PERFCOUNTER_CPU(validate_hl2e_changes, "validate_hl2e makes changes")
-#if defined(CONFIG_X86_64) || defined(CONFIG_X86_PAE)
-PERFCOUNTER_CPU(validate_entry_changes, "validate_entry changes")
-#endif
-PERFCOUNTER_CPU(exception_fixed, "pre-exception fixed")
-PERFCOUNTER_CPU(get_mfn_from_gpfn_foreign, "calls to
get_mfn_from_gpfn_foreign")
-PERFCOUNTER_CPU(remove_all_access, "calls to remove_all_access")
-PERFCOUNTER_CPU(remove_write_access, "calls to remove_write_access")
-PERFCOUNTER_CPU(remove_write_access_easy, "easy outs of remove_write_access")
-PERFCOUNTER_CPU(remove_write_no_work, "no work in remove_write_access")
-PERFCOUNTER_CPU(remove_write_not_writable, "remove_write non-writable page")
-PERFCOUNTER_CPU(remove_write_fast_exit, "remove_write hit predicted entry")
-PERFCOUNTER_CPU(remove_write_predicted, "remove_write predict hit&exit")
-PERFCOUNTER_CPU(remove_write_bad_prediction, "remove_write bad prediction")
-PERFCOUNTER_CPU(update_hl2e_invlpg, "update_hl2e calls invlpg")
-
/*#endif*/ /* __XEN_PERFC_DEFN_H__ */
diff -r 4e7318b0c1e0 -r 21918b22746e tools/ioemu/ia64_intrinsic.h
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/tools/ioemu/ia64_intrinsic.h Wed Jul 26 10:49:32 2006 -0600
@@ -0,0 +1,276 @@
+#ifndef IA64_INTRINSIC_H
+#define IA64_INTRINSIC_H
+
+/*
+ * Compiler-dependent Intrinsics
+ *
+ * Copyright (C) 2002,2003 Jun Nakajima <jun.nakajima@xxxxxxxxx>
+ * Copyright (C) 2002,2003 Suresh Siddha <suresh.b.siddha@xxxxxxxxx>
+ *
+ */
+extern long ia64_cmpxchg_called_with_bad_pointer (void);
+extern void ia64_bad_param_for_getreg (void);
+#define ia64_cmpxchg(sem,ptr,o,n,s) ({ \
+ uint64_t _o, _r; \
+ switch(s) { \
+ case 1: _o = (uint8_t)(long)(o); break; \
+ case 2: _o = (uint16_t)(long)(o); break; \
+ case 4: _o = (uint32_t)(long)(o); break; \
+ case 8: _o = (uint64_t)(long)(o); break; \
+ default: break; \
+ } \
+ switch(s) { \
+ case 1: \
+ _r = ia64_cmpxchg1_##sem((uint8_t*)ptr,n,_o); break; \
+ case 2: \
+ _r = ia64_cmpxchg2_##sem((uint16_t*)ptr,n,_o); break; \
+ case 4: \
+ _r = ia64_cmpxchg4_##sem((uint32_t*)ptr,n,_o); break; \
+ case 8: \
+ _r = ia64_cmpxchg8_##sem((uint64_t*)ptr,n,_o); break; \
+ default: \
+ _r = ia64_cmpxchg_called_with_bad_pointer(); break; \
+ } \
+ (__typeof__(o)) _r; \
+})
+
+#define cmpxchg_acq(ptr,o,n) ia64_cmpxchg(acq,ptr,o,n,sizeof(*ptr))
+#define cmpxchg_rel(ptr,o,n) ia64_cmpxchg(rel,ptr,o,n,sizeof(*ptr))
+
+/*
+ * Register Names for getreg() and setreg().
+ *
+ * The "magic" numbers happen to match the values used by the Intel compiler's
+ * getreg()/setreg() intrinsics.
+ */
+
+/* Special Registers */
+
+#define _IA64_REG_IP 1016 /* getreg only */
+#define _IA64_REG_PSR 1019
+#define _IA64_REG_PSR_L 1019
+
+/* General Integer Registers */
+
+#define _IA64_REG_GP 1025 /* R1 */
+#define _IA64_REG_R8 1032 /* R8 */
+#define _IA64_REG_R9 1033 /* R9 */
+#define _IA64_REG_SP 1036 /* R12 */
+#define _IA64_REG_TP 1037 /* R13 */
+
+/* Application Registers */
+
+#define _IA64_REG_AR_KR0 3072
+#define _IA64_REG_AR_KR1 3073
+#define _IA64_REG_AR_KR2 3074
+#define _IA64_REG_AR_KR3 3075
+#define _IA64_REG_AR_KR4 3076
+#define _IA64_REG_AR_KR5 3077
+#define _IA64_REG_AR_KR6 3078
+#define _IA64_REG_AR_KR7 3079
+#define _IA64_REG_AR_RSC 3088
+#define _IA64_REG_AR_BSP 3089
+#define _IA64_REG_AR_BSPSTORE 3090
+#define _IA64_REG_AR_RNAT 3091
+#define _IA64_REG_AR_FCR 3093
+#define _IA64_REG_AR_EFLAG 3096
+#define _IA64_REG_AR_CSD 3097
+#define _IA64_REG_AR_SSD 3098
+#define _IA64_REG_AR_CFLAG 3099
+#define _IA64_REG_AR_FSR 3100
+#define _IA64_REG_AR_FIR 3101
+#define _IA64_REG_AR_FDR 3102
+#define _IA64_REG_AR_CCV 3104
+#define _IA64_REG_AR_UNAT 3108
+#define _IA64_REG_AR_FPSR 3112
+#define _IA64_REG_AR_ITC 3116
+#define _IA64_REG_AR_PFS 3136
+#define _IA64_REG_AR_LC 3137
+#define _IA64_REG_AR_EC 3138
+
+/* Control Registers */
+
+#define _IA64_REG_CR_DCR 4096
+#define _IA64_REG_CR_ITM 4097
+#define _IA64_REG_CR_IVA 4098
+#define _IA64_REG_CR_PTA 4104
+#define _IA64_REG_CR_IPSR 4112
+#define _IA64_REG_CR_ISR 4113
+#define _IA64_REG_CR_IIP 4115
+#define _IA64_REG_CR_IFA 4116
+#define _IA64_REG_CR_ITIR 4117
+#define _IA64_REG_CR_IIPA 4118
+#define _IA64_REG_CR_IFS 4119
+#define _IA64_REG_CR_IIM 4120
+#define _IA64_REG_CR_IHA 4121
+#define _IA64_REG_CR_LID 4160
+#define _IA64_REG_CR_IVR 4161 /* getreg only */
+#define _IA64_REG_CR_TPR 4162
+#define _IA64_REG_CR_EOI 4163
+#define _IA64_REG_CR_IRR0 4164 /* getreg only */
+#define _IA64_REG_CR_IRR1 4165 /* getreg only */
+#define _IA64_REG_CR_IRR2 4166 /* getreg only */
+#define _IA64_REG_CR_IRR3 4167 /* getreg only */
+#define _IA64_REG_CR_ITV 4168
+#define _IA64_REG_CR_PMV 4169
+#define _IA64_REG_CR_CMCV 4170
+#define _IA64_REG_CR_LRR0 4176
+#define _IA64_REG_CR_LRR1 4177
+
+/* Indirect Registers for getindreg() and setindreg() */
+
+#define _IA64_REG_INDR_CPUID 9000 /* getindreg only */
+#define _IA64_REG_INDR_DBR 9001
+#define _IA64_REG_INDR_IBR 9002
+#define _IA64_REG_INDR_PKR 9003
+#define _IA64_REG_INDR_PMC 9004
+#define _IA64_REG_INDR_PMD 9005
+#define _IA64_REG_INDR_RR 9006
+
+#ifdef __INTEL_COMPILER
+void __fc(uint64_t *addr);
+void __synci(void);
+void __isrlz(void);
+void __dsrlz(void);
+uint64_t __getReg(const int whichReg);
+uint64_t _InterlockedCompareExchange8_rel(volatile uint8_t *dest, uint64_t
xchg, uint64_t comp);
+uint64_t _InterlockedCompareExchange8_acq(volatile uint8_t *dest, uint64_t
xchg, uint64_t comp);
+uint64_t _InterlockedCompareExchange16_rel(volatile uint16_t *dest, uint64_t
xchg, uint64_t comp);
+uint64_t _InterlockedCompareExchange16_acq(volatile uint16_t *dest, uint64_t
xchg, uint64_t comp);
+uint64_t _InterlockedCompareExchange_rel(volatile uint32_t *dest, uint64_t
xchg, uint64_t comp);
+uint64_t _InterlockedCompareExchange_acq(volatile uint32_t *dest, uint64_t
xchg, uint64_t comp);
+uint64_t _InterlockedCompareExchange64_rel(volatile uint64_t *dest, uint64_t
xchg, uint64_t comp);
+u64_t _InterlockedCompareExchange64_acq(volatile uint64_t *dest, uint64_t
xchg, uint64_t comp);
+
+#define ia64_cmpxchg1_rel _InterlockedCompareExchange8_rel
+#define ia64_cmpxchg1_acq _InterlockedCompareExchange8_acq
+#define ia64_cmpxchg2_rel _InterlockedCompareExchange16_rel
+#define ia64_cmpxchg2_acq _InterlockedCompareExchange16_acq
+#define ia64_cmpxchg4_rel _InterlockedCompareExchange_rel
+#define ia64_cmpxchg4_acq _InterlockedCompareExchange_acq
+#define ia64_cmpxchg8_rel _InterlockedCompareExchange64_rel
+#define ia64_cmpxchg8_acq _InterlockedCompareExchange64_acq
+
+#define ia64_srlz_d __dsrlz
+#define ia64_srlz_i __isrlz
+#define __ia64_fc __fc
+#define ia64_sync_i __synci
+#define __ia64_getreg __getReg
+#else /* __INTEL_COMPILER */
+#define ia64_cmpxchg1_acq(ptr, new, old)
\
+({
\
+ uint64_t ia64_intri_res;
\
+ asm volatile ("mov ar.ccv=%0;;" :: "rO"(old));
\
+ asm volatile ("cmpxchg1.acq %0=[%1],%2,ar.ccv":
\
+ "=r"(ia64_intri_res) : "r"(ptr), "r"(new) :
"memory"); \
+ ia64_intri_res;
\
+})
+
+#define ia64_cmpxchg1_rel(ptr, new, old)
\
+({
\
+ uint64_t ia64_intri_res;
\
+ asm volatile ("mov ar.ccv=%0;;" :: "rO"(old));
\
+ asm volatile ("cmpxchg1.rel %0=[%1],%2,ar.ccv":
\
+ "=r"(ia64_intri_res) : "r"(ptr), "r"(new) :
"memory"); \
+ ia64_intri_res;
\
+})
+
+#define ia64_cmpxchg2_acq(ptr, new, old)
\
+({
\
+ uint64_t ia64_intri_res;
\
+ asm volatile ("mov ar.ccv=%0;;" :: "rO"(old));
\
+ asm volatile ("cmpxchg2.acq %0=[%1],%2,ar.ccv":
\
+ "=r"(ia64_intri_res) : "r"(ptr), "r"(new) :
"memory"); \
+ ia64_intri_res;
\
+})
+
+#define ia64_cmpxchg2_rel(ptr, new, old)
\
+({
\
+ uint64_t ia64_intri_res;
\
+ asm volatile ("mov ar.ccv=%0;;" :: "rO"(old));
\
+
\
+ asm volatile ("cmpxchg2.rel %0=[%1],%2,ar.ccv":
\
+ "=r"(ia64_intri_res) : "r"(ptr), "r"(new) :
"memory"); \
+ ia64_intri_res;
\
+})
+
+#define ia64_cmpxchg4_acq(ptr, new, old)
\
+({
\
+ uint64_t ia64_intri_res;
\
+ asm volatile ("mov ar.ccv=%0;;" :: "rO"(old));
\
+ asm volatile ("cmpxchg4.acq %0=[%1],%2,ar.ccv":
\
+ "=r"(ia64_intri_res) : "r"(ptr), "r"(new) :
"memory"); \
+ ia64_intri_res;
\
+})
+
+#define ia64_cmpxchg4_rel(ptr, new, old)
\
+({
\
+ uint64_t ia64_intri_res;
\
+ asm volatile ("mov ar.ccv=%0;;" :: "rO"(old));
\
+ asm volatile ("cmpxchg4.rel %0=[%1],%2,ar.ccv":
\
+ "=r"(ia64_intri_res) : "r"(ptr), "r"(new) :
"memory"); \
+ ia64_intri_res;
\
+})
+
+#define ia64_cmpxchg8_acq(ptr, new, old)
\
+({
\
+ uint64_t ia64_intri_res;
\
+ asm volatile ("mov ar.ccv=%0;;" :: "rO"(old));
\
+ asm volatile ("cmpxchg8.acq %0=[%1],%2,ar.ccv":
\
+ "=r"(ia64_intri_res) : "r"(ptr), "r"(new) :
"memory"); \
+ ia64_intri_res;
\
+})
+
+#define ia64_cmpxchg8_rel(ptr, new, old)
\
+({
\
+ uint64_t ia64_intri_res;
\
+ asm volatile ("mov ar.ccv=%0;;" :: "rO"(old));
\
+
\
+ asm volatile ("cmpxchg8.rel %0=[%1],%2,ar.ccv":
\
+ "=r"(ia64_intri_res) : "r"(ptr), "r"(new) :
"memory"); \
+ ia64_intri_res;
\
+})
+
+#define ia64_srlz_i() asm volatile (";; srlz.i ;;" ::: "memory")
+#define ia64_srlz_d() asm volatile (";; srlz.d" ::: "memory");
+#define __ia64_fc(addr) asm volatile ("fc %0" :: "r"(addr) : "memory")
+#define ia64_sync_i() asm volatile (";; sync.i" ::: "memory")
+
+register unsigned long ia64_r13 asm ("r13") __attribute_used__;
+#define __ia64_getreg(regnum)
\
+({
\
+ uint64_t ia64_intri_res;
\
+
\
+ switch (regnum) {
\
+ case _IA64_REG_GP:
\
+ asm volatile ("mov %0=gp" : "=r"(ia64_intri_res));
\
+ break;
\
+ case _IA64_REG_IP:
\
+ asm volatile ("mov %0=ip" : "=r"(ia64_intri_res));
\
+ break;
\
+ case _IA64_REG_PSR:
\
+ asm volatile ("mov %0=psr" : "=r"(ia64_intri_res));
\
+ break;
\
+ case _IA64_REG_TP: /* for current() */
\
+ ia64_intri_res = ia64_r13;
\
+ break;
\
+ case _IA64_REG_AR_KR0 ... _IA64_REG_AR_EC:
\
+ asm volatile ("mov %0=ar%1" : "=r" (ia64_intri_res)
\
+ : "i"(regnum - _IA64_REG_AR_KR0));
\
+ break;
\
+ case _IA64_REG_CR_DCR ... _IA64_REG_CR_LRR1:
\
+ asm volatile ("mov %0=cr%1" : "=r" (ia64_intri_res)
\
+ : "i" (regnum - _IA64_REG_CR_DCR));
\
+ break;
\
+ case _IA64_REG_SP:
\
+ asm volatile ("mov %0=sp" : "=r" (ia64_intri_res));
\
+ break;
\
+ default:
\
+ ia64_bad_param_for_getreg();
\
+ break;
\
+ }
\
+ ia64_intri_res;
\
+})
+
+#endif /* __INTEL_COMPILER */
+#endif /* IA64_INTRINSIC_H */
diff -r 4e7318b0c1e0 -r 21918b22746e tools/ioemu/patches/ioemu-ia64
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/tools/ioemu/patches/ioemu-ia64 Wed Jul 26 10:49:32 2006 -0600
@@ -0,0 +1,471 @@
+Index: ioemu/hw/iommu.c
+===================================================================
+--- ioemu.orig/hw/iommu.c 2006-07-14 13:43:45.000000000 +0100
++++ ioemu/hw/iommu.c 2006-07-26 13:34:50.039997837 +0100
+@@ -82,7 +82,11 @@
+ #define IOPTE_VALID 0x00000002 /* IOPTE is valid */
+ #define IOPTE_WAZ 0x00000001 /* Write as zeros */
+
++#if defined(__i386__) || defined(__x86_64__)
+ #define PAGE_SHIFT 12
++#elif defined(__ia64__)
++#define PAGE_SHIFT 14
++#endif
+ #define PAGE_SIZE (1 << PAGE_SHIFT)
+ #define PAGE_MASK (PAGE_SIZE - 1)
+
+Index: ioemu/cpu-all.h
+===================================================================
+--- ioemu.orig/cpu-all.h 2006-07-26 13:33:45.946834283 +0100
++++ ioemu/cpu-all.h 2006-07-26 13:34:50.038997944 +0100
+@@ -835,6 +835,31 @@
+ :"=m" (*(volatile long *)addr)
+ :"dIr" (nr));
+ }
++#elif defined(__ia64__)
++#include "ia64_intrinsic.h"
++#define atomic_set_bit(nr, addr) ({ \
++ typeof(*addr) bit, old, new; \
++ volatile typeof(*addr) *m; \
++ \
++ m = (volatile typeof(*addr)*)(addr + nr / (8*sizeof(*addr))); \
++ bit = 1 << (nr % (8*sizeof(*addr))); \
++ do { \
++ old = *m; \
++ new = old | bit; \
++ } while (cmpxchg_acq(m, old, new) != old); \
++})
++
++#define atomic_clear_bit(nr, addr) ({ \
++ typeof(*addr) bit, old, new; \
++ volatile typeof(*addr) *m; \
++ \
++ m = (volatile typeof(*addr)*)(addr + nr / (8*sizeof(*addr))); \
++ bit = ~(1 << (nr % (8*sizeof(*addr)))); \
++ do { \
++ old = *m; \
++ new = old & bit; \
++ } while (cmpxchg_acq(m, old, new) != old); \
++})
+ #endif
+
+ /* memory API */
+Index: ioemu/vl.c
+===================================================================
+--- ioemu.orig/vl.c 2006-07-26 13:33:45.996828953 +0100
++++ ioemu/vl.c 2006-07-26 13:34:50.044997304 +0100
+@@ -5577,6 +5577,7 @@
+ exit(-1);
+ }
+
++#if defined(__i386__) || defined(__x86_64__)
+ if (xc_get_pfn_list(xc_handle, domid, page_array, nr_pages) != nr_pages) {
+ fprintf(logfile, "xc_get_pfn_list returned error %d\n", errno);
+ exit(-1);
+@@ -5597,6 +5598,34 @@
+ fprintf(logfile, "shared page at pfn:%lx, mfn: %"PRIx64"\n", nr_pages - 1,
+ (uint64_t)(page_array[nr_pages - 1]));
+
++#elif defined(__ia64__)
++ if (xc_ia64_get_pfn_list(xc_handle, domid,
++ page_array, 0, nr_pages) != nr_pages) {
++ fprintf(logfile, "xc_ia64_get_pfn_list returned error %d\n", errno);
++ exit(-1);
++ }
++
++ phys_ram_base = xc_map_foreign_batch(xc_handle, domid,
++ PROT_READ|PROT_WRITE,
++ page_array, nr_pages);
++ if (phys_ram_base == 0) {
++ fprintf(logfile, "xc_map_foreign_batch returned error %d\n", errno);
++ exit(-1);
++ }
++
++ if (xc_ia64_get_pfn_list(xc_handle, domid, page_array,
++ nr_pages + (GFW_SIZE >> PAGE_SHIFT), 1)!= 1){
++ fprintf(logfile, "xc_ia64_get_pfn_list returned error %d\n", errno);
++ exit(-1);
++ }
++
++ shared_page = xc_map_foreign_range(xc_handle, domid, PAGE_SIZE,
++ PROT_READ|PROT_WRITE,
++ page_array[0]);
++
++ fprintf(logfile, "shared page at pfn:%lx, mfn: %l016x\n",
++ IO_PAGE_START >> PAGE_SHIFT, page_array[0]);
++#endif
+ #else /* !CONFIG_DM */
+
+ #ifdef CONFIG_SOFTMMU
+Index: ioemu/target-i386-dm/exec-dm.c
+===================================================================
+--- ioemu.orig/target-i386-dm/exec-dm.c 2006-07-26 13:33:45.882841107
+0100
++++ ioemu/target-i386-dm/exec-dm.c 2006-07-26 13:34:50.040997731 +0100
+@@ -340,6 +340,23 @@
+ return io_mem_read[io_index >> IO_MEM_SHIFT];
+ }
+
++#ifdef __ia64__
++/* IA64 has seperate I/D cache, with coherence maintained by DMA controller.
++ * So to emulate right behavior that guest OS is assumed, we need to flush
++ * I/D cache here.
++ */
++static void sync_icache(unsigned long address, int len)
++{
++ int l;
++
++ for(l = 0; l < (len + 32); l += 32)
++ __ia64_fc(address + l);
++
++ ia64_sync_i();
++ ia64_srlz_i();
++}
++#endif
++
+ /* physical memory access (slow version, mainly for debug) */
+ #if defined(CONFIG_USER_ONLY)
+ void cpu_physical_memory_rw(target_phys_addr_t addr, uint8_t *buf,
+@@ -455,6 +472,9 @@
+ ptr = phys_ram_base + (pd & TARGET_PAGE_MASK) +
+ (addr & ~TARGET_PAGE_MASK);
+ memcpy(buf, ptr, l);
++#ifdef __ia64__
++ sync_icache((unsigned long)ptr, l);
++#endif
+ }
+ }
+ len -= l;
+Index: ioemu/exec-all.h
+===================================================================
+--- ioemu.orig/exec-all.h 2006-07-26 13:33:45.861843346 +0100
++++ ioemu/exec-all.h 2006-07-26 13:38:30.096491388 +0100
+@@ -391,6 +391,15 @@
+ }
+ #endif
+
++#ifdef __ia64__
++#include "ia64_intrinsic.h"
++static inline int testandset (int *p)
++{
++ uint32_t o = 0, n = 1;
++ return (int)cmpxchg_acq(p, o, n);
++}
++#endif
++
+ #ifdef __s390__
+ static inline int testandset (int *p)
+ {
+@@ -462,12 +471,13 @@
+ }
+ #endif
+
+-#ifdef __ia64
+-#include <ia64intrin.h>
++#ifdef __ia64__
++#include "ia64_intrinsic.h"
+
+ static inline int testandset (int *p)
+ {
+- return __sync_lock_test_and_set (p, 1);
++ uint32_t o = 0, n = 1;
++ return (int)cmpxchg_acq(p, o, n);
+ }
+ #endif
+
+Index: ioemu/target-i386-dm/cpu.h
+===================================================================
+--- ioemu.orig/target-i386-dm/cpu.h 2006-07-26 13:33:45.882841107 +0100
++++ ioemu/target-i386-dm/cpu.h 2006-07-26 13:34:50.040997731 +0100
+@@ -80,7 +80,11 @@
+ /* helper2.c */
+ int main_loop(void);
+
++#if defined(__i386__) || defined(__x86_64__)
+ #define TARGET_PAGE_BITS 12
++#elif defined(__ia64__)
++#define TARGET_PAGE_BITS 14
++#endif
+ #include "cpu-all.h"
+
+ #endif /* CPU_I386_H */
+Index: ioemu/ia64_intrinsic.h
+===================================================================
+--- /dev/null 1970-01-01 00:00:00.000000000 +0000
++++ ioemu/ia64_intrinsic.h 2006-07-26 13:34:50.038997944 +0100
+@@ -0,0 +1,276 @@
++#ifndef IA64_INTRINSIC_H
++#define IA64_INTRINSIC_H
++
++/*
++ * Compiler-dependent Intrinsics
++ *
++ * Copyright (C) 2002,2003 Jun Nakajima <jun.nakajima@xxxxxxxxx>
++ * Copyright (C) 2002,2003 Suresh Siddha <suresh.b.siddha@xxxxxxxxx>
++ *
++ */
++extern long ia64_cmpxchg_called_with_bad_pointer (void);
++extern void ia64_bad_param_for_getreg (void);
++#define ia64_cmpxchg(sem,ptr,o,n,s) ({
\
++ uint64_t _o, _r; \
++ switch(s) { \
++ case 1: _o = (uint8_t)(long)(o); break; \
++ case 2: _o = (uint16_t)(long)(o); break; \
++ case 4: _o = (uint32_t)(long)(o); break; \
++ case 8: _o = (uint64_t)(long)(o); break; \
++ default: break; \
++ } \
++ switch(s) { \
++ case 1: \
++ _r = ia64_cmpxchg1_##sem((uint8_t*)ptr,n,_o); break; \
++ case 2: \
++ _r = ia64_cmpxchg2_##sem((uint16_t*)ptr,n,_o); break; \
++ case 4: \
++ _r = ia64_cmpxchg4_##sem((uint32_t*)ptr,n,_o); break; \
++ case 8: \
++ _r = ia64_cmpxchg8_##sem((uint64_t*)ptr,n,_o); break; \
++ default: \
++ _r = ia64_cmpxchg_called_with_bad_pointer(); break; \
++ } \
++ (__typeof__(o)) _r; \
++})
++
++#define cmpxchg_acq(ptr,o,n) ia64_cmpxchg(acq,ptr,o,n,sizeof(*ptr))
++#define cmpxchg_rel(ptr,o,n) ia64_cmpxchg(rel,ptr,o,n,sizeof(*ptr))
++
++/*
++ * Register Names for getreg() and setreg().
++ *
++ * The "magic" numbers happen to match the values used by the Intel compiler's
++ * getreg()/setreg() intrinsics.
++ */
++
++/* Special Registers */
++
++#define _IA64_REG_IP 1016 /* getreg only */
++#define _IA64_REG_PSR 1019
++#define _IA64_REG_PSR_L 1019
++
++/* General Integer Registers */
++
++#define _IA64_REG_GP 1025 /* R1 */
++#define _IA64_REG_R8 1032 /* R8 */
++#define _IA64_REG_R9 1033 /* R9 */
++#define _IA64_REG_SP 1036 /* R12 */
++#define _IA64_REG_TP 1037 /* R13 */
++
++/* Application Registers */
++
++#define _IA64_REG_AR_KR0 3072
++#define _IA64_REG_AR_KR1 3073
++#define _IA64_REG_AR_KR2 3074
++#define _IA64_REG_AR_KR3 3075
++#define _IA64_REG_AR_KR4 3076
++#define _IA64_REG_AR_KR5 3077
++#define _IA64_REG_AR_KR6 3078
++#define _IA64_REG_AR_KR7 3079
++#define _IA64_REG_AR_RSC 3088
++#define _IA64_REG_AR_BSP 3089
++#define _IA64_REG_AR_BSPSTORE 3090
++#define _IA64_REG_AR_RNAT 3091
++#define _IA64_REG_AR_FCR 3093
++#define _IA64_REG_AR_EFLAG 3096
++#define _IA64_REG_AR_CSD 3097
++#define _IA64_REG_AR_SSD 3098
++#define _IA64_REG_AR_CFLAG 3099
++#define _IA64_REG_AR_FSR 3100
++#define _IA64_REG_AR_FIR 3101
++#define _IA64_REG_AR_FDR 3102
++#define _IA64_REG_AR_CCV 3104
++#define _IA64_REG_AR_UNAT 3108
++#define _IA64_REG_AR_FPSR 3112
++#define _IA64_REG_AR_ITC 3116
++#define _IA64_REG_AR_PFS 3136
++#define _IA64_REG_AR_LC 3137
++#define _IA64_REG_AR_EC 3138
++
++/* Control Registers */
++
++#define _IA64_REG_CR_DCR 4096
++#define _IA64_REG_CR_ITM 4097
++#define _IA64_REG_CR_IVA 4098
++#define _IA64_REG_CR_PTA 4104
++#define _IA64_REG_CR_IPSR 4112
++#define _IA64_REG_CR_ISR 4113
++#define _IA64_REG_CR_IIP 4115
++#define _IA64_REG_CR_IFA 4116
++#define _IA64_REG_CR_ITIR 4117
++#define _IA64_REG_CR_IIPA 4118
++#define _IA64_REG_CR_IFS 4119
++#define _IA64_REG_CR_IIM 4120
++#define _IA64_REG_CR_IHA 4121
++#define _IA64_REG_CR_LID 4160
++#define _IA64_REG_CR_IVR 4161 /* getreg only */
++#define _IA64_REG_CR_TPR 4162
++#define _IA64_REG_CR_EOI 4163
++#define _IA64_REG_CR_IRR0 4164 /* getreg only */
++#define _IA64_REG_CR_IRR1 4165 /* getreg only */
++#define _IA64_REG_CR_IRR2 4166 /* getreg only */
++#define _IA64_REG_CR_IRR3 4167 /* getreg only */
++#define _IA64_REG_CR_ITV 4168
++#define _IA64_REG_CR_PMV 4169
++#define _IA64_REG_CR_CMCV 4170
++#define _IA64_REG_CR_LRR0 4176
++#define _IA64_REG_CR_LRR1 4177
++
++/* Indirect Registers for getindreg() and setindreg() */
++
++#define _IA64_REG_INDR_CPUID 9000 /* getindreg only */
++#define _IA64_REG_INDR_DBR 9001
++#define _IA64_REG_INDR_IBR 9002
++#define _IA64_REG_INDR_PKR 9003
++#define _IA64_REG_INDR_PMC 9004
++#define _IA64_REG_INDR_PMD 9005
++#define _IA64_REG_INDR_RR 9006
++
++#ifdef __INTEL_COMPILER
++void __fc(uint64_t *addr);
++void __synci(void);
++void __isrlz(void);
++void __dsrlz(void);
++uint64_t __getReg(const int whichReg);
++uint64_t _InterlockedCompareExchange8_rel(volatile uint8_t *dest, uint64_t
xchg, uint64_t comp);
++uint64_t _InterlockedCompareExchange8_acq(volatile uint8_t *dest, uint64_t
xchg, uint64_t comp);
++uint64_t _InterlockedCompareExchange16_rel(volatile uint16_t *dest, uint64_t
xchg, uint64_t comp);
++uint64_t _InterlockedCompareExchange16_acq(volatile uint16_t *dest, uint64_t
xchg, uint64_t comp);
++uint64_t _InterlockedCompareExchange_rel(volatile uint32_t *dest, uint64_t
xchg, uint64_t comp);
++uint64_t _InterlockedCompareExchange_acq(volatile uint32_t *dest, uint64_t
xchg, uint64_t comp);
++uint64_t _InterlockedCompareExchange64_rel(volatile uint64_t *dest, uint64_t
xchg, uint64_t comp);
++u64_t _InterlockedCompareExchange64_acq(volatile uint64_t *dest, uint64_t
xchg, uint64_t comp);
++
++#define ia64_cmpxchg1_rel _InterlockedCompareExchange8_rel
++#define ia64_cmpxchg1_acq _InterlockedCompareExchange8_acq
++#define ia64_cmpxchg2_rel _InterlockedCompareExchange16_rel
++#define ia64_cmpxchg2_acq _InterlockedCompareExchange16_acq
++#define ia64_cmpxchg4_rel _InterlockedCompareExchange_rel
++#define ia64_cmpxchg4_acq _InterlockedCompareExchange_acq
++#define ia64_cmpxchg8_rel _InterlockedCompareExchange64_rel
++#define ia64_cmpxchg8_acq _InterlockedCompareExchange64_acq
++
++#define ia64_srlz_d __dsrlz
++#define ia64_srlz_i __isrlz
++#define __ia64_fc __fc
++#define ia64_sync_i __synci
++#define __ia64_getreg __getReg
++#else /* __INTEL_COMPILER */
++#define ia64_cmpxchg1_acq(ptr, new, old)
\
++({
\
++ uint64_t ia64_intri_res;
\
++ asm volatile ("mov ar.ccv=%0;;" :: "rO"(old));
\
++ asm volatile ("cmpxchg1.acq %0=[%1],%2,ar.ccv":
\
++ "=r"(ia64_intri_res) : "r"(ptr), "r"(new) :
"memory"); \
++ ia64_intri_res;
\
++})
++
++#define ia64_cmpxchg1_rel(ptr, new, old)
\
++({
\
++ uint64_t ia64_intri_res;
\
++ asm volatile ("mov ar.ccv=%0;;" :: "rO"(old));
\
++ asm volatile ("cmpxchg1.rel %0=[%1],%2,ar.ccv":
\
++ "=r"(ia64_intri_res) : "r"(ptr), "r"(new) :
"memory"); \
++ ia64_intri_res;
\
++})
++
++#define ia64_cmpxchg2_acq(ptr, new, old)
\
++({
\
++ uint64_t ia64_intri_res;
\
++ asm volatile ("mov ar.ccv=%0;;" :: "rO"(old));
\
++ asm volatile ("cmpxchg2.acq %0=[%1],%2,ar.ccv":
\
++ "=r"(ia64_intri_res) : "r"(ptr), "r"(new) :
"memory"); \
++ ia64_intri_res;
\
++})
++
++#define ia64_cmpxchg2_rel(ptr, new, old)
\
++({
\
++ uint64_t ia64_intri_res;
\
++ asm volatile ("mov ar.ccv=%0;;" :: "rO"(old));
\
++
\
++ asm volatile ("cmpxchg2.rel %0=[%1],%2,ar.ccv":
\
++ "=r"(ia64_intri_res) : "r"(ptr), "r"(new) :
"memory"); \
++ ia64_intri_res;
\
++})
++
++#define ia64_cmpxchg4_acq(ptr, new, old)
\
++({
\
++ uint64_t ia64_intri_res;
\
++ asm volatile ("mov ar.ccv=%0;;" :: "rO"(old));
\
++ asm volatile ("cmpxchg4.acq %0=[%1],%2,ar.ccv":
\
++ "=r"(ia64_intri_res) : "r"(ptr), "r"(new) :
"memory"); \
++ ia64_intri_res;
\
++})
++
++#define ia64_cmpxchg4_rel(ptr, new, old)
\
++({
\
++ uint64_t ia64_intri_res;
\
++ asm volatile ("mov ar.ccv=%0;;" :: "rO"(old));
\
++ asm volatile ("cmpxchg4.rel %0=[%1],%2,ar.ccv":
\
++ "=r"(ia64_intri_res) : "r"(ptr), "r"(new) :
"memory"); \
++ ia64_intri_res;
\
++})
++
++#define ia64_cmpxchg8_acq(ptr, new, old)
\
++({
\
++ uint64_t ia64_intri_res;
\
++ asm volatile ("mov ar.ccv=%0;;" :: "rO"(old));
\
++ asm volatile ("cmpxchg8.acq %0=[%1],%2,ar.ccv":
\
++ "=r"(ia64_intri_res) : "r"(ptr), "r"(new) :
"memory"); \
++ ia64_intri_res;
\
++})
++
++#define ia64_cmpxchg8_rel(ptr, new, old)
\
++({
\
++ uint64_t ia64_intri_res;
\
++ asm volatile ("mov ar.ccv=%0;;" :: "rO"(old));
\
++
\
++ asm volatile ("cmpxchg8.rel %0=[%1],%2,ar.ccv":
\
++ "=r"(ia64_intri_res) : "r"(ptr), "r"(new) :
"memory"); \
++ ia64_intri_res;
\
++})
++
++#define ia64_srlz_i() asm volatile (";; srlz.i ;;" ::: "memory")
++#define ia64_srlz_d() asm volatile (";; srlz.d" ::: "memory");
++#define __ia64_fc(addr) asm volatile ("fc %0" :: "r"(addr) : "memory")
++#define ia64_sync_i() asm volatile (";; sync.i" ::: "memory")
++
++register unsigned long ia64_r13 asm ("r13") __attribute_used__;
++#define __ia64_getreg(regnum)
\
++({
\
++ uint64_t ia64_intri_res;
\
++
\
++ switch (regnum) {
\
++ case _IA64_REG_GP:
\
++ asm volatile ("mov %0=gp" : "=r"(ia64_intri_res));
\
++ break;
\
++ case _IA64_REG_IP:
\
++ asm volatile ("mov %0=ip" : "=r"(ia64_intri_res));
\
++ break;
\
++ case _IA64_REG_PSR:
\
++ asm volatile ("mov %0=psr" : "=r"(ia64_intri_res));
\
++ break;
\
++ case _IA64_REG_TP: /* for current() */
\
++ ia64_intri_res = ia64_r13;
\
++ break;
\
++ case _IA64_REG_AR_KR0 ... _IA64_REG_AR_EC:
\
++ asm volatile ("mov %0=ar%1" : "=r" (ia64_intri_res)
\
++ : "i"(regnum - _IA64_REG_AR_KR0));
\
++ break;
\
++ case _IA64_REG_CR_DCR ... _IA64_REG_CR_LRR1:
\
++ asm volatile ("mov %0=cr%1" : "=r" (ia64_intri_res)
\
++ : "i" (regnum - _IA64_REG_CR_DCR));
\
++ break;
\
++ case _IA64_REG_SP:
\
++ asm volatile ("mov %0=sp" : "=r" (ia64_intri_res));
\
++ break;
\
++ default:
\
++ ia64_bad_param_for_getreg();
\
++ break;
\
++ }
\
++ ia64_intri_res;
\
++})
++
++#endif /* __INTEL_COMPILER */
++#endif /* IA64_INTRINSIC_H */
diff -r 4e7318b0c1e0 -r 21918b22746e tools/ioemu/patches/qemu-init-vgabios
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/tools/ioemu/patches/qemu-init-vgabios Wed Jul 26 10:49:32 2006 -0600
@@ -0,0 +1,141 @@
+Index: ioemu/hw/vga.c
+===================================================================
+--- ioemu.orig/hw/vga.c 2006-07-26 15:16:41.955609165 +0100
++++ ioemu/hw/vga.c 2006-07-26 15:17:16.910802283 +0100
+@@ -1669,6 +1669,136 @@
+ }
+ }
+
++/* do the same job as vgabios before vgabios get ready - yeah */
++void vga_bios_init(VGAState *s)
++{
++ uint8_t palette_model[192] = {
++ 0, 0, 0, 0, 0, 170, 0, 170,
++ 0, 0, 170, 170, 170, 0, 0, 170,
++ 0, 170, 170, 85, 0, 170, 170, 170,
++ 85, 85, 85, 85, 85, 255, 85, 255,
++ 85, 85, 255, 255, 255, 85, 85, 255,
++ 85, 255, 255, 255, 85, 255, 255, 255,
++ 0, 21, 0, 0, 21, 42, 0, 63,
++ 0, 0, 63, 42, 42, 21, 0, 42,
++ 21, 42, 42, 63, 0, 42, 63, 42,
++ 0, 21, 21, 0, 21, 63, 0, 63,
++ 21, 0, 63, 63, 42, 21, 21, 42,
++ 21, 63, 42, 63, 21, 42, 63, 63,
++ 21, 0, 0, 21, 0, 42, 21, 42,
++ 0, 21, 42, 42, 63, 0, 0, 63,
++ 0, 42, 63, 42, 0, 63, 42, 42,
++ 21, 0, 21, 21, 0, 63, 21, 42,
++ 21, 21, 42, 63, 63, 0, 21, 63,
++ 0, 63, 63, 42, 21, 63, 42, 63,
++ 21, 21, 0, 21, 21, 42, 21, 63,
++ 0, 21, 63, 42, 63, 21, 0, 63,
++ 21, 42, 63, 63, 0, 63, 63, 42,
++ 21, 21, 21, 21, 21, 63, 21, 63,
++ 21, 21, 63, 63, 63, 21, 21, 63,
++ 21, 63, 63, 63, 21, 63, 63, 63
++ };
++
++ s->latch = 0;
++
++ s->sr_index = 3;
++ s->sr[0] = 3;
++ s->sr[1] = 0;
++ s->sr[2] = 3;
++ s->sr[3] = 0;
++ s->sr[4] = 2;
++ s->sr[5] = 0;
++ s->sr[6] = 0;
++ s->sr[7] = 0;
++
++ s->gr_index = 5;
++ s->gr[0] = 0;
++ s->gr[1] = 0;
++ s->gr[2] = 0;
++ s->gr[3] = 0;
++ s->gr[4] = 0;
++ s->gr[5] = 16;
++ s->gr[6] = 14;
++ s->gr[7] = 15;
++ s->gr[8] = 255;
++
++ /* changed by out 0x03c0 */
++ s->ar_index = 32;
++ s->ar[0] = 0;
++ s->ar[1] = 1;
++ s->ar[2] = 2;
++ s->ar[3] = 3;
++ s->ar[4] = 4;
++ s->ar[5] = 5;
++ s->ar[6] = 6;
++ s->ar[7] = 7;
++ s->ar[8] = 8;
++ s->ar[9] = 9;
++ s->ar[10] = 10;
++ s->ar[11] = 11;
++ s->ar[12] = 12;
++ s->ar[13] = 13;
++ s->ar[14] = 14;
++ s->ar[15] = 15;
++ s->ar[16] = 12;
++ s->ar[17] = 0;
++ s->ar[18] = 15;
++ s->ar[19] = 8;
++ s->ar[20] = 0;
++
++ s->ar_flip_flop = 1;
++
++ s->cr_index = 15;
++ s->cr[0] = 95;
++ s->cr[1] = 79;
++ s->cr[2] = 80;
++ s->cr[3] = 130;
++ s->cr[4] = 85;
++ s->cr[5] = 129;
++ s->cr[6] = 191;
++ s->cr[7] = 31;
++ s->cr[8] = 0;
++ s->cr[9] = 79;
++ s->cr[10] = 14;
++ s->cr[11] = 15;
++ s->cr[12] = 0;
++ s->cr[13] = 0;
++ s->cr[14] = 5;
++ s->cr[15] = 160;
++ s->cr[16] = 156;
++ s->cr[17] = 142;
++ s->cr[18] = 143;
++ s->cr[19] = 40;
++ s->cr[20] = 31;
++ s->cr[21] = 150;
++ s->cr[22] = 185;
++ s->cr[23] = 163;
++ s->cr[24] = 255;
++
++ s->msr = 103;
++ s->fcr = 0;
++ s->st00 = 0;
++ s->st01 = 0;
++
++ /* dac_* & palette will be initialized by os through out 0x03c8 &
++ * out 0c03c9(1:3) */
++ s->dac_state = 0;
++ s->dac_sub_index = 0;
++ s->dac_read_index = 0;
++ s->dac_write_index = 16;
++ s->dac_cache[0] = 255;
++ s->dac_cache[1] = 255;
++ s->dac_cache[2] = 255;
++
++ /* palette */
++ memcpy(s->palette, palette_model, 192);
++
++ s->bank_offset = 0;
++ s->graphic_mode = -1;
++
++ /* TODO: add vbe support if enabled */
++}
++
+ void vga_common_init(VGAState *s, DisplayState *ds, uint8_t *vga_ram_base,
+ unsigned long vga_ram_offset, int vga_ram_size)
+ {
diff -r 4e7318b0c1e0 -r 21918b22746e tools/ioemu/patches/vnc-access-monitor-vt
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/tools/ioemu/patches/vnc-access-monitor-vt Wed Jul 26 10:49:32 2006 -0600
@@ -0,0 +1,112 @@
+Index: ioemu/vnc.c
+===================================================================
+--- ioemu.orig/vnc.c 2006-07-26 14:33:57.906165040 +0100
++++ ioemu/vnc.c 2006-07-26 14:44:09.972552689 +0100
+@@ -32,6 +32,10 @@
+ #include "vnc_keysym.h"
+ #include "keymaps.c"
+
++#define XK_MISCELLANY
++#define XK_LATIN1
++#include <X11/keysymdef.h>
++
+ typedef struct Buffer
+ {
+ size_t capacity;
+@@ -64,6 +68,7 @@
+ Buffer output;
+ Buffer input;
+ kbd_layout_t *kbd_layout;
++ int ctl_keys; /* Ctrl+Alt starts calibration */
+
+ VncReadEvent *read_handler;
+ size_t read_handler_expect;
+@@ -679,16 +684,80 @@
+
+ static void do_key_event(VncState *vs, int down, uint32_t sym)
+ {
+- int keycode;
++ sym &= 0xFFFF;
+
+- keycode = keysym2scancode(vs->kbd_layout, sym & 0xFFFF);
++ if (is_graphic_console()) {
++ int keycode;
+
+- if (keycode & 0x80)
+- kbd_put_keycode(0xe0);
+- if (down)
+- kbd_put_keycode(keycode & 0x7f);
+- else
+- kbd_put_keycode(keycode | 0x80);
++ keycode = keysym2scancode(vs->kbd_layout, sym);
++ if (keycode & 0x80)
++ kbd_put_keycode(0xe0);
++ if (down)
++ kbd_put_keycode(keycode & 0x7f);
++ else
++ kbd_put_keycode(keycode | 0x80);
++ } else if (down) {
++ int qemu_keysym = 0;
++
++ if (sym <= 128) /* normal ascii */
++ qemu_keysym = sym;
++ else {
++ switch (sym) {
++ case XK_Up: qemu_keysym = QEMU_KEY_UP; break;
++ case XK_Down: qemu_keysym = QEMU_KEY_DOWN; break;
++ case XK_Left: qemu_keysym = QEMU_KEY_LEFT; break;
++ case XK_Right: qemu_keysym = QEMU_KEY_RIGHT; break;
++ case XK_Home: qemu_keysym = QEMU_KEY_HOME; break;
++ case XK_End: qemu_keysym = QEMU_KEY_END; break;
++ case XK_Page_Up: qemu_keysym = QEMU_KEY_PAGEUP; break;
++ case XK_Page_Down: qemu_keysym = QEMU_KEY_PAGEDOWN; break;
++ case XK_BackSpace: qemu_keysym = QEMU_KEY_BACKSPACE; break;
++ case XK_Delete: qemu_keysym = QEMU_KEY_DELETE; break;
++ case XK_Return:
++ case XK_Linefeed: qemu_keysym = sym; break;
++ default: break;
++ }
++ }
++ if (qemu_keysym != 0)
++ kbd_put_keysym(qemu_keysym);
++ }
++
++ if (down) {
++ switch (sym) {
++ case XK_Control_L:
++ vs->ctl_keys |= 1;
++ break;
++
++ case XK_Alt_L:
++ vs->ctl_keys |= 2;
++ break;
++
++ default:
++ break;
++ }
++ } else {
++ switch (sym) {
++ case XK_Control_L:
++ vs->ctl_keys &= ~1;
++ break;
++
++ case XK_Alt_L:
++ vs->ctl_keys &= ~2;
++ break;
++
++ case XK_1 ... XK_9:
++ if ((vs->ctl_keys & 3) != 3)
++ break;
++
++ console_select(sym - XK_1);
++ if (is_graphic_console()) {
++ /* tell the vga console to redisplay itself */
++ vga_hw_invalidate();
++ vnc_dpy_update(vs->ds, 0, 0, vs->ds->width, vs->ds->height);
++ }
++ break;
++ }
++ }
+ }
+
+ static void key_event(VncState *vs, int down, uint32_t sym)
diff -r 4e7318b0c1e0 -r 21918b22746e tools/ioemu/patches/vnc-title-domain-name
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/tools/ioemu/patches/vnc-title-domain-name Wed Jul 26 10:49:32 2006 -0600
@@ -0,0 +1,25 @@
+Index: ioemu/vnc.c
+===================================================================
+--- ioemu.orig/vnc.c 2006-07-26 14:23:52.426074956 +0100
++++ ioemu/vnc.c 2006-07-26 14:24:15.210558295 +0100
+@@ -850,6 +850,7 @@
+
+ static int protocol_client_init(VncState *vs, char *data, size_t len)
+ {
++ size_t l;
+ char pad[3] = { 0, 0, 0 };
+
+ vs->width = vs->ds->width;
+@@ -886,8 +887,10 @@
+
+ vnc_write(vs, pad, 3); /* padding */
+
+- vnc_write_u32(vs, 4);
+- vnc_write(vs, "QEMU", 4);
++ l = strlen(domain_name);
++ vnc_write_u32(vs, l);
++ vnc_write(vs, domain_name, l);
++
+ vnc_flush(vs);
+
+ vnc_read_when(vs, protocol_client_msg, 1);
diff -r 4e7318b0c1e0 -r 21918b22746e xen/include/asm-ia64/perfc_defn.h
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/xen/include/asm-ia64/perfc_defn.h Wed Jul 26 10:49:32 2006 -0600
@@ -0,0 +1,1 @@
+/* This file is empty. */
diff -r 4e7318b0c1e0 -r 21918b22746e xen/include/asm-x86/perfc_defn.h
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/xen/include/asm-x86/perfc_defn.h Wed Jul 26 10:49:32 2006 -0600
@@ -0,0 +1,147 @@
+/* This file is legitimately included multiple times. */
+/*#ifndef __XEN_PERFC_DEFN_H__*/
+/*#define __XEN_PERFC_DEFN_H__*/
+
+#define PERFC_MAX_PT_UPDATES 64
+#define PERFC_PT_UPDATES_BUCKET_SIZE 3
+PERFCOUNTER_ARRAY(wpt_updates, "writable pt updates",
+ PERFC_MAX_PT_UPDATES)
+PERFCOUNTER_ARRAY(bpt_updates, "batched pt updates",
+ PERFC_MAX_PT_UPDATES)
+PERFCOUNTER_ARRAY(l1_entries_checked, "l1 entries checked",
+ PERFC_MAX_PT_UPDATES)
+PERFCOUNTER_ARRAY(shm_l2_updates, "shadow mode L2 pt updates",
+ PERFC_MAX_PT_UPDATES)
+PERFCOUNTER_ARRAY(shm_hl2_updates, "shadow mode HL2 pt updates",
+ PERFC_MAX_PT_UPDATES)
+#if defined(CONFIG_X86_64) || defined(CONFIG_X86_PAE)
+PERFCOUNTER_ARRAY(shm_l3_updates, "shadow mode L3 pt updates",
+ PERFC_MAX_PT_UPDATES)
+PERFCOUNTER_ARRAY(shm_l4_updates, "shadow mode L4 pt updates",
+ PERFC_MAX_PT_UPDATES)
+#endif
+PERFCOUNTER_ARRAY(snapshot_copies, "entries copied per snapshot",
+ PERFC_MAX_PT_UPDATES)
+
+PERFCOUNTER_ARRAY(exceptions, "exceptions", 32)
+
+#define VMX_PERF_EXIT_REASON_SIZE 44
+#define VMX_PERF_VECTOR_SIZE 0x20
+PERFCOUNTER_ARRAY(vmexits, "vmexits", VMX_PERF_EXIT_REASON_SIZE)
+PERFCOUNTER_ARRAY(cause_vector, "cause vector", VMX_PERF_VECTOR_SIZE)
+
+#define SVM_PERF_EXIT_REASON_SIZE (1+136)
+PERFCOUNTER_ARRAY(svmexits, "SVMexits", SVM_PERF_EXIT_REASON_SIZE)
+
+PERFCOUNTER_CPU(seg_fixups, "segmentation fixups")
+
+PERFCOUNTER_CPU(apic_timer, "apic timer interrupts")
+PERFCOUNTER_CPU(timer_max, "timer max error (ns)")
+
+PERFCOUNTER_CPU(domain_page_tlb_flush, "domain page tlb flushes")
+
+PERFCOUNTER_CPU(calls_to_mmu_update, "calls_to_mmu_update")
+PERFCOUNTER_CPU(num_page_updates, "num_page_updates")
+PERFCOUNTER_CPU(calls_to_update_va, "calls_to_update_va_map")
+PERFCOUNTER_CPU(page_faults, "page faults")
+PERFCOUNTER_CPU(copy_user_faults, "copy_user faults")
+
+PERFCOUNTER_CPU(shadow_fault_calls, "calls to shadow_fault")
+PERFCOUNTER_CPU(shadow_fault_bail_pde_not_present,
+ "sf bailed due to pde not present")
+PERFCOUNTER_CPU(shadow_fault_bail_pte_not_present,
+ "sf bailed due to pte not present")
+PERFCOUNTER_CPU(shadow_fault_bail_ro_mapping,
+ "sf bailed due to a ro mapping")
+PERFCOUNTER_CPU(shadow_fault_fixed, "sf fixed the pgfault")
+PERFCOUNTER_CPU(write_fault_bail, "sf bailed due to write_fault")
+PERFCOUNTER_CPU(read_fault_bail, "sf bailed due to read_fault")
+
+PERFCOUNTER_CPU(map_domain_page_count, "map_domain_page count")
+PERFCOUNTER_CPU(ptwr_emulations, "writable pt emulations")
+
+#if defined(CONFIG_X86_64) || defined(CONFIG_X86_PAE)
+PERFCOUNTER_CPU(shadow_l4_table_count, "shadow_l4_table count")
+PERFCOUNTER_CPU(shadow_l3_table_count, "shadow_l3_table count")
+#endif
+PERFCOUNTER_CPU(shadow_l2_table_count, "shadow_l2_table count")
+PERFCOUNTER_CPU(shadow_l1_table_count, "shadow_l1_table count")
+PERFCOUNTER_CPU(unshadow_table_count, "unshadow_table count")
+PERFCOUNTER_CPU(shadow_fixup_count, "shadow_fixup count")
+PERFCOUNTER_CPU(shadow_update_va_fail1, "shadow_update_va_fail1")
+PERFCOUNTER_CPU(shadow_update_va_fail2, "shadow_update_va_fail2")
+
+/* STATUS counters do not reset when 'P' is hit */
+#if defined(CONFIG_X86_64) || defined(CONFIG_X86_PAE)
+PERFSTATUS(shadow_l4_pages, "current # shadow L4 pages")
+PERFSTATUS(shadow_l3_pages, "current # shadow L3 pages")
+#endif
+PERFSTATUS(shadow_l2_pages, "current # shadow L2 pages")
+PERFSTATUS(shadow_l1_pages, "current # shadow L1 pages")
+PERFSTATUS(hl2_table_pages, "current # hl2 pages")
+PERFSTATUS(snapshot_pages, "current # fshadow snapshot pages")
+PERFSTATUS(writable_pte_predictions, "# writable pte predictions")
+PERFSTATUS(free_l1_pages, "current # free shadow L1 pages")
+
+PERFCOUNTER_CPU(check_pagetable, "calls to check_pagetable")
+PERFCOUNTER_CPU(check_all_pagetables, "calls to check_all_pagetables")
+
+PERFCOUNTER_CPU(shadow_hl2_table_count, "shadow_hl2_table count")
+PERFCOUNTER_CPU(shadow_set_l1e_force_map, "shadow_set_l1e forced to map l1")
+PERFCOUNTER_CPU(shadow_set_l1e_unlinked, "shadow_set_l1e found unlinked l1")
+PERFCOUNTER_CPU(shadow_set_l1e_fail, "shadow_set_l1e failed (no sl1)")
+#if defined(CONFIG_X86_64) || defined(CONFIG_X86_PAE)
+PERFCOUNTER_CPU(shadow_set_l2e_force_map, "shadow_set_l2e forced to map l2")
+PERFCOUNTER_CPU(shadow_set_l3e_force_map, "shadow_set_l3e forced to map l3")
+#endif
+PERFCOUNTER_CPU(shadow_invlpg_faults, "shadow_invlpg's get_user faulted")
+PERFCOUNTER_CPU(unshadow_l2_count, "unpinned L2 count")
+
+PERFCOUNTER_CPU(shadow_status_shortcut, "fastpath miss on shadow cache")
+PERFCOUNTER_CPU(shadow_status_calls, "calls to shadow_status")
+PERFCOUNTER_CPU(shadow_status_miss, "missed shadow cache")
+PERFCOUNTER_CPU(shadow_status_hit_head, "hits on head of bucket")
+PERFCOUNTER_CPU(shadow_max_type, "calls to shadow_max_type")
+
+PERFCOUNTER_CPU(shadow_sync_all, "calls to shadow_sync_all")
+PERFCOUNTER_CPU(shadow_sync_va, "calls to shadow_sync_va")
+PERFCOUNTER_CPU(resync_l1, "resync L1 page")
+PERFCOUNTER_CPU(resync_l2, "resync L2 page")
+#if defined(CONFIG_X86_64) || defined(CONFIG_X86_PAE)
+PERFCOUNTER_CPU(resync_l3, "resync L3 page")
+PERFCOUNTER_CPU(resync_l4, "resync L4 page")
+#endif
+PERFCOUNTER_CPU(resync_hl2, "resync HL2 page")
+PERFCOUNTER_CPU(shadow_make_snapshot, "snapshots created")
+PERFCOUNTER_CPU(shadow_mark_mfn_out_of_sync_calls,
+ "calls to shadow_mk_out_of_sync")
+PERFCOUNTER_CPU(shadow_out_of_sync_calls, "calls to shadow_out_of_sync")
+PERFCOUNTER_CPU(snapshot_entry_matches_calls, "calls to ss_entry_matches")
+PERFCOUNTER_CPU(snapshot_entry_matches_true, "ss_entry_matches returns true")
+
+PERFCOUNTER_CPU(validate_pte_calls, "calls to validate_pte_change")
+PERFCOUNTER_CPU(validate_pte_changes1, "validate_pte makes changes1")
+PERFCOUNTER_CPU(validate_pte_changes2, "validate_pte makes changes2")
+PERFCOUNTER_CPU(validate_pte_changes3, "validate_pte makes changes3")
+PERFCOUNTER_CPU(validate_pte_changes4, "validate_pte makes changes4")
+PERFCOUNTER_CPU(validate_pde_calls, "calls to validate_pde_change")
+PERFCOUNTER_CPU(validate_pde_changes, "validate_pde makes changes")
+PERFCOUNTER_CPU(shadow_get_page_fail, "shadow_get_page_from_l1e fails")
+PERFCOUNTER_CPU(validate_hl2e_calls, "calls to validate_hl2e_change")
+PERFCOUNTER_CPU(validate_hl2e_changes, "validate_hl2e makes changes")
+#if defined(CONFIG_X86_64) || defined(CONFIG_X86_PAE)
+PERFCOUNTER_CPU(validate_entry_changes, "validate_entry changes")
+#endif
+PERFCOUNTER_CPU(exception_fixed, "pre-exception fixed")
+PERFCOUNTER_CPU(get_mfn_from_gpfn_foreign, "calls to
get_mfn_from_gpfn_foreign")
+PERFCOUNTER_CPU(remove_all_access, "calls to remove_all_access")
+PERFCOUNTER_CPU(remove_write_access, "calls to remove_write_access")
+PERFCOUNTER_CPU(remove_write_access_easy, "easy outs of remove_write_access")
+PERFCOUNTER_CPU(remove_write_no_work, "no work in remove_write_access")
+PERFCOUNTER_CPU(remove_write_not_writable, "remove_write non-writable page")
+PERFCOUNTER_CPU(remove_write_fast_exit, "remove_write hit predicted entry")
+PERFCOUNTER_CPU(remove_write_predicted, "remove_write predict hit&exit")
+PERFCOUNTER_CPU(remove_write_bad_prediction, "remove_write bad prediction")
+PERFCOUNTER_CPU(update_hl2e_invlpg, "update_hl2e calls invlpg")
+
+/*#endif*/ /* __XEN_PERFC_DEFN_H__ */
_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog
|