This commit is contained in:
parent
39a4f201bc
commit
759005f5a4
51
13574-win2k-mouse.patch
Normal file
51
13574-win2k-mouse.patch
Normal file
@ -0,0 +1,51 @@
|
|||||||
|
# HG changeset patch
|
||||||
|
# User kfraser@localhost.localdomain
|
||||||
|
# Date 1169635472 0
|
||||||
|
# Node ID b064775fba7d838c99bcf11ca4fec6127e0e8792
|
||||||
|
# Parent c9ac0bace498d1c25f07df95b88d8f8e89168514
|
||||||
|
[QEMU] Clear TD status field explicitly when it's fetched.
|
||||||
|
|
||||||
|
In current Qemu-dm, UHC will set some status bits of TD in status
|
||||||
|
updating stage, but never process the status bit if relevant condition
|
||||||
|
does not occur, leaving it as it is. When a TD is fetched with some
|
||||||
|
status bits are set to 1, it will return to Guest OS with these bits
|
||||||
|
set to 1 even this TD is executed successfully. Some Windows OS,
|
||||||
|
e.g. Windows 2000, will check status bits of TD in UHC interrupt
|
||||||
|
routine, treat it as a unsuccessful one if some status bits are set to
|
||||||
|
1 and discard the data. Other Windows OS just check USBSTS of UHC,
|
||||||
|
ignoring status field of TD unless the value of USBSTS indicates
|
||||||
|
occurrence of error.
|
||||||
|
|
||||||
|
With this patch, USB mouse/tablet in Windows 2000 works correctly.
|
||||||
|
|
||||||
|
Signed-off-by: Xinmei Huang <xinmei.huang@intel.com>
|
||||||
|
|
||||||
|
Index: xen-3.0.4-testing/tools/ioemu/hw/usb-uhci.c
|
||||||
|
===================================================================
|
||||||
|
--- xen-3.0.4-testing.orig/tools/ioemu/hw/usb-uhci.c
|
||||||
|
+++ xen-3.0.4-testing/tools/ioemu/hw/usb-uhci.c
|
||||||
|
@@ -43,9 +43,15 @@
|
||||||
|
#define TD_CTRL_IOC (1 << 24)
|
||||||
|
#define TD_CTRL_ACTIVE (1 << 23)
|
||||||
|
#define TD_CTRL_STALL (1 << 22)
|
||||||
|
+#define TD_CTRL_BUFFER (1 << 21)
|
||||||
|
#define TD_CTRL_BABBLE (1 << 20)
|
||||||
|
#define TD_CTRL_NAK (1 << 19)
|
||||||
|
#define TD_CTRL_TIMEOUT (1 << 18)
|
||||||
|
+#define TD_CTRL_BITSTUFF \
|
||||||
|
+ (1 << 17)
|
||||||
|
+#define TD_CTRL_MASK \
|
||||||
|
+ (TD_CTRL_BITSTUFF | TD_CTRL_TIMEOUT | TD_CTRL_NAK \
|
||||||
|
+ | TD_CTRL_BABBLE | TD_CTRL_BUFFER | TD_CTRL_STALL)
|
||||||
|
|
||||||
|
#define UHCI_PORT_RESET (1 << 9)
|
||||||
|
#define UHCI_PORT_LSDA (1 << 8)
|
||||||
|
@@ -428,6 +434,8 @@ static int uhci_handle_td(UHCIState *s,
|
||||||
|
ret = 1;
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
+ /* Clear TD's status field explicitly */
|
||||||
|
+ td->ctrl = td->ctrl & (~TD_CTRL_MASK);
|
||||||
|
|
||||||
|
/* TD is active */
|
||||||
|
max_len = ((td->token >> 21) + 1) & 0x7ff;
|
42
13786_xenapi.patch
Normal file
42
13786_xenapi.patch
Normal file
@ -0,0 +1,42 @@
|
|||||||
|
# HG changeset patch
|
||||||
|
# User Ewan Mellor <ewan@xensource.com>
|
||||||
|
# Date 1170356417 0
|
||||||
|
# Node ID a357bed2daf8096bb5c682d454a2b3af652fc73f
|
||||||
|
# Parent 23bf61e72279682f46342d8c01977bed63ceb5be
|
||||||
|
Make the string->string map and int->float map allocation functions set the
|
||||||
|
map size on allocation.
|
||||||
|
|
||||||
|
Signed-off-by: Ewan Mellor <ewan@xensource.com>
|
||||||
|
|
||||||
|
diff -r 23bf61e72279 -r a357bed2daf8 tools/libxen/src/xen_int_float_map.c
|
||||||
|
--- a/tools/libxen/src/xen_int_float_map.c Thu Feb 01 18:45:50 2007 +0000
|
||||||
|
+++ b/tools/libxen/src/xen_int_float_map.c Thu Feb 01 19:00:17 2007 +0000
|
||||||
|
@@ -25,8 +25,10 @@ xen_int_float_map *
|
||||||
|
xen_int_float_map *
|
||||||
|
xen_int_float_map_alloc(size_t size)
|
||||||
|
{
|
||||||
|
- return calloc(1, sizeof(xen_int_float_map) +
|
||||||
|
- size * sizeof(struct xen_int_float_map_contents));
|
||||||
|
+ xen_int_float_map *result = calloc(1, sizeof(xen_int_float_map) +
|
||||||
|
+ size * sizeof(struct xen_int_float_map_contents));
|
||||||
|
+ result->size = size;
|
||||||
|
+ return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
diff -r 23bf61e72279 -r a357bed2daf8 tools/libxen/src/xen_string_string_map.c
|
||||||
|
--- a/tools/libxen/src/xen_string_string_map.c Thu Feb 01 18:45:50 2007 +0000
|
||||||
|
+++ b/tools/libxen/src/xen_string_string_map.c Thu Feb 01 19:00:17 2007 +0000
|
||||||
|
@@ -25,8 +25,10 @@ xen_string_string_map *
|
||||||
|
xen_string_string_map *
|
||||||
|
xen_string_string_map_alloc(size_t size)
|
||||||
|
{
|
||||||
|
- return calloc(1, sizeof(xen_string_string_map) +
|
||||||
|
- size * sizeof(struct xen_string_string_map_contents));
|
||||||
|
+ xen_string_string_map *result = calloc(1, sizeof(xen_string_string_map) +
|
||||||
|
+ size * sizeof(struct xen_string_string_map_contents));
|
||||||
|
+ result->size = size;
|
||||||
|
+ return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
326
14022_xenapi.patch
Normal file
326
14022_xenapi.patch
Normal file
@ -0,0 +1,326 @@
|
|||||||
|
# HG changeset patch
|
||||||
|
# User Ewan Mellor <ewan@xensource.com>
|
||||||
|
# Date 1172000304 0
|
||||||
|
# Node ID 988b90c6b4f3b628430a73b5562e65c859953173
|
||||||
|
# Parent be35eed950da0f39d3d41f738f340707e01c4cbd
|
||||||
|
Added Console.other_config to the docs (Xend already has this).
|
||||||
|
|
||||||
|
Signed-off-by: Ewan Mellor <ewan@xensource.com>
|
||||||
|
|
||||||
|
diff -r be35eed950da -r 988b90c6b4f3 docs/xen-api/xenapi-datamodel.tex
|
||||||
|
--- a/docs/xen-api/xenapi-datamodel.tex Tue Feb 20 19:23:28 2007 +0000
|
||||||
|
+++ b/docs/xen-api/xenapi-datamodel.tex Tue Feb 20 19:38:24 2007 +0000
|
||||||
|
@@ -10887,6 +10887,7 @@ Quals & Field & Type & Description \\
|
||||||
|
$\mathit{RO}_\mathit{run}$ & {\tt protocol} & console\_protocol & the protocol used by this console \\
|
||||||
|
$\mathit{RO}_\mathit{run}$ & {\tt location} & string & URI for the console service \\
|
||||||
|
$\mathit{RO}_\mathit{run}$ & {\tt VM} & VM ref & VM to which this console is attached \\
|
||||||
|
+$\mathit{RW}$ & {\tt other\_config} & (string $\rightarrow$ string) Map & additional configuration \\
|
||||||
|
\hline
|
||||||
|
\end{longtable}
|
||||||
|
\subsection{Additional RPCs associated with class: console}
|
||||||
|
@@ -11015,6 +11016,145 @@ VM ref
|
||||||
|
|
||||||
|
|
||||||
|
value of the field
|
||||||
|
+\vspace{0.3cm}
|
||||||
|
+\vspace{0.3cm}
|
||||||
|
+\vspace{0.3cm}
|
||||||
|
+\subsubsection{RPC name:~get\_other\_config}
|
||||||
|
+
|
||||||
|
+{\bf Overview:}
|
||||||
|
+Get the other\_config field of the given console.
|
||||||
|
+
|
||||||
|
+ \noindent {\bf Signature:}
|
||||||
|
+\begin{verbatim} ((string -> string) Map) get_other_config (session_id s, console ref self)\end{verbatim}
|
||||||
|
+
|
||||||
|
+
|
||||||
|
+\noindent{\bf Arguments:}
|
||||||
|
+
|
||||||
|
+
|
||||||
|
+\vspace{0.3cm}
|
||||||
|
+\begin{tabular}{|c|c|p{7cm}|}
|
||||||
|
+ \hline
|
||||||
|
+{\bf type} & {\bf name} & {\bf description} \\ \hline
|
||||||
|
+{\tt console ref } & self & reference to the object \\ \hline
|
||||||
|
+
|
||||||
|
+\end{tabular}
|
||||||
|
+
|
||||||
|
+\vspace{0.3cm}
|
||||||
|
+
|
||||||
|
+ \noindent {\bf Return Type:}
|
||||||
|
+{\tt
|
||||||
|
+(string $\rightarrow$ string) Map
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+
|
||||||
|
+value of the field
|
||||||
|
+\vspace{0.3cm}
|
||||||
|
+\vspace{0.3cm}
|
||||||
|
+\vspace{0.3cm}
|
||||||
|
+\subsubsection{RPC name:~set\_other\_config}
|
||||||
|
+
|
||||||
|
+{\bf Overview:}
|
||||||
|
+Set the other\_config field of the given console.
|
||||||
|
+
|
||||||
|
+ \noindent {\bf Signature:}
|
||||||
|
+\begin{verbatim} void set_other_config (session_id s, console ref self, (string -> string) Map value)\end{verbatim}
|
||||||
|
+
|
||||||
|
+
|
||||||
|
+\noindent{\bf Arguments:}
|
||||||
|
+
|
||||||
|
+
|
||||||
|
+\vspace{0.3cm}
|
||||||
|
+\begin{tabular}{|c|c|p{7cm}|}
|
||||||
|
+ \hline
|
||||||
|
+{\bf type} & {\bf name} & {\bf description} \\ \hline
|
||||||
|
+{\tt console ref } & self & reference to the object \\ \hline
|
||||||
|
+
|
||||||
|
+{\tt (string $\rightarrow$ string) Map } & value & New value to set \\ \hline
|
||||||
|
+
|
||||||
|
+\end{tabular}
|
||||||
|
+
|
||||||
|
+\vspace{0.3cm}
|
||||||
|
+
|
||||||
|
+ \noindent {\bf Return Type:}
|
||||||
|
+{\tt
|
||||||
|
+void
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+
|
||||||
|
+
|
||||||
|
+\vspace{0.3cm}
|
||||||
|
+\vspace{0.3cm}
|
||||||
|
+\vspace{0.3cm}
|
||||||
|
+\subsubsection{RPC name:~add\_to\_other\_config}
|
||||||
|
+
|
||||||
|
+{\bf Overview:}
|
||||||
|
+Add the given key-value pair to the other\_config field of the given
|
||||||
|
+console.
|
||||||
|
+
|
||||||
|
+ \noindent {\bf Signature:}
|
||||||
|
+\begin{verbatim} void add_to_other_config (session_id s, console ref self, string key, string value)\end{verbatim}
|
||||||
|
+
|
||||||
|
+
|
||||||
|
+\noindent{\bf Arguments:}
|
||||||
|
+
|
||||||
|
+
|
||||||
|
+\vspace{0.3cm}
|
||||||
|
+\begin{tabular}{|c|c|p{7cm}|}
|
||||||
|
+ \hline
|
||||||
|
+{\bf type} & {\bf name} & {\bf description} \\ \hline
|
||||||
|
+{\tt console ref } & self & reference to the object \\ \hline
|
||||||
|
+
|
||||||
|
+{\tt string } & key & Key to add \\ \hline
|
||||||
|
+
|
||||||
|
+{\tt string } & value & Value to add \\ \hline
|
||||||
|
+
|
||||||
|
+\end{tabular}
|
||||||
|
+
|
||||||
|
+\vspace{0.3cm}
|
||||||
|
+
|
||||||
|
+ \noindent {\bf Return Type:}
|
||||||
|
+{\tt
|
||||||
|
+void
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+
|
||||||
|
+
|
||||||
|
+\vspace{0.3cm}
|
||||||
|
+\vspace{0.3cm}
|
||||||
|
+\vspace{0.3cm}
|
||||||
|
+\subsubsection{RPC name:~remove\_from\_other\_config}
|
||||||
|
+
|
||||||
|
+{\bf Overview:}
|
||||||
|
+Remove the given key and its corresponding value from the other\_config
|
||||||
|
+field of the given console. If the key is not in that Map, then do
|
||||||
|
+nothing.
|
||||||
|
+
|
||||||
|
+ \noindent {\bf Signature:}
|
||||||
|
+\begin{verbatim} void remove_from_other_config (session_id s, console ref self, string key)\end{verbatim}
|
||||||
|
+
|
||||||
|
+
|
||||||
|
+\noindent{\bf Arguments:}
|
||||||
|
+
|
||||||
|
+
|
||||||
|
+\vspace{0.3cm}
|
||||||
|
+\begin{tabular}{|c|c|p{7cm}|}
|
||||||
|
+ \hline
|
||||||
|
+{\bf type} & {\bf name} & {\bf description} \\ \hline
|
||||||
|
+{\tt console ref } & self & reference to the object \\ \hline
|
||||||
|
+
|
||||||
|
+{\tt string } & key & Key to remove \\ \hline
|
||||||
|
+
|
||||||
|
+\end{tabular}
|
||||||
|
+
|
||||||
|
+\vspace{0.3cm}
|
||||||
|
+
|
||||||
|
+ \noindent {\bf Return Type:}
|
||||||
|
+{\tt
|
||||||
|
+void
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+
|
||||||
|
+
|
||||||
|
\vspace{0.3cm}
|
||||||
|
\vspace{0.3cm}
|
||||||
|
\vspace{0.3cm}
|
||||||
|
diff -r be35eed950da -r 988b90c6b4f3 tools/libxen/include/xen_console.h
|
||||||
|
--- a/tools/libxen/include/xen_console.h Tue Feb 20 19:23:28 2007 +0000
|
||||||
|
+++ b/tools/libxen/include/xen_console.h Tue Feb 20 19:38:24 2007 +0000
|
||||||
|
@@ -22,6 +22,7 @@
|
||||||
|
#include "xen_common.h"
|
||||||
|
#include "xen_console_decl.h"
|
||||||
|
#include "xen_console_protocol.h"
|
||||||
|
+#include "xen_string_string_map.h"
|
||||||
|
#include "xen_vm_decl.h"
|
||||||
|
|
||||||
|
|
||||||
|
@@ -67,6 +68,7 @@ typedef struct xen_console_record
|
||||||
|
enum xen_console_protocol protocol;
|
||||||
|
char *location;
|
||||||
|
struct xen_vm_record_opt *vm;
|
||||||
|
+ xen_string_string_map *other_config;
|
||||||
|
} xen_console_record;
|
||||||
|
|
||||||
|
/**
|
||||||
|
@@ -204,4 +206,35 @@ xen_console_get_vm(xen_session *session,
|
||||||
|
xen_console_get_vm(xen_session *session, xen_vm *result, xen_console console);
|
||||||
|
|
||||||
|
|
||||||
|
+/**
|
||||||
|
+ * Get the other_config field of the given console.
|
||||||
|
+ */
|
||||||
|
+extern bool
|
||||||
|
+xen_console_get_other_config(xen_session *session, xen_string_string_map **result, xen_console console);
|
||||||
|
+
|
||||||
|
+
|
||||||
|
+/**
|
||||||
|
+ * Set the other_config field of the given console.
|
||||||
|
+ */
|
||||||
|
+extern bool
|
||||||
|
+xen_console_set_other_config(xen_session *session, xen_console console, xen_string_string_map *other_config);
|
||||||
|
+
|
||||||
|
+
|
||||||
|
+/**
|
||||||
|
+ * Add the given key-value pair to the other_config field of the given
|
||||||
|
+ * console.
|
||||||
|
+ */
|
||||||
|
+extern bool
|
||||||
|
+xen_console_add_to_other_config(xen_session *session, xen_console console, char *key, char *value);
|
||||||
|
+
|
||||||
|
+
|
||||||
|
+/**
|
||||||
|
+ * Remove the given key and its corresponding value from the
|
||||||
|
+ * other_config field of the given console. If the key is not in that Map,
|
||||||
|
+ * then do nothing.
|
||||||
|
+ */
|
||||||
|
+extern bool
|
||||||
|
+xen_console_remove_from_other_config(xen_session *session, xen_console console, char *key);
|
||||||
|
+
|
||||||
|
+
|
||||||
|
#endif
|
||||||
|
diff -r be35eed950da -r 988b90c6b4f3 tools/libxen/src/xen_console.c
|
||||||
|
--- a/tools/libxen/src/xen_console.c Tue Feb 20 19:23:28 2007 +0000
|
||||||
|
+++ b/tools/libxen/src/xen_console.c Tue Feb 20 19:38:24 2007 +0000
|
||||||
|
@@ -24,6 +24,7 @@
|
||||||
|
#include "xen_console.h"
|
||||||
|
#include "xen_console_protocol_internal.h"
|
||||||
|
#include "xen_internal.h"
|
||||||
|
+#include "xen_string_string_map.h"
|
||||||
|
#include "xen_vm.h"
|
||||||
|
|
||||||
|
|
||||||
|
@@ -49,7 +50,10 @@ static const struct_member xen_console_r
|
||||||
|
.offset = offsetof(xen_console_record, location) },
|
||||||
|
{ .key = "VM",
|
||||||
|
.type = &abstract_type_ref,
|
||||||
|
- .offset = offsetof(xen_console_record, vm) }
|
||||||
|
+ .offset = offsetof(xen_console_record, vm) },
|
||||||
|
+ { .key = "other_config",
|
||||||
|
+ .type = &abstract_type_string_string_map,
|
||||||
|
+ .offset = offsetof(xen_console_record, other_config) }
|
||||||
|
};
|
||||||
|
|
||||||
|
const abstract_type xen_console_record_abstract_type_ =
|
||||||
|
@@ -73,6 +77,7 @@ xen_console_record_free(xen_console_reco
|
||||||
|
free(record->uuid);
|
||||||
|
free(record->location);
|
||||||
|
xen_vm_record_opt_free(record->vm);
|
||||||
|
+ xen_string_string_map_free(record->other_config);
|
||||||
|
free(record);
|
||||||
|
}
|
||||||
|
|
||||||
|
@@ -198,6 +203,73 @@ xen_console_get_vm(xen_session *session,
|
||||||
|
|
||||||
|
|
||||||
|
bool
|
||||||
|
+xen_console_get_other_config(xen_session *session, xen_string_string_map **result, xen_console console)
|
||||||
|
+{
|
||||||
|
+ abstract_value param_values[] =
|
||||||
|
+ {
|
||||||
|
+ { .type = &abstract_type_string,
|
||||||
|
+ .u.string_val = console }
|
||||||
|
+ };
|
||||||
|
+
|
||||||
|
+ abstract_type result_type = abstract_type_string_string_map;
|
||||||
|
+
|
||||||
|
+ *result = NULL;
|
||||||
|
+ XEN_CALL_("console.get_other_config");
|
||||||
|
+ return session->ok;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+
|
||||||
|
+bool
|
||||||
|
+xen_console_set_other_config(xen_session *session, xen_console console, xen_string_string_map *other_config)
|
||||||
|
+{
|
||||||
|
+ abstract_value param_values[] =
|
||||||
|
+ {
|
||||||
|
+ { .type = &abstract_type_string,
|
||||||
|
+ .u.string_val = console },
|
||||||
|
+ { .type = &abstract_type_string_string_map,
|
||||||
|
+ .u.set_val = (arbitrary_set *)other_config }
|
||||||
|
+ };
|
||||||
|
+
|
||||||
|
+ xen_call_(session, "console.set_other_config", param_values, 2, NULL, NULL);
|
||||||
|
+ return session->ok;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+
|
||||||
|
+bool
|
||||||
|
+xen_console_add_to_other_config(xen_session *session, xen_console console, char *key, char *value)
|
||||||
|
+{
|
||||||
|
+ abstract_value param_values[] =
|
||||||
|
+ {
|
||||||
|
+ { .type = &abstract_type_string,
|
||||||
|
+ .u.string_val = console },
|
||||||
|
+ { .type = &abstract_type_string,
|
||||||
|
+ .u.string_val = key },
|
||||||
|
+ { .type = &abstract_type_string,
|
||||||
|
+ .u.string_val = value }
|
||||||
|
+ };
|
||||||
|
+
|
||||||
|
+ xen_call_(session, "console.add_to_other_config", param_values, 3, NULL, NULL);
|
||||||
|
+ return session->ok;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+
|
||||||
|
+bool
|
||||||
|
+xen_console_remove_from_other_config(xen_session *session, xen_console console, char *key)
|
||||||
|
+{
|
||||||
|
+ abstract_value param_values[] =
|
||||||
|
+ {
|
||||||
|
+ { .type = &abstract_type_string,
|
||||||
|
+ .u.string_val = console },
|
||||||
|
+ { .type = &abstract_type_string,
|
||||||
|
+ .u.string_val = key }
|
||||||
|
+ };
|
||||||
|
+
|
||||||
|
+ xen_call_(session, "console.remove_from_other_config", param_values, 2, NULL, NULL);
|
||||||
|
+ return session->ok;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+
|
||||||
|
+bool
|
||||||
|
xen_console_get_uuid(xen_session *session, char **result, xen_console console)
|
||||||
|
{
|
||||||
|
*result = session->ok ? xen_strdup_((char *)console) : NULL;
|
793
32on64-migrate.patch
Normal file
793
32on64-migrate.patch
Normal file
@ -0,0 +1,793 @@
|
|||||||
|
# HG changeset 13995 patch
|
||||||
|
# User Emmanuel Ackaouy <ack@xensource.com>
|
||||||
|
# Node ID 9c2e6f8f3aa7a4e2a1f3af3204789568edf975cd
|
||||||
|
# Parent 0b882c911b885a51308eee3ec80bc4a5a230d7ce
|
||||||
|
[XEN] 32on64 shadowing / live migration support for PV PAE compat guests
|
||||||
|
PAE compat guests on 64bit hypervisors are shadowed
|
||||||
|
using 4-on-4 with special handling for the top level
|
||||||
|
L4 page and the L2E M2P mappings.
|
||||||
|
|
||||||
|
Signed-off-by: Emmanuel Ackaouy <ack@xensource.com>
|
||||||
|
|
||||||
|
Index: 2007-02-20/xen/arch/x86/mm.c
|
||||||
|
===================================================================
|
||||||
|
--- 2007-02-20.orig/xen/arch/x86/mm.c 2007-02-20 11:01:49.000000000 +0100
|
||||||
|
+++ 2007-02-20/xen/arch/x86/mm.c 2007-02-20 11:01:50.000000000 +0100
|
||||||
|
@@ -1095,7 +1095,7 @@ static int alloc_l4_table(struct page_in
|
||||||
|
|
||||||
|
for ( i = 0; i < L4_PAGETABLE_ENTRIES; i++ )
|
||||||
|
{
|
||||||
|
- if ( is_guest_l4_slot(i) &&
|
||||||
|
+ if ( is_guest_l4_slot(d, i) &&
|
||||||
|
unlikely(!get_page_from_l4e(pl4e[i], pfn, d)) )
|
||||||
|
goto fail;
|
||||||
|
|
||||||
|
@@ -1123,7 +1123,7 @@ static int alloc_l4_table(struct page_in
|
||||||
|
fail:
|
||||||
|
MEM_LOG("Failure in alloc_l4_table: entry %d", i);
|
||||||
|
while ( i-- > 0 )
|
||||||
|
- if ( is_guest_l4_slot(i) )
|
||||||
|
+ if ( is_guest_l4_slot(d, i) )
|
||||||
|
put_page_from_l4e(pl4e[i], pfn);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
@@ -1198,12 +1198,13 @@ static void free_l3_table(struct page_in
|
||||||
|
|
||||||
|
static void free_l4_table(struct page_info *page)
|
||||||
|
{
|
||||||
|
+ struct domain *d = page_get_owner(page);
|
||||||
|
unsigned long pfn = page_to_mfn(page);
|
||||||
|
l4_pgentry_t *pl4e = page_to_virt(page);
|
||||||
|
int i;
|
||||||
|
|
||||||
|
for ( i = 0; i < L4_PAGETABLE_ENTRIES; i++ )
|
||||||
|
- if ( is_guest_l4_slot(i) )
|
||||||
|
+ if ( is_guest_l4_slot(d, i) )
|
||||||
|
put_page_from_l4e(pl4e[i], pfn);
|
||||||
|
}
|
||||||
|
|
||||||
|
@@ -1463,13 +1464,14 @@ static int mod_l3_entry(l3_pgentry_t *pl
|
||||||
|
#if CONFIG_PAGING_LEVELS >= 4
|
||||||
|
|
||||||
|
/* Update the L4 entry at pl4e to new value nl4e. pl4e is within frame pfn. */
|
||||||
|
-static int mod_l4_entry(l4_pgentry_t *pl4e,
|
||||||
|
+static int mod_l4_entry(struct domain *d,
|
||||||
|
+ l4_pgentry_t *pl4e,
|
||||||
|
l4_pgentry_t nl4e,
|
||||||
|
unsigned long pfn)
|
||||||
|
{
|
||||||
|
l4_pgentry_t ol4e;
|
||||||
|
|
||||||
|
- if ( unlikely(!is_guest_l4_slot(pgentry_ptr_to_slot(pl4e))) )
|
||||||
|
+ if ( unlikely(!is_guest_l4_slot(d, pgentry_ptr_to_slot(pl4e))) )
|
||||||
|
{
|
||||||
|
MEM_LOG("Illegal L4 update attempt in Xen-private area %p", pl4e);
|
||||||
|
return 0;
|
||||||
|
@@ -1771,8 +1773,10 @@ int new_guest_cr3(unsigned long mfn)
|
||||||
|
put_page(mfn_to_page(old_base_mfn));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
- okay = mod_l4_entry(__va(pagetable_get_paddr(v->arch.guest_table)),
|
||||||
|
- l4e, 0);
|
||||||
|
+ okay = mod_l4_entry(d,
|
||||||
|
+ __va(pagetable_get_paddr(v->arch.guest_table)),
|
||||||
|
+ l4e,
|
||||||
|
+ pagetable_get_pfn(v->arch.guest_table));
|
||||||
|
if ( unlikely(!okay) )
|
||||||
|
{
|
||||||
|
MEM_LOG("Error while installing new compat baseptr %lx", mfn);
|
||||||
|
@@ -2360,7 +2364,7 @@ int do_mmu_update(
|
||||||
|
if ( !IS_COMPAT(FOREIGNDOM) )
|
||||||
|
{
|
||||||
|
l4_pgentry_t l4e = l4e_from_intpte(req.val);
|
||||||
|
- okay = mod_l4_entry(va, l4e, mfn);
|
||||||
|
+ okay = mod_l4_entry(d, va, l4e, mfn);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
#endif
|
||||||
|
Index: 2007-02-20/xen/arch/x86/mm/shadow/common.c
|
||||||
|
===================================================================
|
||||||
|
--- 2007-02-20.orig/xen/arch/x86/mm/shadow/common.c 2007-02-20 11:01:43.000000000 +0100
|
||||||
|
+++ 2007-02-20/xen/arch/x86/mm/shadow/common.c 2007-02-20 11:02:03.000000000 +0100
|
||||||
|
@@ -472,7 +472,11 @@ void shadow_demote(struct vcpu *v, mfn_t
|
||||||
|
{
|
||||||
|
struct page_info *page = mfn_to_page(gmfn);
|
||||||
|
|
||||||
|
- ASSERT(test_bit(_PGC_page_table, &page->count_info));
|
||||||
|
+#ifdef CONFIG_COMPAT
|
||||||
|
+ if ( !IS_COMPAT(v->domain) || type != SH_type_l4_64_shadow )
|
||||||
|
+#endif
|
||||||
|
+ ASSERT(test_bit(_PGC_page_table, &page->count_info));
|
||||||
|
+
|
||||||
|
ASSERT(test_bit(type, &page->shadow_flags));
|
||||||
|
|
||||||
|
clear_bit(type, &page->shadow_flags);
|
||||||
|
@@ -555,6 +559,9 @@ __shadow_validate_guest_entry(struct vcp
|
||||||
|
if ( page->shadow_flags & SHF_L2_64 )
|
||||||
|
result |= SHADOW_INTERNAL_NAME(sh_map_and_validate_gl2e, 4, 4)
|
||||||
|
(v, gmfn, entry, size);
|
||||||
|
+ if ( page->shadow_flags & SHF_L2H_64 )
|
||||||
|
+ result |= SHADOW_INTERNAL_NAME(sh_map_and_validate_gl2he, 4, 4)
|
||||||
|
+ (v, gmfn, entry, size);
|
||||||
|
if ( page->shadow_flags & SHF_L3_64 )
|
||||||
|
result |= SHADOW_INTERNAL_NAME(sh_map_and_validate_gl3e, 4, 4)
|
||||||
|
(v, gmfn, entry, size);
|
||||||
|
@@ -563,7 +570,7 @@ __shadow_validate_guest_entry(struct vcp
|
||||||
|
(v, gmfn, entry, size);
|
||||||
|
#else /* 32-bit/PAE hypervisor does not support 64-bit guests */
|
||||||
|
ASSERT((page->shadow_flags
|
||||||
|
- & (SHF_L4_64|SHF_L3_64|SHF_L2_64|SHF_L1_64)) == 0);
|
||||||
|
+ & (SHF_L4_64|SHF_L3_64|SHF_L2H_64|SHF_L2_64|SHF_L1_64)) == 0);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
return result;
|
||||||
|
@@ -674,7 +681,7 @@ static inline u32
|
||||||
|
shadow_order(unsigned int shadow_type)
|
||||||
|
{
|
||||||
|
#if CONFIG_PAGING_LEVELS > 2
|
||||||
|
- static const u32 type_to_order[16] = {
|
||||||
|
+ static const u32 type_to_order[SH_type_unused] = {
|
||||||
|
0, /* SH_type_none */
|
||||||
|
1, /* SH_type_l1_32_shadow */
|
||||||
|
1, /* SH_type_fl1_32_shadow */
|
||||||
|
@@ -686,12 +693,13 @@ shadow_order(unsigned int shadow_type)
|
||||||
|
0, /* SH_type_l1_64_shadow */
|
||||||
|
0, /* SH_type_fl1_64_shadow */
|
||||||
|
0, /* SH_type_l2_64_shadow */
|
||||||
|
+ 0, /* SH_type_l2h_64_shadow */
|
||||||
|
0, /* SH_type_l3_64_shadow */
|
||||||
|
0, /* SH_type_l4_64_shadow */
|
||||||
|
2, /* SH_type_p2m_table */
|
||||||
|
0 /* SH_type_monitor_table */
|
||||||
|
};
|
||||||
|
- ASSERT(shadow_type < 16);
|
||||||
|
+ ASSERT(shadow_type < SH_type_unused);
|
||||||
|
return type_to_order[shadow_type];
|
||||||
|
#else /* 32-bit Xen only ever shadows 32-bit guests on 32-bit shadows. */
|
||||||
|
return 0;
|
||||||
|
@@ -1849,6 +1857,9 @@ void sh_destroy_shadow(struct vcpu *v, m
|
||||||
|
t == SH_type_fl1_pae_shadow ||
|
||||||
|
t == SH_type_fl1_64_shadow ||
|
||||||
|
t == SH_type_monitor_table ||
|
||||||
|
+#ifdef CONFIG_COMPAT
|
||||||
|
+ (IS_COMPAT(v->domain) && t == SH_type_l4_64_shadow) ||
|
||||||
|
+#endif
|
||||||
|
(page_get_owner(mfn_to_page(_mfn(sp->backpointer)))
|
||||||
|
== v->domain));
|
||||||
|
|
||||||
|
@@ -1890,6 +1901,8 @@ void sh_destroy_shadow(struct vcpu *v, m
|
||||||
|
case SH_type_fl1_64_shadow:
|
||||||
|
SHADOW_INTERNAL_NAME(sh_destroy_l1_shadow, 4, 4)(v, smfn);
|
||||||
|
break;
|
||||||
|
+ case SH_type_l2h_64_shadow:
|
||||||
|
+ ASSERT( IS_COMPAT(v->domain) );
|
||||||
|
case SH_type_l2_64_shadow:
|
||||||
|
SHADOW_INTERNAL_NAME(sh_destroy_l2_shadow, 4, 4)(v, smfn);
|
||||||
|
break;
|
||||||
|
@@ -1918,7 +1931,7 @@ int shadow_remove_write_access(struct vc
|
||||||
|
unsigned long fault_addr)
|
||||||
|
{
|
||||||
|
/* Dispatch table for getting per-type functions */
|
||||||
|
- static hash_callback_t callbacks[16] = {
|
||||||
|
+ static hash_callback_t callbacks[SH_type_unused] = {
|
||||||
|
NULL, /* none */
|
||||||
|
#if CONFIG_PAGING_LEVELS == 2
|
||||||
|
SHADOW_INTERNAL_NAME(sh_remove_write_access,2,2), /* l1_32 */
|
||||||
|
@@ -1945,6 +1958,7 @@ int shadow_remove_write_access(struct vc
|
||||||
|
NULL, /* fl1_64 */
|
||||||
|
#endif
|
||||||
|
NULL, /* l2_64 */
|
||||||
|
+ NULL, /* l2h_64 */
|
||||||
|
NULL, /* l3_64 */
|
||||||
|
NULL, /* l4_64 */
|
||||||
|
NULL, /* p2m */
|
||||||
|
@@ -2107,7 +2121,7 @@ int shadow_remove_all_mappings(struct vc
|
||||||
|
int expected_count;
|
||||||
|
|
||||||
|
/* Dispatch table for getting per-type functions */
|
||||||
|
- static hash_callback_t callbacks[16] = {
|
||||||
|
+ static hash_callback_t callbacks[SH_type_unused] = {
|
||||||
|
NULL, /* none */
|
||||||
|
#if CONFIG_PAGING_LEVELS == 2
|
||||||
|
SHADOW_INTERNAL_NAME(sh_remove_all_mappings,2,2), /* l1_32 */
|
||||||
|
@@ -2134,6 +2148,7 @@ int shadow_remove_all_mappings(struct vc
|
||||||
|
NULL, /* fl1_64 */
|
||||||
|
#endif
|
||||||
|
NULL, /* l2_64 */
|
||||||
|
+ NULL, /* l2h_64 */
|
||||||
|
NULL, /* l3_64 */
|
||||||
|
NULL, /* l4_64 */
|
||||||
|
NULL, /* p2m */
|
||||||
|
@@ -2233,6 +2248,7 @@ static int sh_remove_shadow_via_pointer(
|
||||||
|
#if CONFIG_PAGING_LEVELS >= 4
|
||||||
|
case SH_type_l1_64_shadow:
|
||||||
|
case SH_type_l2_64_shadow:
|
||||||
|
+ case SH_type_l2h_64_shadow:
|
||||||
|
case SH_type_l3_64_shadow:
|
||||||
|
case SH_type_l4_64_shadow:
|
||||||
|
SHADOW_INTERNAL_NAME(sh_clear_shadow_entry,4,4)(v, vaddr, pmfn);
|
||||||
|
@@ -2267,7 +2283,7 @@ void sh_remove_shadows(struct vcpu *v, m
|
||||||
|
|
||||||
|
/* Dispatch table for getting per-type functions: each level must
|
||||||
|
* be called with the function to remove a lower-level shadow. */
|
||||||
|
- static hash_callback_t callbacks[16] = {
|
||||||
|
+ static hash_callback_t callbacks[SH_type_unused] = {
|
||||||
|
NULL, /* none */
|
||||||
|
NULL, /* l1_32 */
|
||||||
|
NULL, /* fl1_32 */
|
||||||
|
@@ -2289,10 +2305,12 @@ void sh_remove_shadows(struct vcpu *v, m
|
||||||
|
NULL, /* fl1_64 */
|
||||||
|
#if CONFIG_PAGING_LEVELS >= 4
|
||||||
|
SHADOW_INTERNAL_NAME(sh_remove_l1_shadow,4,4), /* l2_64 */
|
||||||
|
+ SHADOW_INTERNAL_NAME(sh_remove_l1_shadow,4,4), /* l2h_64 */
|
||||||
|
SHADOW_INTERNAL_NAME(sh_remove_l2_shadow,4,4), /* l3_64 */
|
||||||
|
SHADOW_INTERNAL_NAME(sh_remove_l3_shadow,4,4), /* l4_64 */
|
||||||
|
#else
|
||||||
|
NULL, /* l2_64 */
|
||||||
|
+ NULL, /* l2h_64 */
|
||||||
|
NULL, /* l3_64 */
|
||||||
|
NULL, /* l4_64 */
|
||||||
|
#endif
|
||||||
|
@@ -2301,7 +2319,7 @@ void sh_remove_shadows(struct vcpu *v, m
|
||||||
|
};
|
||||||
|
|
||||||
|
/* Another lookup table, for choosing which mask to use */
|
||||||
|
- static unsigned int masks[16] = {
|
||||||
|
+ static unsigned int masks[SH_type_unused] = {
|
||||||
|
0, /* none */
|
||||||
|
1 << SH_type_l2_32_shadow, /* l1_32 */
|
||||||
|
0, /* fl1_32 */
|
||||||
|
@@ -2311,9 +2329,11 @@ void sh_remove_shadows(struct vcpu *v, m
|
||||||
|
0, /* fl1_pae */
|
||||||
|
0, /* l2_pae */
|
||||||
|
0, /* l2h_pae */
|
||||||
|
- 1 << SH_type_l2_64_shadow, /* l1_64 */
|
||||||
|
+ ((1 << SH_type_l2h_64_shadow)
|
||||||
|
+ | (1 << SH_type_l2_64_shadow)), /* l1_64 */
|
||||||
|
0, /* fl1_64 */
|
||||||
|
1 << SH_type_l3_64_shadow, /* l2_64 */
|
||||||
|
+ 1 << SH_type_l3_64_shadow, /* l2h_64 */
|
||||||
|
1 << SH_type_l4_64_shadow, /* l3_64 */
|
||||||
|
0, /* l4_64 */
|
||||||
|
0, /* p2m */
|
||||||
|
@@ -2360,6 +2380,7 @@ void sh_remove_shadows(struct vcpu *v, m
|
||||||
|
#if CONFIG_PAGING_LEVELS >= 4
|
||||||
|
if ( sh_flags & SHF_L1_64 ) DO_UNSHADOW(SH_type_l1_64_shadow);
|
||||||
|
if ( sh_flags & SHF_L2_64 ) DO_UNSHADOW(SH_type_l2_64_shadow);
|
||||||
|
+ if ( sh_flags & SHF_L2H_64 ) DO_UNSHADOW(SH_type_l2h_64_shadow);
|
||||||
|
if ( sh_flags & SHF_L3_64 ) DO_UNSHADOW(SH_type_l3_64_shadow);
|
||||||
|
if ( sh_flags & SHF_L4_64 ) DO_UNSHADOW(SH_type_l4_64_shadow);
|
||||||
|
#endif
|
||||||
|
@@ -2426,10 +2447,7 @@ void sh_update_paging_modes(struct vcpu
|
||||||
|
/// PV guest
|
||||||
|
///
|
||||||
|
#if CONFIG_PAGING_LEVELS == 4
|
||||||
|
- if ( pv_32bit_guest(v) )
|
||||||
|
- v->arch.shadow.mode = &SHADOW_INTERNAL_NAME(sh_paging_mode,3,3);
|
||||||
|
- else
|
||||||
|
- v->arch.shadow.mode = &SHADOW_INTERNAL_NAME(sh_paging_mode,4,4);
|
||||||
|
+ v->arch.shadow.mode = &SHADOW_INTERNAL_NAME(sh_paging_mode,4,4);
|
||||||
|
#elif CONFIG_PAGING_LEVELS == 3
|
||||||
|
v->arch.shadow.mode = &SHADOW_INTERNAL_NAME(sh_paging_mode,3,3);
|
||||||
|
#elif CONFIG_PAGING_LEVELS == 2
|
||||||
|
@@ -2938,6 +2956,11 @@ static int shadow_log_dirty_enable(struc
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
|
+#if (SHADOW_OPTIMIZATIONS & SHOPT_LINUX_L3_TOPLEVEL)
|
||||||
|
+ if ( IS_COMPAT(d) )
|
||||||
|
+ d->arch.shadow.opt_flags = SHOPT_LINUX_L3_TOPLEVEL;
|
||||||
|
+#endif
|
||||||
|
+
|
||||||
|
ret = sh_alloc_log_dirty_bitmap(d);
|
||||||
|
if ( ret != 0 )
|
||||||
|
{
|
||||||
|
@@ -3290,7 +3313,7 @@ int shadow_domctl(struct domain *d,
|
||||||
|
void shadow_audit_tables(struct vcpu *v)
|
||||||
|
{
|
||||||
|
/* Dispatch table for getting per-type functions */
|
||||||
|
- static hash_callback_t callbacks[16] = {
|
||||||
|
+ static hash_callback_t callbacks[SH_type_unused] = {
|
||||||
|
NULL, /* none */
|
||||||
|
#if CONFIG_PAGING_LEVELS == 2
|
||||||
|
SHADOW_INTERNAL_NAME(sh_audit_l1_table,2,2), /* l1_32 */
|
||||||
|
@@ -3308,6 +3331,7 @@ void shadow_audit_tables(struct vcpu *v)
|
||||||
|
SHADOW_INTERNAL_NAME(sh_audit_l1_table,4,4), /* l1_64 */
|
||||||
|
SHADOW_INTERNAL_NAME(sh_audit_fl1_table,4,4), /* fl1_64 */
|
||||||
|
SHADOW_INTERNAL_NAME(sh_audit_l2_table,4,4), /* l2_64 */
|
||||||
|
+ SHADOW_INTERNAL_NAME(sh_audit_l2_table,4,4), /* l2h_64 */
|
||||||
|
SHADOW_INTERNAL_NAME(sh_audit_l3_table,4,4), /* l3_64 */
|
||||||
|
SHADOW_INTERNAL_NAME(sh_audit_l4_table,4,4), /* l4_64 */
|
||||||
|
#endif /* CONFIG_PAGING_LEVELS >= 4 */
|
||||||
|
@@ -3330,7 +3354,7 @@ void shadow_audit_tables(struct vcpu *v)
|
||||||
|
case 3: mask = (SHF_L1_PAE|SHF_FL1_PAE|SHF_L2_PAE
|
||||||
|
|SHF_L2H_PAE); break;
|
||||||
|
case 4: mask = (SHF_L1_64|SHF_FL1_64|SHF_L2_64
|
||||||
|
- |SHF_L3_64|SHF_L4_64); break;
|
||||||
|
+ |SHF_L2H_64|SHF_L3_64|SHF_L4_64); break;
|
||||||
|
default: BUG();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Index: 2007-02-20/xen/arch/x86/mm/shadow/multi.c
|
||||||
|
===================================================================
|
||||||
|
--- 2007-02-20.orig/xen/arch/x86/mm/shadow/multi.c 2007-02-20 11:01:43.000000000 +0100
|
||||||
|
+++ 2007-02-20/xen/arch/x86/mm/shadow/multi.c 2007-02-20 11:01:50.000000000 +0100
|
||||||
|
@@ -162,8 +162,13 @@ set_shadow_status(struct vcpu *v, mfn_t
|
||||||
|
else
|
||||||
|
mfn_to_shadow_page(smfn)->logdirty = 0;
|
||||||
|
|
||||||
|
- res = get_page(mfn_to_page(gmfn), d);
|
||||||
|
- ASSERT(res == 1);
|
||||||
|
+#ifdef CONFIG_COMPAT
|
||||||
|
+ if ( !IS_COMPAT(d) || shadow_type != SH_type_l4_64_shadow )
|
||||||
|
+#endif
|
||||||
|
+ {
|
||||||
|
+ res = get_page(mfn_to_page(gmfn), d);
|
||||||
|
+ ASSERT(res == 1);
|
||||||
|
+ }
|
||||||
|
|
||||||
|
shadow_hash_insert(v, mfn_x(gmfn), shadow_type, smfn);
|
||||||
|
}
|
||||||
|
@@ -185,7 +190,10 @@ delete_shadow_status(struct vcpu *v, mfn
|
||||||
|
v->domain->domain_id, v->vcpu_id,
|
||||||
|
mfn_x(gmfn), shadow_type, mfn_x(smfn));
|
||||||
|
shadow_hash_delete(v, mfn_x(gmfn), shadow_type, smfn);
|
||||||
|
- put_page(mfn_to_page(gmfn));
|
||||||
|
+#ifdef CONFIG_COMPAT
|
||||||
|
+ if ( !IS_COMPAT(v->domain) || shadow_type != SH_type_l4_64_shadow )
|
||||||
|
+#endif
|
||||||
|
+ put_page(mfn_to_page(gmfn));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**************************************************************************/
|
||||||
|
@@ -764,7 +772,7 @@ _sh_propagate(struct vcpu *v,
|
||||||
|
// PV guests in 64-bit mode use two different page tables for user vs
|
||||||
|
// supervisor permissions, making the guest's _PAGE_USER bit irrelevant.
|
||||||
|
// It is always shadowed as present...
|
||||||
|
- if ( (GUEST_PAGING_LEVELS == 4) && !is_hvm_domain(d) )
|
||||||
|
+ if ( (GUEST_PAGING_LEVELS == 4) && !IS_COMPAT(d) && !is_hvm_domain(d) )
|
||||||
|
{
|
||||||
|
sflags |= _PAGE_USER;
|
||||||
|
}
|
||||||
|
@@ -1235,9 +1243,10 @@ do {
|
||||||
|
#if GUEST_PAGING_LEVELS == 2 && SHADOW_PAGING_LEVELS > 2
|
||||||
|
|
||||||
|
/* 32-bit l2 on PAE/64: four pages, touch every second entry, and avoid Xen */
|
||||||
|
-#define SHADOW_FOREACH_L2E(_sl2mfn, _sl2e, _gl2p, _done, _xen, _code) \
|
||||||
|
+#define SHADOW_FOREACH_L2E(_sl2mfn, _sl2e, _gl2p, _done, _dom, _code) \
|
||||||
|
do { \
|
||||||
|
int _i, _j, __done = 0; \
|
||||||
|
+ int _xen = !shadow_mode_external(_dom); \
|
||||||
|
ASSERT(mfn_to_shadow_page(_sl2mfn)->type == SH_type_l2_32_shadow); \
|
||||||
|
for ( _j = 0; _j < 4 && !__done; _j++ ) \
|
||||||
|
{ \
|
||||||
|
@@ -1261,9 +1270,10 @@ do {
|
||||||
|
#elif GUEST_PAGING_LEVELS == 2
|
||||||
|
|
||||||
|
/* 32-bit on 32-bit: avoid Xen entries */
|
||||||
|
-#define SHADOW_FOREACH_L2E(_sl2mfn, _sl2e, _gl2p, _done, _xen, _code) \
|
||||||
|
+#define SHADOW_FOREACH_L2E(_sl2mfn, _sl2e, _gl2p, _done, _dom, _code) \
|
||||||
|
do { \
|
||||||
|
int _i; \
|
||||||
|
+ int _xen = !shadow_mode_external(_dom); \
|
||||||
|
shadow_l2e_t *_sp = map_shadow_page((_sl2mfn)); \
|
||||||
|
ASSERT(mfn_to_shadow_page(_sl2mfn)->type == SH_type_l2_32_shadow); \
|
||||||
|
for ( _i = 0; _i < SHADOW_L2_PAGETABLE_ENTRIES; _i++ ) \
|
||||||
|
@@ -1283,9 +1293,10 @@ do {
|
||||||
|
#elif GUEST_PAGING_LEVELS == 3
|
||||||
|
|
||||||
|
/* PAE: if it's an l2h, don't touch Xen mappings */
|
||||||
|
-#define SHADOW_FOREACH_L2E(_sl2mfn, _sl2e, _gl2p, _done, _xen, _code) \
|
||||||
|
+#define SHADOW_FOREACH_L2E(_sl2mfn, _sl2e, _gl2p, _done, _dom, _code) \
|
||||||
|
do { \
|
||||||
|
int _i; \
|
||||||
|
+ int _xen = !shadow_mode_external(_dom); \
|
||||||
|
shadow_l2e_t *_sp = map_shadow_page((_sl2mfn)); \
|
||||||
|
ASSERT(mfn_to_shadow_page(_sl2mfn)->type == SH_type_l2_pae_shadow \
|
||||||
|
|| mfn_to_shadow_page(_sl2mfn)->type == SH_type_l2h_pae_shadow);\
|
||||||
|
@@ -1306,21 +1317,29 @@ do {
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
-/* 64-bit l2: touch all entries */
|
||||||
|
-#define SHADOW_FOREACH_L2E(_sl2mfn, _sl2e, _gl2p, _done, _xen, _code) \
|
||||||
|
-do { \
|
||||||
|
- int _i; \
|
||||||
|
- shadow_l2e_t *_sp = map_shadow_page((_sl2mfn)); \
|
||||||
|
- ASSERT(mfn_to_shadow_page(_sl2mfn)->type == SH_type_l2_64_shadow); \
|
||||||
|
- for ( _i = 0; _i < SHADOW_L2_PAGETABLE_ENTRIES; _i++ ) \
|
||||||
|
- { \
|
||||||
|
- (_sl2e) = _sp + _i; \
|
||||||
|
- if ( shadow_l2e_get_flags(*(_sl2e)) & _PAGE_PRESENT ) \
|
||||||
|
- {_code} \
|
||||||
|
- if ( _done ) break; \
|
||||||
|
- increment_ptr_to_guest_entry(_gl2p); \
|
||||||
|
- } \
|
||||||
|
- unmap_shadow_page(_sp); \
|
||||||
|
+/* 64-bit l2: touch all entries except for PAE compat guests. */
|
||||||
|
+#define SHADOW_FOREACH_L2E(_sl2mfn, _sl2e, _gl2p, _done, _dom, _code) \
|
||||||
|
+do { \
|
||||||
|
+ int _i; \
|
||||||
|
+ int _xen = !shadow_mode_external(_dom); \
|
||||||
|
+ shadow_l2e_t *_sp = map_shadow_page((_sl2mfn)); \
|
||||||
|
+ ASSERT(mfn_to_shadow_page(_sl2mfn)->type == SH_type_l2_64_shadow || \
|
||||||
|
+ mfn_to_shadow_page(_sl2mfn)->type == SH_type_l2h_64_shadow); \
|
||||||
|
+ for ( _i = 0; _i < SHADOW_L2_PAGETABLE_ENTRIES; _i++ ) \
|
||||||
|
+ { \
|
||||||
|
+ if ( (!(_xen)) \
|
||||||
|
+ || !IS_COMPAT(_dom) \
|
||||||
|
+ || mfn_to_shadow_page(_sl2mfn)->type != SH_type_l2h_64_shadow \
|
||||||
|
+ || (_i < COMPAT_L2_PAGETABLE_FIRST_XEN_SLOT(_dom)) ) \
|
||||||
|
+ { \
|
||||||
|
+ (_sl2e) = _sp + _i; \
|
||||||
|
+ if ( shadow_l2e_get_flags(*(_sl2e)) & _PAGE_PRESENT ) \
|
||||||
|
+ {_code} \
|
||||||
|
+ if ( _done ) break; \
|
||||||
|
+ increment_ptr_to_guest_entry(_gl2p); \
|
||||||
|
+ } \
|
||||||
|
+ } \
|
||||||
|
+ unmap_shadow_page(_sp); \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#endif /* different kinds of l2 */
|
||||||
|
@@ -1345,14 +1364,15 @@ do {
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
/* 64-bit l4: avoid Xen mappings */
|
||||||
|
-#define SHADOW_FOREACH_L4E(_sl4mfn, _sl4e, _gl4p, _done, _xen, _code) \
|
||||||
|
+#define SHADOW_FOREACH_L4E(_sl4mfn, _sl4e, _gl4p, _done, _dom, _code) \
|
||||||
|
do { \
|
||||||
|
- int _i; \
|
||||||
|
shadow_l4e_t *_sp = map_shadow_page((_sl4mfn)); \
|
||||||
|
+ int _xen = !shadow_mode_external(_dom); \
|
||||||
|
+ int _i; \
|
||||||
|
ASSERT(mfn_to_shadow_page(_sl4mfn)->type == SH_type_l4_64_shadow); \
|
||||||
|
for ( _i = 0; _i < SHADOW_L4_PAGETABLE_ENTRIES; _i++ ) \
|
||||||
|
{ \
|
||||||
|
- if ( (!(_xen)) || is_guest_l4_slot(_i) ) \
|
||||||
|
+ if ( (!(_xen)) || is_guest_l4_slot(_dom, _i) ) \
|
||||||
|
{ \
|
||||||
|
(_sl4e) = _sp + _i; \
|
||||||
|
if ( shadow_l4e_get_flags(*(_sl4e)) & _PAGE_PRESENT ) \
|
||||||
|
@@ -1419,17 +1439,25 @@ void sh_install_xen_entries_in_l4(struct
|
||||||
|
__PAGE_HYPERVISOR);
|
||||||
|
}
|
||||||
|
|
||||||
|
+ if ( IS_COMPAT(v->domain) )
|
||||||
|
+ {
|
||||||
|
+ /* install compat arg xlat entry */
|
||||||
|
+ sl4e[shadow_l4_table_offset(COMPAT_ARG_XLAT_VIRT_BASE)] =
|
||||||
|
+ shadow_l4e_from_mfn(
|
||||||
|
+ page_to_mfn(virt_to_page(d->arch.mm_arg_xlat_l3)),
|
||||||
|
+ __PAGE_HYPERVISOR);
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
sh_unmap_domain_page(sl4e);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
-#if (CONFIG_PAGING_LEVELS == 3 || defined(CONFIG_COMPAT)) && GUEST_PAGING_LEVELS == 3
|
||||||
|
+#if CONFIG_PAGING_LEVELS >= 3 && GUEST_PAGING_LEVELS >= 3
|
||||||
|
// For 3-on-3 PV guests, we need to make sure the xen mappings are in
|
||||||
|
// place, which means that we need to populate the l2h entry in the l3
|
||||||
|
// table.
|
||||||
|
|
||||||
|
-void sh_install_xen_entries_in_l2h(struct vcpu *v,
|
||||||
|
- mfn_t sl2hmfn)
|
||||||
|
+static void sh_install_xen_entries_in_l2h(struct vcpu *v, mfn_t sl2hmfn)
|
||||||
|
{
|
||||||
|
struct domain *d = v->domain;
|
||||||
|
shadow_l2e_t *sl2e;
|
||||||
|
@@ -1491,9 +1519,10 @@ void sh_install_xen_entries_in_l2h(struc
|
||||||
|
#else
|
||||||
|
|
||||||
|
/* Copy the common Xen mappings from the idle domain */
|
||||||
|
- memcpy(&sl2e[COMPAT_L2_PAGETABLE_FIRST_XEN_SLOT(d)],
|
||||||
|
- &compat_idle_pg_table_l2[l2_table_offset(HIRO_COMPAT_MPT_VIRT_START)],
|
||||||
|
- COMPAT_L2_PAGETABLE_XEN_SLOTS(d) * sizeof(*sl2e));
|
||||||
|
+ memcpy(
|
||||||
|
+ &sl2e[COMPAT_L2_PAGETABLE_FIRST_XEN_SLOT(d)],
|
||||||
|
+ &compat_idle_pg_table_l2[l2_table_offset(HIRO_COMPAT_MPT_VIRT_START)],
|
||||||
|
+ COMPAT_L2_PAGETABLE_XEN_SLOTS(d) * sizeof(*sl2e));
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
@@ -1619,8 +1648,11 @@ sh_make_shadow(struct vcpu *v, mfn_t gmf
|
||||||
|
case SH_type_l4_shadow:
|
||||||
|
sh_install_xen_entries_in_l4(v, gmfn, smfn); break;
|
||||||
|
#endif
|
||||||
|
-#if CONFIG_PAGING_LEVELS == 3 && GUEST_PAGING_LEVELS == 3
|
||||||
|
+#if CONFIG_PAGING_LEVELS >= 3 && GUEST_PAGING_LEVELS >= 3
|
||||||
|
case SH_type_l2h_shadow:
|
||||||
|
+#ifdef CONFIG_COMPAT
|
||||||
|
+ ASSERT( IS_COMPAT(v->domain) );
|
||||||
|
+#endif
|
||||||
|
sh_install_xen_entries_in_l2h(v, smfn); break;
|
||||||
|
#endif
|
||||||
|
#if CONFIG_PAGING_LEVELS == 2 && GUEST_PAGING_LEVELS == 2
|
||||||
|
@@ -1834,12 +1866,21 @@ static shadow_l2e_t * shadow_get_and_cre
|
||||||
|
{
|
||||||
|
int r;
|
||||||
|
shadow_l3e_t new_sl3e;
|
||||||
|
+ unsigned int t = SH_type_l2_shadow;
|
||||||
|
+
|
||||||
|
+#ifdef CONFIG_COMPAT
|
||||||
|
+ /* Tag compat L2 containing hypervisor (m2p) mappings */
|
||||||
|
+ if ( IS_COMPAT(v->domain) &&
|
||||||
|
+ guest_l4_table_offset(gw->va) == 0 &&
|
||||||
|
+ guest_l3_table_offset(gw->va) == 3 )
|
||||||
|
+ t = SH_type_l2h_shadow;
|
||||||
|
+#endif
|
||||||
|
/* No l2 shadow installed: find and install it. */
|
||||||
|
- *sl2mfn = get_shadow_status(v, gw->l2mfn, SH_type_l2_shadow);
|
||||||
|
+ *sl2mfn = get_shadow_status(v, gw->l2mfn, t);
|
||||||
|
if ( !mfn_valid(*sl2mfn) )
|
||||||
|
{
|
||||||
|
/* No l2 shadow of this page exists at all: make one. */
|
||||||
|
- *sl2mfn = sh_make_shadow(v, gw->l2mfn, SH_type_l2_shadow);
|
||||||
|
+ *sl2mfn = sh_make_shadow(v, gw->l2mfn, t);
|
||||||
|
}
|
||||||
|
/* Install the new sl2 table in the sl3e */
|
||||||
|
l3e_propagate_from_guest(v, gw->l3e, gw->l3mfn,
|
||||||
|
@@ -1960,7 +2001,6 @@ void sh_destroy_l4_shadow(struct vcpu *v
|
||||||
|
shadow_l4e_t *sl4e;
|
||||||
|
u32 t = mfn_to_shadow_page(smfn)->type;
|
||||||
|
mfn_t gmfn, sl4mfn;
|
||||||
|
- int xen_mappings;
|
||||||
|
|
||||||
|
SHADOW_DEBUG(DESTROY_SHADOW,
|
||||||
|
"%s(%05lx)\n", __func__, mfn_x(smfn));
|
||||||
|
@@ -1971,9 +2011,8 @@ void sh_destroy_l4_shadow(struct vcpu *v
|
||||||
|
delete_shadow_status(v, gmfn, t, smfn);
|
||||||
|
shadow_demote(v, gmfn, t);
|
||||||
|
/* Decrement refcounts of all the old entries */
|
||||||
|
- xen_mappings = (!shadow_mode_external(v->domain));
|
||||||
|
sl4mfn = smfn;
|
||||||
|
- SHADOW_FOREACH_L4E(sl4mfn, sl4e, 0, 0, xen_mappings, {
|
||||||
|
+ SHADOW_FOREACH_L4E(sl4mfn, sl4e, 0, 0, v->domain, {
|
||||||
|
if ( shadow_l4e_get_flags(*sl4e) & _PAGE_PRESENT )
|
||||||
|
{
|
||||||
|
sh_put_ref(v, shadow_l4e_get_mfn(*sl4e),
|
||||||
|
@@ -2021,12 +2060,15 @@ void sh_destroy_l2_shadow(struct vcpu *v
|
||||||
|
shadow_l2e_t *sl2e;
|
||||||
|
u32 t = mfn_to_shadow_page(smfn)->type;
|
||||||
|
mfn_t gmfn, sl2mfn;
|
||||||
|
- int xen_mappings;
|
||||||
|
|
||||||
|
SHADOW_DEBUG(DESTROY_SHADOW,
|
||||||
|
"%s(%05lx)\n", __func__, mfn_x(smfn));
|
||||||
|
- ASSERT(t == SH_type_l2_shadow
|
||||||
|
- || t == SH_type_l2h_pae_shadow);
|
||||||
|
+
|
||||||
|
+#if GUEST_PAGING_LEVELS >= 3
|
||||||
|
+ ASSERT(t == SH_type_l2_shadow || t == SH_type_l2h_shadow);
|
||||||
|
+#else
|
||||||
|
+ ASSERT(t == SH_type_l2_shadow);
|
||||||
|
+#endif
|
||||||
|
|
||||||
|
/* Record that the guest page isn't shadowed any more (in this type) */
|
||||||
|
gmfn = _mfn(mfn_to_shadow_page(smfn)->backpointer);
|
||||||
|
@@ -2035,11 +2077,7 @@ void sh_destroy_l2_shadow(struct vcpu *v
|
||||||
|
|
||||||
|
/* Decrement refcounts of all the old entries */
|
||||||
|
sl2mfn = smfn;
|
||||||
|
- xen_mappings = (!shadow_mode_external(v->domain) &&
|
||||||
|
- ((GUEST_PAGING_LEVELS == 2) ||
|
||||||
|
- ((GUEST_PAGING_LEVELS == 3) &&
|
||||||
|
- (t == SH_type_l2h_pae_shadow))));
|
||||||
|
- SHADOW_FOREACH_L2E(sl2mfn, sl2e, 0, 0, xen_mappings, {
|
||||||
|
+ SHADOW_FOREACH_L2E(sl2mfn, sl2e, 0, 0, v->domain, {
|
||||||
|
if ( shadow_l2e_get_flags(*sl2e) & _PAGE_PRESENT )
|
||||||
|
sh_put_ref(v, shadow_l2e_get_mfn(*sl2e),
|
||||||
|
(((paddr_t)mfn_x(sl2mfn)) << PAGE_SHIFT)
|
||||||
|
@@ -2140,8 +2178,7 @@ void sh_destroy_monitor_table(struct vcp
|
||||||
|
void sh_unhook_32b_mappings(struct vcpu *v, mfn_t sl2mfn)
|
||||||
|
{
|
||||||
|
shadow_l2e_t *sl2e;
|
||||||
|
- int xen_mappings = !shadow_mode_external(v->domain);
|
||||||
|
- SHADOW_FOREACH_L2E(sl2mfn, sl2e, 0, 0, xen_mappings, {
|
||||||
|
+ SHADOW_FOREACH_L2E(sl2mfn, sl2e, 0, 0, v->domain, {
|
||||||
|
(void) shadow_set_l2e(v, sl2e, shadow_l2e_empty(), sl2mfn);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
@@ -2152,8 +2189,7 @@ void sh_unhook_pae_mappings(struct vcpu
|
||||||
|
/* Walk a PAE l2 shadow, unhooking entries from all the subshadows */
|
||||||
|
{
|
||||||
|
shadow_l2e_t *sl2e;
|
||||||
|
- int xen_mappings = !shadow_mode_external(v->domain);
|
||||||
|
- SHADOW_FOREACH_L2E(sl2mfn, sl2e, 0, 0, xen_mappings, {
|
||||||
|
+ SHADOW_FOREACH_L2E(sl2mfn, sl2e, 0, 0, v->domain, {
|
||||||
|
(void) shadow_set_l2e(v, sl2e, shadow_l2e_empty(), sl2mfn);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
@@ -2163,8 +2199,7 @@ void sh_unhook_pae_mappings(struct vcpu
|
||||||
|
void sh_unhook_64b_mappings(struct vcpu *v, mfn_t sl4mfn)
|
||||||
|
{
|
||||||
|
shadow_l4e_t *sl4e;
|
||||||
|
- int xen_mappings = !shadow_mode_external(v->domain);
|
||||||
|
- SHADOW_FOREACH_L4E(sl4mfn, sl4e, 0, 0, xen_mappings, {
|
||||||
|
+ SHADOW_FOREACH_L4E(sl4mfn, sl4e, 0, 0, v->domain, {
|
||||||
|
(void) shadow_set_l4e(v, sl4e, shadow_l4e_empty(), sl4mfn);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
@@ -2210,7 +2245,7 @@ static int validate_gl4e(struct vcpu *v,
|
||||||
|
{
|
||||||
|
int shadow_index = (((unsigned long)sl4p & ~PAGE_MASK) /
|
||||||
|
sizeof(shadow_l4e_t));
|
||||||
|
- int reserved_xen_slot = !is_guest_l4_slot(shadow_index);
|
||||||
|
+ int reserved_xen_slot = !is_guest_l4_slot(v->domain, shadow_index);
|
||||||
|
|
||||||
|
if ( unlikely(reserved_xen_slot) )
|
||||||
|
{
|
||||||
|
@@ -2473,7 +2508,7 @@ int
|
||||||
|
sh_map_and_validate_gl2he(struct vcpu *v, mfn_t gl2mfn,
|
||||||
|
void *new_gl2p, u32 size)
|
||||||
|
{
|
||||||
|
-#if GUEST_PAGING_LEVELS == 3
|
||||||
|
+#if GUEST_PAGING_LEVELS >= 3
|
||||||
|
return sh_map_and_validate(v, gl2mfn, new_gl2p, size,
|
||||||
|
SH_type_l2h_shadow,
|
||||||
|
shadow_l2_index,
|
||||||
|
@@ -3350,7 +3385,12 @@ sh_set_toplevel_shadow(struct vcpu *v,
|
||||||
|
|
||||||
|
#if SHADOW_OPTIMIZATIONS & SHOPT_EARLY_UNSHADOW
|
||||||
|
/* Once again OK to unhook entries from this table if we see fork/exit */
|
||||||
|
- ASSERT(sh_mfn_is_a_page_table(gmfn));
|
||||||
|
+#if CONFIG_PAGING_LEVELS == 4
|
||||||
|
+ if ( IS_COMPAT(d) )
|
||||||
|
+ ASSERT(!sh_mfn_is_a_page_table(gmfn));
|
||||||
|
+ else
|
||||||
|
+#endif
|
||||||
|
+ ASSERT(sh_mfn_is_a_page_table(gmfn));
|
||||||
|
mfn_to_page(gmfn)->shadow_flags &= ~SHF_unhooked_mappings;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
@@ -3746,7 +3786,7 @@ void sh_clear_shadow_entry(struct vcpu *
|
||||||
|
case SH_type_l1_shadow:
|
||||||
|
(void) shadow_set_l1e(v, ep, shadow_l1e_empty(), smfn); break;
|
||||||
|
case SH_type_l2_shadow:
|
||||||
|
-#if GUEST_PAGING_LEVELS == 3
|
||||||
|
+#if GUEST_PAGING_LEVELS >= 3
|
||||||
|
case SH_type_l2h_shadow:
|
||||||
|
#endif
|
||||||
|
(void) shadow_set_l2e(v, ep, shadow_l2e_empty(), smfn); break;
|
||||||
|
@@ -3766,11 +3806,8 @@ int sh_remove_l1_shadow(struct vcpu *v,
|
||||||
|
shadow_l2e_t *sl2e;
|
||||||
|
int done = 0;
|
||||||
|
int flags;
|
||||||
|
-#if GUEST_PAGING_LEVELS != 4
|
||||||
|
- int xen_mappings = !shadow_mode_external(v->domain);
|
||||||
|
-#endif
|
||||||
|
|
||||||
|
- SHADOW_FOREACH_L2E(sl2mfn, sl2e, 0, done, xen_mappings,
|
||||||
|
+ SHADOW_FOREACH_L2E(sl2mfn, sl2e, 0, done, v->domain,
|
||||||
|
{
|
||||||
|
flags = shadow_l2e_get_flags(*sl2e);
|
||||||
|
if ( (flags & _PAGE_PRESENT)
|
||||||
|
@@ -3813,9 +3850,9 @@ int sh_remove_l3_shadow(struct vcpu *v,
|
||||||
|
{
|
||||||
|
shadow_l4e_t *sl4e;
|
||||||
|
int done = 0;
|
||||||
|
- int flags, xen_mappings = !shadow_mode_external(v->domain);
|
||||||
|
+ int flags;
|
||||||
|
|
||||||
|
- SHADOW_FOREACH_L4E(sl4mfn, sl4e, 0, done, xen_mappings,
|
||||||
|
+ SHADOW_FOREACH_L4E(sl4mfn, sl4e, 0, done, v->domain,
|
||||||
|
{
|
||||||
|
flags = shadow_l4e_get_flags(*sl4e);
|
||||||
|
if ( (flags & _PAGE_PRESENT)
|
||||||
|
@@ -4153,14 +4190,11 @@ int sh_audit_l2_table(struct vcpu *v, mf
|
||||||
|
gfn_t gfn;
|
||||||
|
char *s;
|
||||||
|
int done = 0;
|
||||||
|
-#if GUEST_PAGING_LEVELS != 4
|
||||||
|
- int xen_mappings = !shadow_mode_external(v->domain);
|
||||||
|
-#endif
|
||||||
|
|
||||||
|
/* Follow the backpointer */
|
||||||
|
gl2mfn = _mfn(mfn_to_shadow_page(sl2mfn)->backpointer);
|
||||||
|
gl2e = gp = sh_map_domain_page(gl2mfn);
|
||||||
|
- SHADOW_FOREACH_L2E(sl2mfn, sl2e, &gl2e, done, xen_mappings, {
|
||||||
|
+ SHADOW_FOREACH_L2E(sl2mfn, sl2e, &gl2e, done, v->domain, {
|
||||||
|
|
||||||
|
s = sh_audit_flags(v, 2, guest_l2e_get_flags(*gl2e),
|
||||||
|
shadow_l2e_get_flags(*sl2e));
|
||||||
|
@@ -4212,10 +4246,11 @@ int sh_audit_l3_table(struct vcpu *v, mf
|
||||||
|
gfn = guest_l3e_get_gfn(*gl3e);
|
||||||
|
mfn = shadow_l3e_get_mfn(*sl3e);
|
||||||
|
gmfn = get_shadow_status(v, audit_gfn_to_mfn(v, gfn, gl3mfn),
|
||||||
|
- (GUEST_PAGING_LEVELS == 3
|
||||||
|
+ ((GUEST_PAGING_LEVELS == 3 ||
|
||||||
|
+ IS_COMPAT(v->domain))
|
||||||
|
&& !shadow_mode_external(v->domain)
|
||||||
|
&& (guest_index(gl3e) % 4) == 3)
|
||||||
|
- ? SH_type_l2h_pae_shadow
|
||||||
|
+ ? SH_type_l2h_shadow
|
||||||
|
: SH_type_l2_shadow);
|
||||||
|
if ( mfn_x(gmfn) != mfn_x(mfn) )
|
||||||
|
AUDIT_FAIL(3, "bad translation: gfn %" SH_PRI_gfn
|
||||||
|
@@ -4235,12 +4270,11 @@ int sh_audit_l4_table(struct vcpu *v, mf
|
||||||
|
gfn_t gfn;
|
||||||
|
char *s;
|
||||||
|
int done = 0;
|
||||||
|
- int xen_mappings = !shadow_mode_external(v->domain);
|
||||||
|
|
||||||
|
/* Follow the backpointer */
|
||||||
|
gl4mfn = _mfn(mfn_to_shadow_page(sl4mfn)->backpointer);
|
||||||
|
gl4e = gp = sh_map_domain_page(gl4mfn);
|
||||||
|
- SHADOW_FOREACH_L4E(sl4mfn, sl4e, &gl4e, done, xen_mappings,
|
||||||
|
+ SHADOW_FOREACH_L4E(sl4mfn, sl4e, &gl4e, done, v->domain,
|
||||||
|
{
|
||||||
|
s = sh_audit_flags(v, 4, guest_l4e_get_flags(*gl4e),
|
||||||
|
shadow_l4e_get_flags(*sl4e));
|
||||||
|
Index: 2007-02-20/xen/arch/x86/mm/shadow/private.h
|
||||||
|
===================================================================
|
||||||
|
--- 2007-02-20.orig/xen/arch/x86/mm/shadow/private.h 2007-02-20 11:01:43.000000000 +0100
|
||||||
|
+++ 2007-02-20/xen/arch/x86/mm/shadow/private.h 2007-02-20 11:01:50.000000000 +0100
|
||||||
|
@@ -190,12 +190,13 @@ static inline void shadow_check_page_str
|
||||||
|
#define SH_type_l1_64_shadow (8U) /* shadowing a 64-bit L1 page */
|
||||||
|
#define SH_type_fl1_64_shadow (9U) /* L1 shadow for 64-bit 2M superpg */
|
||||||
|
#define SH_type_l2_64_shadow (10U) /* shadowing a 64-bit L2 page */
|
||||||
|
-#define SH_type_l3_64_shadow (11U) /* shadowing a 64-bit L3 page */
|
||||||
|
-#define SH_type_l4_64_shadow (12U) /* shadowing a 64-bit L4 page */
|
||||||
|
-#define SH_type_max_shadow (12U)
|
||||||
|
-#define SH_type_p2m_table (13U) /* in use as the p2m table */
|
||||||
|
-#define SH_type_monitor_table (14U) /* in use as a monitor table */
|
||||||
|
-#define SH_type_unused (15U)
|
||||||
|
+#define SH_type_l2h_64_shadow (11U) /* shadowing a compat PAE L2 high page */
|
||||||
|
+#define SH_type_l3_64_shadow (12U) /* shadowing a 64-bit L3 page */
|
||||||
|
+#define SH_type_l4_64_shadow (13U) /* shadowing a 64-bit L4 page */
|
||||||
|
+#define SH_type_max_shadow (13U)
|
||||||
|
+#define SH_type_p2m_table (14U) /* in use as the p2m table */
|
||||||
|
+#define SH_type_monitor_table (15U) /* in use as a monitor table */
|
||||||
|
+#define SH_type_unused (16U)
|
||||||
|
|
||||||
|
/*
|
||||||
|
* What counts as a pinnable shadow?
|
||||||
|
@@ -246,6 +247,7 @@ static inline int sh_type_is_pinnable(st
|
||||||
|
#define SHF_L1_64 (1u << SH_type_l1_64_shadow)
|
||||||
|
#define SHF_FL1_64 (1u << SH_type_fl1_64_shadow)
|
||||||
|
#define SHF_L2_64 (1u << SH_type_l2_64_shadow)
|
||||||
|
+#define SHF_L2H_64 (1u << SH_type_l2h_64_shadow)
|
||||||
|
#define SHF_L3_64 (1u << SH_type_l3_64_shadow)
|
||||||
|
#define SHF_L4_64 (1u << SH_type_l4_64_shadow)
|
||||||
|
|
||||||
|
@@ -284,7 +286,6 @@ void shadow_unhook_mappings(struct vcpu
|
||||||
|
|
||||||
|
/* Install the xen mappings in various flavours of shadow */
|
||||||
|
void sh_install_xen_entries_in_l4(struct vcpu *v, mfn_t gl4mfn, mfn_t sl4mfn);
|
||||||
|
-void sh_install_xen_entries_in_l2h(struct vcpu *v, mfn_t sl2hmfn);
|
||||||
|
void sh_install_xen_entries_in_l2(struct vcpu *v, mfn_t gl2mfn, mfn_t sl2mfn);
|
||||||
|
|
||||||
|
|
||||||
|
Index: 2007-02-20/xen/arch/x86/mm/shadow/types.h
|
||||||
|
===================================================================
|
||||||
|
--- 2007-02-20.orig/xen/arch/x86/mm/shadow/types.h 2007-02-20 11:01:43.000000000 +0100
|
||||||
|
+++ 2007-02-20/xen/arch/x86/mm/shadow/types.h 2007-02-20 11:01:50.000000000 +0100
|
||||||
|
@@ -389,6 +389,7 @@ static inline guest_l4e_t guest_l4e_from
|
||||||
|
#define SH_type_l1_shadow SH_type_l1_64_shadow
|
||||||
|
#define SH_type_fl1_shadow SH_type_fl1_64_shadow
|
||||||
|
#define SH_type_l2_shadow SH_type_l2_64_shadow
|
||||||
|
+#define SH_type_l2h_shadow SH_type_l2h_64_shadow
|
||||||
|
#define SH_type_l3_shadow SH_type_l3_64_shadow
|
||||||
|
#define SH_type_l4_shadow SH_type_l4_64_shadow
|
||||||
|
#endif
|
||||||
|
Index: 2007-02-20/xen/include/asm-x86/x86_64/page.h
|
||||||
|
===================================================================
|
||||||
|
--- 2007-02-20.orig/xen/include/asm-x86/x86_64/page.h 2007-02-20 11:01:43.000000000 +0100
|
||||||
|
+++ 2007-02-20/xen/include/asm-x86/x86_64/page.h 2007-02-20 11:01:50.000000000 +0100
|
||||||
|
@@ -59,9 +59,11 @@ typedef l4_pgentry_t root_pgentry_t;
|
||||||
|
!((_t) & PGT_pae_xen_l2) || \
|
||||||
|
((_s) < COMPAT_L2_PAGETABLE_FIRST_XEN_SLOT(_d)) )
|
||||||
|
#define is_guest_l3_slot(_s) (1)
|
||||||
|
-#define is_guest_l4_slot(_s) \
|
||||||
|
- (((_s) < ROOT_PAGETABLE_FIRST_XEN_SLOT) || \
|
||||||
|
- ((_s) > ROOT_PAGETABLE_LAST_XEN_SLOT))
|
||||||
|
+#define is_guest_l4_slot(_d, _s) \
|
||||||
|
+ ( IS_COMPAT(_d) \
|
||||||
|
+ ? ((_s) == 0) \
|
||||||
|
+ : (((_s) < ROOT_PAGETABLE_FIRST_XEN_SLOT) || \
|
||||||
|
+ ((_s) > ROOT_PAGETABLE_LAST_XEN_SLOT)))
|
||||||
|
|
||||||
|
#define root_get_pfn l4e_get_pfn
|
||||||
|
#define root_get_flags l4e_get_flags
|
@ -1,7 +1,7 @@
|
|||||||
Index: 2007-01-08/xen/arch/x86/domain.c
|
Index: 2007-02-20/xen/arch/x86/domain.c
|
||||||
===================================================================
|
===================================================================
|
||||||
--- 2007-01-08.orig/xen/arch/x86/domain.c 2007-01-08 15:20:39.000000000 +0100
|
--- 2007-02-20.orig/xen/arch/x86/domain.c 2007-02-26 15:41:28.000000000 +0100
|
||||||
+++ 2007-01-08/xen/arch/x86/domain.c 2007-01-08 14:54:35.000000000 +0100
|
+++ 2007-02-20/xen/arch/x86/domain.c 2007-01-08 14:54:35.000000000 +0100
|
||||||
@@ -253,7 +253,7 @@ static void release_compat_l4(struct vcp
|
@@ -253,7 +253,7 @@ static void release_compat_l4(struct vcp
|
||||||
|
|
||||||
static inline int may_switch_mode(struct domain *d)
|
static inline int may_switch_mode(struct domain *d)
|
||||||
@ -30,23 +30,23 @@ Index: 2007-01-08/xen/arch/x86/domain.c
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
Index: 2007-01-08/xen/arch/x86/domain_build.c
|
Index: 2007-02-20/xen/arch/x86/domain_build.c
|
||||||
===================================================================
|
===================================================================
|
||||||
--- 2007-01-08.orig/xen/arch/x86/domain_build.c 2007-01-08 14:54:33.000000000 +0100
|
--- 2007-02-20.orig/xen/arch/x86/domain_build.c 2007-02-26 15:41:28.000000000 +0100
|
||||||
+++ 2007-01-08/xen/arch/x86/domain_build.c 2007-01-08 15:36:39.000000000 +0100
|
+++ 2007-02-20/xen/arch/x86/domain_build.c 2007-02-26 15:42:27.000000000 +0100
|
||||||
@@ -396,6 +396,8 @@ int construct_dom0(struct domain *d,
|
@@ -396,6 +396,8 @@ int construct_dom0(struct domain *d,
|
||||||
value = (value + mask) & ~mask;
|
value = (value + mask) & ~mask;
|
||||||
#ifdef CONFIG_COMPAT
|
#ifdef CONFIG_COMPAT
|
||||||
HYPERVISOR_COMPAT_VIRT_START(d) = max_t(unsigned int, m2p_compat_vstart, value);
|
HYPERVISOR_COMPAT_VIRT_START(d) = max_t(unsigned int, m2p_compat_vstart, value);
|
||||||
+ d->pa_bitsize = fls((1UL << 32) - HYPERVISOR_COMPAT_VIRT_START(d)) - 1
|
+ d->pa_bitsize = !IS_COMPAT(d) ? 0 :
|
||||||
+ + (PAGE_SIZE - 2);
|
+ fls((1UL << 32) - HYPERVISOR_COMPAT_VIRT_START(d)) - 1 + (PAGE_SIZE - 2);
|
||||||
if ( value > (!IS_COMPAT(d) ?
|
if ( value > (!IS_COMPAT(d) ?
|
||||||
HYPERVISOR_VIRT_START :
|
HYPERVISOR_VIRT_START :
|
||||||
__HYPERVISOR_COMPAT_VIRT_START) )
|
__HYPERVISOR_COMPAT_VIRT_START) )
|
||||||
Index: 2007-01-08/xen/common/page_alloc.c
|
Index: 2007-02-20/xen/common/page_alloc.c
|
||||||
===================================================================
|
===================================================================
|
||||||
--- 2007-01-08.orig/xen/common/page_alloc.c 2007-01-08 14:54:33.000000000 +0100
|
--- 2007-02-20.orig/xen/common/page_alloc.c 2007-02-26 15:41:28.000000000 +0100
|
||||||
+++ 2007-01-08/xen/common/page_alloc.c 2007-01-08 14:54:35.000000000 +0100
|
+++ 2007-02-20/xen/common/page_alloc.c 2007-01-08 14:54:35.000000000 +0100
|
||||||
@@ -718,7 +718,12 @@ struct page_info *__alloc_domheap_pages(
|
@@ -718,7 +718,12 @@ struct page_info *__alloc_domheap_pages(
|
||||||
if ( bits && bits <= PAGE_SHIFT + 1 )
|
if ( bits && bits <= PAGE_SHIFT + 1 )
|
||||||
return NULL;
|
return NULL;
|
||||||
@ -61,10 +61,10 @@ Index: 2007-01-08/xen/common/page_alloc.c
|
|||||||
if ( zone_hi >= NR_ZONES )
|
if ( zone_hi >= NR_ZONES )
|
||||||
zone_hi = NR_ZONES - 1;
|
zone_hi = NR_ZONES - 1;
|
||||||
|
|
||||||
Index: 2007-01-08/xen/include/xen/sched.h
|
Index: 2007-02-20/xen/include/xen/sched.h
|
||||||
===================================================================
|
===================================================================
|
||||||
--- 2007-01-08.orig/xen/include/xen/sched.h 2007-01-08 15:20:39.000000000 +0100
|
--- 2007-02-20.orig/xen/include/xen/sched.h 2007-02-26 15:41:28.000000000 +0100
|
||||||
+++ 2007-01-08/xen/include/xen/sched.h 2007-01-08 14:54:35.000000000 +0100
|
+++ 2007-02-20/xen/include/xen/sched.h 2007-01-08 14:54:35.000000000 +0100
|
||||||
@@ -165,6 +165,10 @@ struct domain
|
@@ -165,6 +165,10 @@ struct domain
|
||||||
|
|
||||||
unsigned long domain_flags;
|
unsigned long domain_flags;
|
||||||
|
82
bug.patch
82
bug.patch
@ -1,7 +1,7 @@
|
|||||||
Index: 2007-01-31/xen/arch/powerpc/backtrace.c
|
Index: 2007-02-20/xen/arch/powerpc/backtrace.c
|
||||||
===================================================================
|
===================================================================
|
||||||
--- 2007-01-31.orig/xen/arch/powerpc/backtrace.c 2006-12-15 16:33:59.000000000 +0100
|
--- 2007-02-20.orig/xen/arch/powerpc/backtrace.c 2006-12-15 16:33:59.000000000 +0100
|
||||||
+++ 2007-01-31/xen/arch/powerpc/backtrace.c 2007-01-31 09:42:07.000000000 +0100
|
+++ 2007-02-20/xen/arch/powerpc/backtrace.c 2007-02-20 10:56:04.000000000 +0100
|
||||||
@@ -206,7 +206,7 @@ void show_backtrace_regs(struct cpu_user
|
@@ -206,7 +206,7 @@ void show_backtrace_regs(struct cpu_user
|
||||||
console_end_sync();
|
console_end_sync();
|
||||||
}
|
}
|
||||||
@ -11,11 +11,11 @@ Index: 2007-01-31/xen/arch/powerpc/backtrace.c
|
|||||||
{
|
{
|
||||||
ulong sp;
|
ulong sp;
|
||||||
ulong lr;
|
ulong lr;
|
||||||
Index: 2007-01-31/xen/arch/x86/mm/shadow/common.c
|
Index: 2007-02-20/xen/arch/x86/mm/shadow/common.c
|
||||||
===================================================================
|
===================================================================
|
||||||
--- 2007-01-31.orig/xen/arch/x86/mm/shadow/common.c 2007-01-31 09:36:44.000000000 +0100
|
--- 2007-02-20.orig/xen/arch/x86/mm/shadow/common.c 2007-02-20 10:55:36.000000000 +0100
|
||||||
+++ 2007-01-31/xen/arch/x86/mm/shadow/common.c 2007-01-31 09:42:07.000000000 +0100
|
+++ 2007-02-20/xen/arch/x86/mm/shadow/common.c 2007-02-20 10:56:04.000000000 +0100
|
||||||
@@ -940,6 +940,7 @@ mfn_t shadow_alloc(struct domain *d,
|
@@ -948,6 +948,7 @@ mfn_t shadow_alloc(struct domain *d,
|
||||||
* we might free up higher-level pages that the caller is working on. */
|
* we might free up higher-level pages that the caller is working on. */
|
||||||
SHADOW_PRINTK("Can't allocate %i shadow pages!\n", 1 << order);
|
SHADOW_PRINTK("Can't allocate %i shadow pages!\n", 1 << order);
|
||||||
BUG();
|
BUG();
|
||||||
@ -23,11 +23,11 @@ Index: 2007-01-31/xen/arch/x86/mm/shadow/common.c
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
Index: 2007-01-31/xen/arch/x86/mm/shadow/multi.c
|
Index: 2007-02-20/xen/arch/x86/mm/shadow/multi.c
|
||||||
===================================================================
|
===================================================================
|
||||||
--- 2007-01-31.orig/xen/arch/x86/mm/shadow/multi.c 2007-01-31 09:36:54.000000000 +0100
|
--- 2007-02-20.orig/xen/arch/x86/mm/shadow/multi.c 2007-02-20 10:55:27.000000000 +0100
|
||||||
+++ 2007-01-31/xen/arch/x86/mm/shadow/multi.c 2007-01-31 09:42:07.000000000 +0100
|
+++ 2007-02-20/xen/arch/x86/mm/shadow/multi.c 2007-02-20 10:56:04.000000000 +0100
|
||||||
@@ -3160,7 +3160,7 @@ sh_update_linear_entries(struct vcpu *v)
|
@@ -3195,7 +3195,7 @@ sh_update_linear_entries(struct vcpu *v)
|
||||||
*/
|
*/
|
||||||
{
|
{
|
||||||
l2_pgentry_t *l2e, new_l2e;
|
l2_pgentry_t *l2e, new_l2e;
|
||||||
@ -36,10 +36,10 @@ Index: 2007-01-31/xen/arch/x86/mm/shadow/multi.c
|
|||||||
int i;
|
int i;
|
||||||
int unmap_l2e = 0;
|
int unmap_l2e = 0;
|
||||||
|
|
||||||
Index: 2007-01-31/xen/arch/x86/traps.c
|
Index: 2007-02-20/xen/arch/x86/traps.c
|
||||||
===================================================================
|
===================================================================
|
||||||
--- 2007-01-31.orig/xen/arch/x86/traps.c 2007-01-31 09:41:54.000000000 +0100
|
--- 2007-02-20.orig/xen/arch/x86/traps.c 2007-02-20 10:56:00.000000000 +0100
|
||||||
+++ 2007-01-31/xen/arch/x86/traps.c 2007-01-31 09:42:07.000000000 +0100
|
+++ 2007-02-20/xen/arch/x86/traps.c 2007-02-20 10:56:04.000000000 +0100
|
||||||
@@ -635,14 +635,50 @@ asmlinkage int do_invalid_op(struct cpu_
|
@@ -635,14 +635,50 @@ asmlinkage int do_invalid_op(struct cpu_
|
||||||
|
|
||||||
if ( unlikely(!guest_mode(regs)) )
|
if ( unlikely(!guest_mode(regs)) )
|
||||||
@ -99,10 +99,10 @@ Index: 2007-01-31/xen/arch/x86/traps.c
|
|||||||
}
|
}
|
||||||
DEBUGGER_trap_fatal(TRAP_invalid_op, regs);
|
DEBUGGER_trap_fatal(TRAP_invalid_op, regs);
|
||||||
show_execution_state(regs);
|
show_execution_state(regs);
|
||||||
Index: 2007-01-31/xen/common/keyhandler.c
|
Index: 2007-02-20/xen/common/keyhandler.c
|
||||||
===================================================================
|
===================================================================
|
||||||
--- 2007-01-31.orig/xen/common/keyhandler.c 2007-01-31 09:29:10.000000000 +0100
|
--- 2007-02-20.orig/xen/common/keyhandler.c 2007-02-20 10:41:46.000000000 +0100
|
||||||
+++ 2007-01-31/xen/common/keyhandler.c 2007-01-31 09:42:07.000000000 +0100
|
+++ 2007-02-20/xen/common/keyhandler.c 2007-02-20 10:56:04.000000000 +0100
|
||||||
@@ -94,7 +94,7 @@ static void show_handlers(unsigned char
|
@@ -94,7 +94,7 @@ static void show_handlers(unsigned char
|
||||||
|
|
||||||
static void __dump_execstate(void *unused)
|
static void __dump_execstate(void *unused)
|
||||||
@ -112,10 +112,10 @@ Index: 2007-01-31/xen/common/keyhandler.c
|
|||||||
}
|
}
|
||||||
|
|
||||||
static void dump_registers(unsigned char key, struct cpu_user_regs *regs)
|
static void dump_registers(unsigned char key, struct cpu_user_regs *regs)
|
||||||
Index: 2007-01-31/xen/drivers/char/console.c
|
Index: 2007-02-20/xen/drivers/char/console.c
|
||||||
===================================================================
|
===================================================================
|
||||||
--- 2007-01-31.orig/xen/drivers/char/console.c 2006-12-15 16:33:59.000000000 +0100
|
--- 2007-02-20.orig/xen/drivers/char/console.c 2006-12-15 16:33:59.000000000 +0100
|
||||||
+++ 2007-01-31/xen/drivers/char/console.c 2007-01-31 09:42:07.000000000 +0100
|
+++ 2007-02-20/xen/drivers/char/console.c 2007-02-20 10:56:04.000000000 +0100
|
||||||
@@ -880,15 +880,21 @@ void panic(const char *fmt, ...)
|
@@ -880,15 +880,21 @@ void panic(const char *fmt, ...)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -140,10 +140,10 @@ Index: 2007-01-31/xen/drivers/char/console.c
|
|||||||
/*
|
/*
|
||||||
* Local variables:
|
* Local variables:
|
||||||
* mode: C
|
* mode: C
|
||||||
Index: 2007-01-31/xen/include/asm-ia64/bug.h
|
Index: 2007-02-20/xen/include/asm-ia64/bug.h
|
||||||
===================================================================
|
===================================================================
|
||||||
--- /dev/null 1970-01-01 00:00:00.000000000 +0000
|
--- /dev/null 1970-01-01 00:00:00.000000000 +0000
|
||||||
+++ 2007-01-31/xen/include/asm-ia64/bug.h 2007-01-31 09:42:07.000000000 +0100
|
+++ 2007-02-20/xen/include/asm-ia64/bug.h 2007-02-20 10:56:04.000000000 +0100
|
||||||
@@ -0,0 +1,6 @@
|
@@ -0,0 +1,6 @@
|
||||||
+#ifndef __ASM_IA64_BUG_H__
|
+#ifndef __ASM_IA64_BUG_H__
|
||||||
+#define __ASM_IA64_BUG_H__
|
+#define __ASM_IA64_BUG_H__
|
||||||
@ -151,10 +151,10 @@ Index: 2007-01-31/xen/include/asm-ia64/bug.h
|
|||||||
+#define DUMP_STATE() printk("FIXME: implement ia64 dump_execution_state()\n");
|
+#define DUMP_STATE() printk("FIXME: implement ia64 dump_execution_state()\n");
|
||||||
+
|
+
|
||||||
+#endif /* __ASM_IA64_BUG_H__ */
|
+#endif /* __ASM_IA64_BUG_H__ */
|
||||||
Index: 2007-01-31/xen/include/asm-ia64/linux-xen/asm/iosapic.h
|
Index: 2007-02-20/xen/include/asm-ia64/linux-xen/asm/iosapic.h
|
||||||
===================================================================
|
===================================================================
|
||||||
--- 2007-01-31.orig/xen/include/asm-ia64/linux-xen/asm/iosapic.h 2006-12-13 11:15:55.000000000 +0100
|
--- 2007-02-20.orig/xen/include/asm-ia64/linux-xen/asm/iosapic.h 2006-12-13 11:15:55.000000000 +0100
|
||||||
+++ 2007-01-31/xen/include/asm-ia64/linux-xen/asm/iosapic.h 2007-01-31 09:42:07.000000000 +0100
|
+++ 2007-02-20/xen/include/asm-ia64/linux-xen/asm/iosapic.h 2007-02-20 10:56:04.000000000 +0100
|
||||||
@@ -123,11 +123,10 @@ static inline void list_move(struct list
|
@@ -123,11 +123,10 @@ static inline void list_move(struct list
|
||||||
|
|
||||||
#define move_irq(x)
|
#define move_irq(x)
|
||||||
@ -171,10 +171,10 @@ Index: 2007-01-31/xen/include/asm-ia64/linux-xen/asm/iosapic.h
|
|||||||
} while (0)
|
} while (0)
|
||||||
|
|
||||||
#ifdef nop
|
#ifdef nop
|
||||||
Index: 2007-01-31/xen/include/asm-ia64/xenprocessor.h
|
Index: 2007-02-20/xen/include/asm-ia64/xenprocessor.h
|
||||||
===================================================================
|
===================================================================
|
||||||
--- 2007-01-31.orig/xen/include/asm-ia64/xenprocessor.h 2006-12-13 11:15:55.000000000 +0100
|
--- 2007-02-20.orig/xen/include/asm-ia64/xenprocessor.h 2006-12-13 11:15:55.000000000 +0100
|
||||||
+++ 2007-01-31/xen/include/asm-ia64/xenprocessor.h 2007-01-31 09:42:07.000000000 +0100
|
+++ 2007-02-20/xen/include/asm-ia64/xenprocessor.h 2007-02-20 10:56:04.000000000 +0100
|
||||||
@@ -237,6 +237,4 @@ typedef union {
|
@@ -237,6 +237,4 @@ typedef union {
|
||||||
u64 itir;
|
u64 itir;
|
||||||
} ia64_itir_t;
|
} ia64_itir_t;
|
||||||
@ -182,10 +182,10 @@ Index: 2007-01-31/xen/include/asm-ia64/xenprocessor.h
|
|||||||
-#define dump_execution_state() printk("FIXME: implement ia64 dump_execution_state()\n");
|
-#define dump_execution_state() printk("FIXME: implement ia64 dump_execution_state()\n");
|
||||||
-
|
-
|
||||||
#endif // _ASM_IA64_XENPROCESSOR_H
|
#endif // _ASM_IA64_XENPROCESSOR_H
|
||||||
Index: 2007-01-31/xen/include/asm-powerpc/bug.h
|
Index: 2007-02-20/xen/include/asm-powerpc/bug.h
|
||||||
===================================================================
|
===================================================================
|
||||||
--- /dev/null 1970-01-01 00:00:00.000000000 +0000
|
--- /dev/null 1970-01-01 00:00:00.000000000 +0000
|
||||||
+++ 2007-01-31/xen/include/asm-powerpc/bug.h 2007-01-31 09:42:07.000000000 +0100
|
+++ 2007-02-20/xen/include/asm-powerpc/bug.h 2007-02-20 10:56:04.000000000 +0100
|
||||||
@@ -0,0 +1,7 @@
|
@@ -0,0 +1,7 @@
|
||||||
+#ifndef __ASM_PPC_BUG_H__
|
+#ifndef __ASM_PPC_BUG_H__
|
||||||
+#define __ASM_PPC_BUG_H__
|
+#define __ASM_PPC_BUG_H__
|
||||||
@ -194,10 +194,10 @@ Index: 2007-01-31/xen/include/asm-powerpc/bug.h
|
|||||||
+#define DUMP_STATE() dump_execution_state()
|
+#define DUMP_STATE() dump_execution_state()
|
||||||
+
|
+
|
||||||
+#endif /* __ASM_PPC_BUG_H__ */
|
+#endif /* __ASM_PPC_BUG_H__ */
|
||||||
Index: 2007-01-31/xen/include/asm-powerpc/debugger.h
|
Index: 2007-02-20/xen/include/asm-powerpc/debugger.h
|
||||||
===================================================================
|
===================================================================
|
||||||
--- 2007-01-31.orig/xen/include/asm-powerpc/debugger.h 2006-12-15 16:33:59.000000000 +0100
|
--- 2007-02-20.orig/xen/include/asm-powerpc/debugger.h 2006-12-15 16:33:59.000000000 +0100
|
||||||
+++ 2007-01-31/xen/include/asm-powerpc/debugger.h 2007-01-31 09:42:07.000000000 +0100
|
+++ 2007-02-20/xen/include/asm-powerpc/debugger.h 2007-02-20 10:56:04.000000000 +0100
|
||||||
@@ -67,10 +67,6 @@ static inline void unimplemented(void)
|
@@ -67,10 +67,6 @@ static inline void unimplemented(void)
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
@ -209,10 +209,10 @@ Index: 2007-01-31/xen/include/asm-powerpc/debugger.h
|
|||||||
extern void __attn(void);
|
extern void __attn(void);
|
||||||
#define ATTN() __attn();
|
#define ATTN() __attn();
|
||||||
|
|
||||||
Index: 2007-01-31/xen/include/asm-x86/bug.h
|
Index: 2007-02-20/xen/include/asm-x86/bug.h
|
||||||
===================================================================
|
===================================================================
|
||||||
--- /dev/null 1970-01-01 00:00:00.000000000 +0000
|
--- /dev/null 1970-01-01 00:00:00.000000000 +0000
|
||||||
+++ 2007-01-31/xen/include/asm-x86/bug.h 2007-01-31 09:42:07.000000000 +0100
|
+++ 2007-02-20/xen/include/asm-x86/bug.h 2007-02-20 10:56:04.000000000 +0100
|
||||||
@@ -0,0 +1,60 @@
|
@@ -0,0 +1,60 @@
|
||||||
+#ifndef __ASM_X86_BUG_H__
|
+#ifndef __ASM_X86_BUG_H__
|
||||||
+#define __ASM_X86_BUG_H__
|
+#define __ASM_X86_BUG_H__
|
||||||
@ -274,10 +274,10 @@ Index: 2007-01-31/xen/include/asm-x86/bug.h
|
|||||||
+ } while (0)
|
+ } while (0)
|
||||||
+
|
+
|
||||||
+#endif /* __ASM_X86_BUG_H__ */
|
+#endif /* __ASM_X86_BUG_H__ */
|
||||||
Index: 2007-01-31/xen/include/asm-x86/processor.h
|
Index: 2007-02-20/xen/include/asm-x86/processor.h
|
||||||
===================================================================
|
===================================================================
|
||||||
--- 2007-01-31.orig/xen/include/asm-x86/processor.h 2007-01-31 09:29:08.000000000 +0100
|
--- 2007-02-20.orig/xen/include/asm-x86/processor.h 2007-02-20 10:41:44.000000000 +0100
|
||||||
+++ 2007-01-31/xen/include/asm-x86/processor.h 2007-01-31 09:42:07.000000000 +0100
|
+++ 2007-02-20/xen/include/asm-x86/processor.h 2007-02-20 10:56:04.000000000 +0100
|
||||||
@@ -565,11 +565,6 @@ void compat_show_guest_stack(struct cpu_
|
@@ -565,11 +565,6 @@ void compat_show_guest_stack(struct cpu_
|
||||||
#define compat_show_guest_stack(regs, lines) ((void)0)
|
#define compat_show_guest_stack(regs, lines) ((void)0)
|
||||||
#endif
|
#endif
|
||||||
@ -290,10 +290,10 @@ Index: 2007-01-31/xen/include/asm-x86/processor.h
|
|||||||
extern void mtrr_ap_init(void);
|
extern void mtrr_ap_init(void);
|
||||||
extern void mtrr_bp_init(void);
|
extern void mtrr_bp_init(void);
|
||||||
|
|
||||||
Index: 2007-01-31/xen/include/xen/lib.h
|
Index: 2007-02-20/xen/include/xen/lib.h
|
||||||
===================================================================
|
===================================================================
|
||||||
--- 2007-01-31.orig/xen/include/xen/lib.h 2007-01-08 14:16:35.000000000 +0100
|
--- 2007-02-20.orig/xen/include/xen/lib.h 2007-01-08 14:16:35.000000000 +0100
|
||||||
+++ 2007-01-31/xen/include/xen/lib.h 2007-01-31 09:42:07.000000000 +0100
|
+++ 2007-02-20/xen/include/xen/lib.h 2007-02-20 10:56:04.000000000 +0100
|
||||||
@@ -7,10 +7,26 @@
|
@@ -7,10 +7,26 @@
|
||||||
#include <xen/types.h>
|
#include <xen/types.h>
|
||||||
#include <xen/xmalloc.h>
|
#include <xen/xmalloc.h>
|
||||||
|
@ -43,6 +43,7 @@ quiet = False
|
|||||||
verbose = False
|
verbose = False
|
||||||
dryrun = False
|
dryrun = False
|
||||||
tmpdir = '/var/lib/xen/tmp'
|
tmpdir = '/var/lib/xen/tmp'
|
||||||
|
in_args = ''
|
||||||
|
|
||||||
# Helper functions
|
# Helper functions
|
||||||
|
|
||||||
@ -353,17 +354,17 @@ def copyKernelAndRamdisk(disk, vdev, kernel, ramdisk):
|
|||||||
|
|
||||||
def main(argv):
|
def main(argv):
|
||||||
"Main routine: Parses options etc."
|
"Main routine: Parses options etc."
|
||||||
global quiet, dryrun, verbose, tmpdir
|
global quiet, dryrun, verbose, tmpdir, in_args
|
||||||
def usage():
|
def usage():
|
||||||
"Help output (usage info)"
|
"Help output (usage info)"
|
||||||
global verbose, quiet, dryrun
|
global verbose, quiet, dryrun
|
||||||
print >> sys.stderr, "domUloader usage: domUloader [--output=fd] [--quiet] [--dryrun] [--verbose]\n" +\
|
print >> sys.stderr, "domUloader usage: domUloader [--output=fd] [--quiet] [--dryrun] [--verbose]\n" +\
|
||||||
"[--help] --entry=dev:kernel[,ramdisk] physdisk [virtdisk]\n"
|
"[--args] [--help] --entry=dev:kernel[,ramdisk] physdisk [virtdisk]\n"
|
||||||
print >> sys.stderr, __doc__
|
print >> sys.stderr, __doc__
|
||||||
|
|
||||||
try:
|
try:
|
||||||
(optlist, args) = getopt.gnu_getopt(argv, 'qvh', \
|
(optlist, args) = getopt.gnu_getopt(argv, 'qvh', \
|
||||||
('entry=', 'output=', 'tmpdir=', 'help', 'quiet', 'dryrun', 'verbose'))
|
('entry=', 'output=', 'tmpdir=', 'args=', 'help', 'quiet', 'dryrun', 'verbose'))
|
||||||
except:
|
except:
|
||||||
usage()
|
usage()
|
||||||
sys.exit(1)
|
sys.exit(1)
|
||||||
@ -389,6 +390,8 @@ def main(argv):
|
|||||||
entry = oarg
|
entry = oarg
|
||||||
elif opt == '--tmpdir':
|
elif opt == '--tmpdir':
|
||||||
tmpdir = oarg
|
tmpdir = oarg
|
||||||
|
elif opt == '--args':
|
||||||
|
in_args = oarg
|
||||||
|
|
||||||
verbose_print(str(argv))
|
verbose_print(str(argv))
|
||||||
|
|
||||||
@ -424,6 +427,8 @@ def main(argv):
|
|||||||
r = 0
|
r = 0
|
||||||
try:
|
try:
|
||||||
sxpr = copyKernelAndRamdisk(disk, vdev, kernel, ramdisk)
|
sxpr = copyKernelAndRamdisk(disk, vdev, kernel, ramdisk)
|
||||||
|
if in_args:
|
||||||
|
sxpr += "(args %s)" % in_args
|
||||||
os.write(fd, sxpr)
|
os.write(fd, sxpr)
|
||||||
except Exception, e:
|
except Exception, e:
|
||||||
error(str(e))
|
error(str(e))
|
||||||
|
@ -5,10 +5,10 @@ ptwr_emulated_update() uses gmfn_to_mfn() on the pte loaded from the
|
|||||||
emulation context, while ptwr_do_page_fault() doesn't on the pte stored
|
emulation context, while ptwr_do_page_fault() doesn't on the pte stored
|
||||||
into that context. Shouldn't these two be symmetric?
|
into that context. Shouldn't these two be symmetric?
|
||||||
|
|
||||||
Index: 2007-01-08/xen/arch/x86/mm.c
|
Index: 2007-02-20/xen/arch/x86/mm.c
|
||||||
===================================================================
|
===================================================================
|
||||||
--- 2007-01-08.orig/xen/arch/x86/mm.c 2007-01-11 15:33:22.000000000 +0100
|
--- 2007-02-20.orig/xen/arch/x86/mm.c 2007-02-20 10:55:57.000000000 +0100
|
||||||
+++ 2007-01-08/xen/arch/x86/mm.c 2007-01-12 17:25:55.000000000 +0100
|
+++ 2007-02-20/xen/arch/x86/mm.c 2007-02-20 10:56:12.000000000 +0100
|
||||||
@@ -794,7 +794,7 @@ static void put_page_from_l2e(l2_pgentry
|
@@ -794,7 +794,7 @@ static void put_page_from_l2e(l2_pgentry
|
||||||
{
|
{
|
||||||
if ( (l2e_get_flags(l2e) & _PAGE_PRESENT) &&
|
if ( (l2e_get_flags(l2e) & _PAGE_PRESENT) &&
|
||||||
@ -36,7 +36,7 @@ Index: 2007-01-08/xen/arch/x86/mm.c
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@@ -3365,7 +3365,6 @@ int ptwr_do_page_fault(struct vcpu *v, u
|
@@ -3369,7 +3369,6 @@ int ptwr_do_page_fault(struct vcpu *v, u
|
||||||
struct cpu_user_regs *regs)
|
struct cpu_user_regs *regs)
|
||||||
{
|
{
|
||||||
struct domain *d = v->domain;
|
struct domain *d = v->domain;
|
||||||
@ -44,7 +44,7 @@ Index: 2007-01-08/xen/arch/x86/mm.c
|
|||||||
struct page_info *page;
|
struct page_info *page;
|
||||||
l1_pgentry_t pte;
|
l1_pgentry_t pte;
|
||||||
struct ptwr_emulate_ctxt ptwr_ctxt;
|
struct ptwr_emulate_ctxt ptwr_ctxt;
|
||||||
@@ -3379,8 +3378,7 @@ int ptwr_do_page_fault(struct vcpu *v, u
|
@@ -3383,8 +3382,7 @@ int ptwr_do_page_fault(struct vcpu *v, u
|
||||||
guest_get_eff_l1e(v, addr, &pte);
|
guest_get_eff_l1e(v, addr, &pte);
|
||||||
if ( !(l1e_get_flags(pte) & _PAGE_PRESENT) )
|
if ( !(l1e_get_flags(pte) & _PAGE_PRESENT) )
|
||||||
goto bail;
|
goto bail;
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
Index: 2007-01-31/xen/arch/x86/physdev.c
|
Index: 2007-02-20/xen/arch/x86/physdev.c
|
||||||
===================================================================
|
===================================================================
|
||||||
--- 2007-01-31.orig/xen/arch/x86/physdev.c 2007-01-31 09:29:19.000000000 +0100
|
--- 2007-02-20.orig/xen/arch/x86/physdev.c 2007-02-20 10:41:50.000000000 +0100
|
||||||
+++ 2007-01-31/xen/arch/x86/physdev.c 2007-02-14 18:22:18.000000000 +0100
|
+++ 2007-02-20/xen/arch/x86/physdev.c 2007-02-20 10:56:30.000000000 +0100
|
||||||
@@ -143,6 +143,57 @@ ret_t do_physdev_op(int cmd, XEN_GUEST_H
|
@@ -143,6 +143,57 @@ ret_t do_physdev_op(int cmd, XEN_GUEST_H
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -60,10 +60,10 @@ Index: 2007-01-31/xen/arch/x86/physdev.c
|
|||||||
default:
|
default:
|
||||||
ret = -ENOSYS;
|
ret = -ENOSYS;
|
||||||
break;
|
break;
|
||||||
Index: 2007-01-31/xen/arch/x86/traps.c
|
Index: 2007-02-20/xen/arch/x86/traps.c
|
||||||
===================================================================
|
===================================================================
|
||||||
--- 2007-01-31.orig/xen/arch/x86/traps.c 2007-02-07 17:03:20.000000000 +0100
|
--- 2007-02-20.orig/xen/arch/x86/traps.c 2007-02-20 10:56:27.000000000 +0100
|
||||||
+++ 2007-01-31/xen/arch/x86/traps.c 2007-02-15 10:12:21.000000000 +0100
|
+++ 2007-02-20/xen/arch/x86/traps.c 2007-02-20 10:56:30.000000000 +0100
|
||||||
@@ -2516,6 +2516,12 @@ long do_set_trap_table(XEN_GUEST_HANDLE(
|
@@ -2516,6 +2516,12 @@ long do_set_trap_table(XEN_GUEST_HANDLE(
|
||||||
if ( cur.address == 0 )
|
if ( cur.address == 0 )
|
||||||
break;
|
break;
|
||||||
@ -77,10 +77,10 @@ Index: 2007-01-31/xen/arch/x86/traps.c
|
|||||||
fixup_guest_code_selector(current->domain, cur.cs);
|
fixup_guest_code_selector(current->domain, cur.cs);
|
||||||
|
|
||||||
memcpy(&dst[cur.vector], &cur, sizeof(cur));
|
memcpy(&dst[cur.vector], &cur, sizeof(cur));
|
||||||
Index: 2007-01-31/xen/arch/x86/x86_32/asm-offsets.c
|
Index: 2007-02-20/xen/arch/x86/x86_32/asm-offsets.c
|
||||||
===================================================================
|
===================================================================
|
||||||
--- 2007-01-31.orig/xen/arch/x86/x86_32/asm-offsets.c 2006-12-13 11:15:54.000000000 +0100
|
--- 2007-02-20.orig/xen/arch/x86/x86_32/asm-offsets.c 2006-12-13 11:15:54.000000000 +0100
|
||||||
+++ 2007-01-31/xen/arch/x86/x86_32/asm-offsets.c 2007-02-15 09:51:44.000000000 +0100
|
+++ 2007-02-20/xen/arch/x86/x86_32/asm-offsets.c 2007-02-20 10:56:30.000000000 +0100
|
||||||
@@ -68,6 +68,7 @@ void __dummy__(void)
|
@@ -68,6 +68,7 @@ void __dummy__(void)
|
||||||
OFFSET(VCPU_arch_guest_fpu_ctxt, struct vcpu, arch.guest_context.fpu_ctxt);
|
OFFSET(VCPU_arch_guest_fpu_ctxt, struct vcpu, arch.guest_context.fpu_ctxt);
|
||||||
OFFSET(VCPU_flags, struct vcpu, vcpu_flags);
|
OFFSET(VCPU_flags, struct vcpu, vcpu_flags);
|
||||||
@ -89,10 +89,10 @@ Index: 2007-01-31/xen/arch/x86/x86_32/asm-offsets.c
|
|||||||
DEFINE(_VCPUF_nmi_pending, _VCPUF_nmi_pending);
|
DEFINE(_VCPUF_nmi_pending, _VCPUF_nmi_pending);
|
||||||
DEFINE(_VCPUF_nmi_masked, _VCPUF_nmi_masked);
|
DEFINE(_VCPUF_nmi_masked, _VCPUF_nmi_masked);
|
||||||
DEFINE(_VGCF_failsafe_disables_events, _VGCF_failsafe_disables_events);
|
DEFINE(_VGCF_failsafe_disables_events, _VGCF_failsafe_disables_events);
|
||||||
Index: 2007-01-31/xen/arch/x86/x86_32/entry.S
|
Index: 2007-02-20/xen/arch/x86/x86_32/entry.S
|
||||||
===================================================================
|
===================================================================
|
||||||
--- 2007-01-31.orig/xen/arch/x86/x86_32/entry.S 2007-01-31 09:42:04.000000000 +0100
|
--- 2007-02-20.orig/xen/arch/x86/x86_32/entry.S 2007-02-20 10:56:03.000000000 +0100
|
||||||
+++ 2007-01-31/xen/arch/x86/x86_32/entry.S 2007-02-15 09:54:40.000000000 +0100
|
+++ 2007-02-20/xen/arch/x86/x86_32/entry.S 2007-02-20 10:56:30.000000000 +0100
|
||||||
@@ -232,7 +232,7 @@ test_all_events:
|
@@ -232,7 +232,7 @@ test_all_events:
|
||||||
shl $IRQSTAT_shift,%eax
|
shl $IRQSTAT_shift,%eax
|
||||||
test %ecx,irq_stat(%eax,1)
|
test %ecx,irq_stat(%eax,1)
|
||||||
@ -128,10 +128,10 @@ Index: 2007-01-31/xen/arch/x86/x86_32/entry.S
|
|||||||
jmp test_guest_events
|
jmp test_guest_events
|
||||||
|
|
||||||
bad_hypercall:
|
bad_hypercall:
|
||||||
Index: 2007-01-31/xen/arch/x86/x86_64/asm-offsets.c
|
Index: 2007-02-20/xen/arch/x86/x86_64/asm-offsets.c
|
||||||
===================================================================
|
===================================================================
|
||||||
--- 2007-01-31.orig/xen/arch/x86/x86_64/asm-offsets.c 2007-01-31 09:29:21.000000000 +0100
|
--- 2007-02-20.orig/xen/arch/x86/x86_64/asm-offsets.c 2007-02-20 10:41:52.000000000 +0100
|
||||||
+++ 2007-01-31/xen/arch/x86/x86_64/asm-offsets.c 2007-02-15 10:03:33.000000000 +0100
|
+++ 2007-02-20/xen/arch/x86/x86_64/asm-offsets.c 2007-02-20 10:56:30.000000000 +0100
|
||||||
@@ -76,6 +76,7 @@ void __dummy__(void)
|
@@ -76,6 +76,7 @@ void __dummy__(void)
|
||||||
OFFSET(VCPU_arch_guest_fpu_ctxt, struct vcpu, arch.guest_context.fpu_ctxt);
|
OFFSET(VCPU_arch_guest_fpu_ctxt, struct vcpu, arch.guest_context.fpu_ctxt);
|
||||||
OFFSET(VCPU_flags, struct vcpu, vcpu_flags);
|
OFFSET(VCPU_flags, struct vcpu, vcpu_flags);
|
||||||
@ -140,10 +140,10 @@ Index: 2007-01-31/xen/arch/x86/x86_64/asm-offsets.c
|
|||||||
DEFINE(_VCPUF_nmi_pending, _VCPUF_nmi_pending);
|
DEFINE(_VCPUF_nmi_pending, _VCPUF_nmi_pending);
|
||||||
DEFINE(_VCPUF_nmi_masked, _VCPUF_nmi_masked);
|
DEFINE(_VCPUF_nmi_masked, _VCPUF_nmi_masked);
|
||||||
DEFINE(_VGCF_failsafe_disables_events, _VGCF_failsafe_disables_events);
|
DEFINE(_VGCF_failsafe_disables_events, _VGCF_failsafe_disables_events);
|
||||||
Index: 2007-01-31/xen/arch/x86/x86_64/compat/entry.S
|
Index: 2007-02-20/xen/arch/x86/x86_64/compat/entry.S
|
||||||
===================================================================
|
===================================================================
|
||||||
--- 2007-01-31.orig/xen/arch/x86/x86_64/compat/entry.S 2007-01-31 09:42:04.000000000 +0100
|
--- 2007-02-20.orig/xen/arch/x86/x86_64/compat/entry.S 2007-02-20 10:56:03.000000000 +0100
|
||||||
+++ 2007-01-31/xen/arch/x86/x86_64/compat/entry.S 2007-02-15 10:22:57.000000000 +0100
|
+++ 2007-02-20/xen/arch/x86/x86_64/compat/entry.S 2007-02-20 10:56:30.000000000 +0100
|
||||||
@@ -68,7 +68,7 @@ compat_test_all_events:
|
@@ -68,7 +68,7 @@ compat_test_all_events:
|
||||||
leaq irq_stat(%rip),%rcx
|
leaq irq_stat(%rip),%rcx
|
||||||
testl $~0,(%rcx,%rax,1)
|
testl $~0,(%rcx,%rax,1)
|
||||||
@ -198,10 +198,10 @@ Index: 2007-01-31/xen/arch/x86/x86_64/compat/entry.S
|
|||||||
movw $TBF_FAILSAFE,TRAPBOUNCE_flags(%rdx)
|
movw $TBF_FAILSAFE,TRAPBOUNCE_flags(%rdx)
|
||||||
btq $_VGCF_failsafe_disables_events,VCPU_guest_context_flags(%rbx)
|
btq $_VGCF_failsafe_disables_events,VCPU_guest_context_flags(%rbx)
|
||||||
jnc 1f
|
jnc 1f
|
||||||
Index: 2007-01-31/xen/arch/x86/x86_64/compat/traps.c
|
Index: 2007-02-20/xen/arch/x86/x86_64/compat/traps.c
|
||||||
===================================================================
|
===================================================================
|
||||||
--- 2007-01-31.orig/xen/arch/x86/x86_64/compat/traps.c 2007-01-31 09:29:26.000000000 +0100
|
--- 2007-02-20.orig/xen/arch/x86/x86_64/compat/traps.c 2007-02-20 10:41:57.000000000 +0100
|
||||||
+++ 2007-01-31/xen/arch/x86/x86_64/compat/traps.c 2007-02-15 10:10:46.000000000 +0100
|
+++ 2007-02-20/xen/arch/x86/x86_64/compat/traps.c 2007-02-20 10:56:30.000000000 +0100
|
||||||
@@ -287,6 +287,12 @@ int compat_set_trap_table(XEN_GUEST_HAND
|
@@ -287,6 +287,12 @@ int compat_set_trap_table(XEN_GUEST_HAND
|
||||||
if ( cur.address == 0 )
|
if ( cur.address == 0 )
|
||||||
break;
|
break;
|
||||||
@ -215,10 +215,10 @@ Index: 2007-01-31/xen/arch/x86/x86_64/compat/traps.c
|
|||||||
fixup_guest_code_selector(current->domain, cur.cs);
|
fixup_guest_code_selector(current->domain, cur.cs);
|
||||||
|
|
||||||
XLAT_trap_info(dst + cur.vector, &cur);
|
XLAT_trap_info(dst + cur.vector, &cur);
|
||||||
Index: 2007-01-31/xen/arch/x86/x86_64/entry.S
|
Index: 2007-02-20/xen/arch/x86/x86_64/entry.S
|
||||||
===================================================================
|
===================================================================
|
||||||
--- 2007-01-31.orig/xen/arch/x86/x86_64/entry.S 2007-01-31 09:42:04.000000000 +0100
|
--- 2007-02-20.orig/xen/arch/x86/x86_64/entry.S 2007-02-20 10:56:03.000000000 +0100
|
||||||
+++ 2007-01-31/xen/arch/x86/x86_64/entry.S 2007-02-14 17:15:25.000000000 +0100
|
+++ 2007-02-20/xen/arch/x86/x86_64/entry.S 2007-02-20 10:56:30.000000000 +0100
|
||||||
@@ -177,7 +177,7 @@ test_all_events:
|
@@ -177,7 +177,7 @@ test_all_events:
|
||||||
leaq irq_stat(%rip),%rcx
|
leaq irq_stat(%rip),%rcx
|
||||||
testl $~0,(%rcx,%rax,1)
|
testl $~0,(%rcx,%rax,1)
|
||||||
@ -246,10 +246,10 @@ Index: 2007-01-31/xen/arch/x86/x86_64/entry.S
|
|||||||
jmp test_guest_events
|
jmp test_guest_events
|
||||||
|
|
||||||
bad_hypercall:
|
bad_hypercall:
|
||||||
Index: 2007-01-31/xen/arch/x86/x86_64/physdev.c
|
Index: 2007-02-20/xen/arch/x86/x86_64/physdev.c
|
||||||
===================================================================
|
===================================================================
|
||||||
--- 2007-01-31.orig/xen/arch/x86/x86_64/physdev.c 2007-01-31 09:29:19.000000000 +0100
|
--- 2007-02-20.orig/xen/arch/x86/x86_64/physdev.c 2007-02-20 10:41:50.000000000 +0100
|
||||||
+++ 2007-01-31/xen/arch/x86/x86_64/physdev.c 2007-02-14 18:26:33.000000000 +0100
|
+++ 2007-02-20/xen/arch/x86/x86_64/physdev.c 2007-02-20 10:56:30.000000000 +0100
|
||||||
@@ -30,6 +30,10 @@
|
@@ -30,6 +30,10 @@
|
||||||
#define physdev_irq_status_query compat_physdev_irq_status_query
|
#define physdev_irq_status_query compat_physdev_irq_status_query
|
||||||
#define physdev_irq_status_query_t physdev_irq_status_query_compat_t
|
#define physdev_irq_status_query_t physdev_irq_status_query_compat_t
|
||||||
@ -261,11 +261,11 @@ Index: 2007-01-31/xen/arch/x86/x86_64/physdev.c
|
|||||||
#define COMPAT
|
#define COMPAT
|
||||||
#undef guest_handle_okay
|
#undef guest_handle_okay
|
||||||
#define guest_handle_okay compat_handle_okay
|
#define guest_handle_okay compat_handle_okay
|
||||||
Index: 2007-01-31/xen/common/kernel.c
|
Index: 2007-02-20/xen/common/kernel.c
|
||||||
===================================================================
|
===================================================================
|
||||||
--- 2007-01-31.orig/xen/common/kernel.c 2007-01-31 09:44:25.000000000 +0100
|
--- 2007-02-20.orig/xen/common/kernel.c 2007-02-20 10:41:46.000000000 +0100
|
||||||
+++ 2007-01-31/xen/common/kernel.c 2007-02-15 10:18:48.000000000 +0100
|
+++ 2007-02-20/xen/common/kernel.c 2007-02-20 10:56:30.000000000 +0100
|
||||||
@@ -252,16 +252,20 @@ long register_guest_nmi_callback(unsigne
|
@@ -247,16 +247,20 @@ long register_guest_nmi_callback(unsigne
|
||||||
struct vcpu *v = current;
|
struct vcpu *v = current;
|
||||||
struct domain *d = current->domain;
|
struct domain *d = current->domain;
|
||||||
|
|
||||||
@ -290,7 +290,7 @@ Index: 2007-01-31/xen/common/kernel.c
|
|||||||
set_bit(_VCPUF_nmi_pending, &v->vcpu_flags);
|
set_bit(_VCPUF_nmi_pending, &v->vcpu_flags);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@@ -272,6 +276,11 @@ long unregister_guest_nmi_callback(void)
|
@@ -267,6 +271,11 @@ long unregister_guest_nmi_callback(void)
|
||||||
{
|
{
|
||||||
struct vcpu *v = current;
|
struct vcpu *v = current;
|
||||||
|
|
||||||
@ -302,10 +302,10 @@ Index: 2007-01-31/xen/common/kernel.c
|
|||||||
v->nmi_addr = 0;
|
v->nmi_addr = 0;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
Index: 2007-01-31/xen/include/public/physdev.h
|
Index: 2007-02-20/xen/include/public/physdev.h
|
||||||
===================================================================
|
===================================================================
|
||||||
--- 2007-01-31.orig/xen/include/public/physdev.h 2006-12-13 11:15:56.000000000 +0100
|
--- 2007-02-20.orig/xen/include/public/physdev.h 2006-12-13 11:15:56.000000000 +0100
|
||||||
+++ 2007-01-31/xen/include/public/physdev.h 2007-02-14 18:21:35.000000000 +0100
|
+++ 2007-02-20/xen/include/public/physdev.h 2007-02-20 10:56:30.000000000 +0100
|
||||||
@@ -119,6 +119,22 @@ typedef struct physdev_irq physdev_irq_t
|
@@ -119,6 +119,22 @@ typedef struct physdev_irq physdev_irq_t
|
||||||
DEFINE_XEN_GUEST_HANDLE(physdev_irq_t);
|
DEFINE_XEN_GUEST_HANDLE(physdev_irq_t);
|
||||||
|
|
||||||
@ -329,10 +329,10 @@ Index: 2007-01-31/xen/include/public/physdev.h
|
|||||||
* Argument to physdev_op_compat() hypercall. Superceded by new physdev_op()
|
* Argument to physdev_op_compat() hypercall. Superceded by new physdev_op()
|
||||||
* hypercall since 0x00030202.
|
* hypercall since 0x00030202.
|
||||||
*/
|
*/
|
||||||
Index: 2007-01-31/xen/include/xen/sched.h
|
Index: 2007-02-20/xen/include/xen/sched.h
|
||||||
===================================================================
|
===================================================================
|
||||||
--- 2007-01-31.orig/xen/include/xen/sched.h 2007-01-31 09:39:18.000000000 +0100
|
--- 2007-02-20.orig/xen/include/xen/sched.h 2007-02-20 10:42:03.000000000 +0100
|
||||||
+++ 2007-01-31/xen/include/xen/sched.h 2007-02-15 09:38:57.000000000 +0100
|
+++ 2007-02-20/xen/include/xen/sched.h 2007-02-20 10:56:30.000000000 +0100
|
||||||
@@ -108,7 +108,11 @@ struct vcpu
|
@@ -108,7 +108,11 @@ struct vcpu
|
||||||
/* Bitmask of CPUs on which this VCPU may run. */
|
/* Bitmask of CPUs on which this VCPU may run. */
|
||||||
cpumask_t cpu_affinity;
|
cpumask_t cpu_affinity;
|
||||||
@ -345,10 +345,10 @@ Index: 2007-01-31/xen/include/xen/sched.h
|
|||||||
|
|
||||||
/* Bitmask of CPUs which are holding onto this VCPU's state. */
|
/* Bitmask of CPUs which are holding onto this VCPU's state. */
|
||||||
cpumask_t vcpu_dirty_cpumask;
|
cpumask_t vcpu_dirty_cpumask;
|
||||||
Index: 2007-01-31/xen/include/xlat.lst
|
Index: 2007-02-20/xen/include/xlat.lst
|
||||||
===================================================================
|
===================================================================
|
||||||
--- 2007-01-31.orig/xen/include/xlat.lst 2007-01-31 09:29:27.000000000 +0100
|
--- 2007-02-20.orig/xen/include/xlat.lst 2007-02-20 10:41:58.000000000 +0100
|
||||||
+++ 2007-01-31/xen/include/xlat.lst 2007-02-14 17:58:42.000000000 +0100
|
+++ 2007-02-20/xen/include/xlat.lst 2007-02-20 10:56:30.000000000 +0100
|
||||||
@@ -40,6 +40,7 @@
|
@@ -40,6 +40,7 @@
|
||||||
! memory_map memory.h
|
! memory_map memory.h
|
||||||
! memory_reservation memory.h
|
! memory_reservation memory.h
|
||||||
|
@ -1,8 +1,8 @@
|
|||||||
Index: 2007-01-31/xen/arch/x86/mm.c
|
Index: 2007-02-20/xen/arch/x86/mm.c
|
||||||
===================================================================
|
===================================================================
|
||||||
--- 2007-01-31.orig/xen/arch/x86/mm.c 2007-01-31 09:42:10.000000000 +0100
|
--- 2007-02-20.orig/xen/arch/x86/mm.c 2007-02-20 10:56:12.000000000 +0100
|
||||||
+++ 2007-01-31/xen/arch/x86/mm.c 2007-01-31 09:43:38.000000000 +0100
|
+++ 2007-02-20/xen/arch/x86/mm.c 2007-02-20 10:56:25.000000000 +0100
|
||||||
@@ -3248,14 +3248,15 @@ static int ptwr_emulated_update(
|
@@ -3252,14 +3252,15 @@ static int ptwr_emulated_update(
|
||||||
{
|
{
|
||||||
if ( (CONFIG_PAGING_LEVELS == 3 || IS_COMPAT(d)) &&
|
if ( (CONFIG_PAGING_LEVELS == 3 || IS_COMPAT(d)) &&
|
||||||
(bytes == 4) &&
|
(bytes == 4) &&
|
||||||
@ -22,7 +22,7 @@ Index: 2007-01-31/xen/arch/x86/mm.c
|
|||||||
*/
|
*/
|
||||||
MEM_LOG("ptwr_emulate: fixing up invalid PAE PTE %"PRIpte,
|
MEM_LOG("ptwr_emulate: fixing up invalid PAE PTE %"PRIpte,
|
||||||
l1e_get_intpte(nl1e));
|
l1e_get_intpte(nl1e));
|
||||||
@@ -3387,7 +3388,7 @@ int ptwr_do_page_fault(struct vcpu *v, u
|
@@ -3391,7 +3392,7 @@ int ptwr_do_page_fault(struct vcpu *v, u
|
||||||
(page_get_owner(page) != d) )
|
(page_get_owner(page) != d) )
|
||||||
goto bail;
|
goto bail;
|
||||||
|
|
||||||
|
@ -1,3 +1,51 @@
|
|||||||
|
Index: xen-3.0.4-testing/tools/python/xen/xend/XendBootloader.py
|
||||||
|
===================================================================
|
||||||
|
--- xen-3.0.4-testing.orig/tools/python/xen/xend/XendBootloader.py
|
||||||
|
+++ xen-3.0.4-testing/tools/python/xen/xend/XendBootloader.py
|
||||||
|
@@ -14,6 +14,7 @@
|
||||||
|
|
||||||
|
import os, select, errno, stat
|
||||||
|
import random
|
||||||
|
+import re
|
||||||
|
import shlex
|
||||||
|
from xen.xend import sxp
|
||||||
|
|
||||||
|
@@ -57,6 +58,8 @@ def bootloader(blexec, disk, quiet = Fal
|
||||||
|
args.append("-q")
|
||||||
|
if dryrun:
|
||||||
|
args.append("--dryrun")
|
||||||
|
+ if kernel_args:
|
||||||
|
+ args.append("--args=%s" % kernel_args)
|
||||||
|
args.append("--output=%s" % fifo)
|
||||||
|
if blargs:
|
||||||
|
args.extend(shlex.split(blargs))
|
||||||
|
@@ -97,3 +100,26 @@ def bootloader(blexec, disk, quiet = Fal
|
||||||
|
pin.input_eof()
|
||||||
|
blcfg = pin.val
|
||||||
|
return blcfg
|
||||||
|
+
|
||||||
|
+def bootfilter(bootloader, bootloader_args, vdisk):
|
||||||
|
+ """Is this virtual disk ok to boot from?"""
|
||||||
|
+ if vdisk.endswith(':disk'):
|
||||||
|
+ vdisk = vdisk[:-5] # temporary work-around for bug 237414
|
||||||
|
+ if bootloader.endswith('domUloader.py'):
|
||||||
|
+ for arg in bootloader_args.split():
|
||||||
|
+ if arg.startswith('--entry='):
|
||||||
|
+ m = re.match(r'^([hsx]v?d[a-z])[0-9]*:[^,]*(,[^,]*)?$', arg[8:])
|
||||||
|
+ if m:
|
||||||
|
+ return vdisk == m.group(1) or vdisk == m.group(2)
|
||||||
|
+ return True
|
||||||
|
+
|
||||||
|
+def bootselector(bootloader, bootloader_args, disks):
|
||||||
|
+ """Returns the desired disk to boot from.
|
||||||
|
+ @param disks List of (pdev, vdev, ...) tuples.
|
||||||
|
+ """
|
||||||
|
+ if bootloader.endswith('domUloader.py'):
|
||||||
|
+ for disk in disks:
|
||||||
|
+ if bootfilter(bootloader, bootloader_args, disk[1]):
|
||||||
|
+ return disk
|
||||||
|
+ return disks[0]
|
||||||
|
+
|
||||||
Index: xen-3.0.4-testing/tools/python/xen/xend/XendDomainInfo.py
|
Index: xen-3.0.4-testing/tools/python/xen/xend/XendDomainInfo.py
|
||||||
===================================================================
|
===================================================================
|
||||||
--- xen-3.0.4-testing.orig/tools/python/xen/xend/XendDomainInfo.py
|
--- xen-3.0.4-testing.orig/tools/python/xen/xend/XendDomainInfo.py
|
||||||
@ -30,45 +78,6 @@ Index: xen-3.0.4-testing/tools/python/xen/xend/XendDomainInfo.py
|
|||||||
fn = blkdev_uname_to_file(disk)
|
fn = blkdev_uname_to_file(disk)
|
||||||
mounted = devtype == 'tap' and not os.stat(fn).st_rdev
|
mounted = devtype == 'tap' and not os.stat(fn).st_rdev
|
||||||
if mounted:
|
if mounted:
|
||||||
Index: xen-3.0.4-testing/tools/python/xen/xend/XendBootloader.py
|
|
||||||
===================================================================
|
|
||||||
--- xen-3.0.4-testing.orig/tools/python/xen/xend/XendBootloader.py
|
|
||||||
+++ xen-3.0.4-testing/tools/python/xen/xend/XendBootloader.py
|
|
||||||
@@ -14,6 +14,7 @@
|
|
||||||
|
|
||||||
import os, select, errno, stat
|
|
||||||
import random
|
|
||||||
+import re
|
|
||||||
import shlex
|
|
||||||
from xen.xend import sxp
|
|
||||||
|
|
||||||
@@ -97,3 +98,26 @@ def bootloader(blexec, disk, quiet = Fal
|
|
||||||
pin.input_eof()
|
|
||||||
blcfg = pin.val
|
|
||||||
return blcfg
|
|
||||||
+
|
|
||||||
+def bootfilter(bootloader, bootloader_args, vdisk):
|
|
||||||
+ """Is this virtual disk ok to boot from?"""
|
|
||||||
+ if vdisk.endswith(':disk'):
|
|
||||||
+ vdisk = vdisk[:-5] # temporary work-around for bug 237414
|
|
||||||
+ if bootloader.endswith('domUloader.py'):
|
|
||||||
+ for arg in bootloader_args.split():
|
|
||||||
+ if arg.startswith('--entry='):
|
|
||||||
+ m = re.match(r'^([hsx]v?d[a-z])[0-9]*:[^,]*(,[^,]*)?$', arg[8:])
|
|
||||||
+ if m:
|
|
||||||
+ return vdisk == m.group(1) or vdisk == m.group(2)
|
|
||||||
+ return True
|
|
||||||
+
|
|
||||||
+def bootselector(bootloader, bootloader_args, disks):
|
|
||||||
+ """Returns the desired disk to boot from.
|
|
||||||
+ @param disks List of (pdev, vdev, ...) tuples.
|
|
||||||
+ """
|
|
||||||
+ if bootloader.endswith('domUloader.py'):
|
|
||||||
+ for disk in disks:
|
|
||||||
+ if bootfilter(bootloader, bootloader_args, disk[1]):
|
|
||||||
+ return disk
|
|
||||||
+ return disks[0]
|
|
||||||
+
|
|
||||||
Index: xen-3.0.4-testing/tools/python/xen/xm/create.py
|
Index: xen-3.0.4-testing/tools/python/xen/xm/create.py
|
||||||
===================================================================
|
===================================================================
|
||||||
--- xen-3.0.4-testing.orig/tools/python/xen/xm/create.py
|
--- xen-3.0.4-testing.orig/tools/python/xen/xm/create.py
|
||||||
@ -82,7 +91,7 @@ Index: xen-3.0.4-testing/tools/python/xen/xm/create.py
|
|||||||
from xen.util import blkif
|
from xen.util import blkif
|
||||||
from xen.util import security
|
from xen.util import security
|
||||||
|
|
||||||
@@ -710,14 +710,15 @@ def run_bootloader(vals, config_image):
|
@@ -710,16 +710,18 @@ def run_bootloader(vals, config_image):
|
||||||
err("Bootloader '%s' isn't executable" % vals.bootloader)
|
err("Bootloader '%s' isn't executable" % vals.bootloader)
|
||||||
if len(vals.disk) < 1:
|
if len(vals.disk) < 1:
|
||||||
err("No disks configured and boot loader requested")
|
err("No disks configured and boot loader requested")
|
||||||
@ -98,5 +107,9 @@ Index: xen-3.0.4-testing/tools/python/xen/xm/create.py
|
|||||||
+ uname = bootdisk[0]
|
+ uname = bootdisk[0]
|
||||||
+ file = blkif.blkdev_uname_to_file(uname)
|
+ file = blkif.blkdev_uname_to_file(uname)
|
||||||
return bootloader(vals.bootloader, file, not vals.console_autoconnect,
|
return bootloader(vals.bootloader, file, not vals.console_autoconnect,
|
||||||
vals.bootargs, config_image)
|
- vals.bootargs, config_image)
|
||||||
|
+ vals.bootargs,
|
||||||
|
+ kernel_args = sxp.child_value(config_image, 'args'))
|
||||||
|
|
||||||
|
def make_config(vals):
|
||||||
|
"""Create the domain configuration.
|
||||||
|
256
xen-ioemu-hvm-pv-support.diff
Normal file
256
xen-ioemu-hvm-pv-support.diff
Normal file
@ -0,0 +1,256 @@
|
|||||||
|
diff -Nuar ioemu-orig/hw/ide.c ioemu/hw/ide.c
|
||||||
|
--- a/tools/ioemu/hw/ide.c 2007-03-01 15:18:35.000000000 -0700
|
||||||
|
+++ b/tools/ioemu/hw/ide.c 2007-03-01 15:19:15.000000000 -0700
|
||||||
|
@@ -392,6 +392,9 @@
|
||||||
|
int type; /* see IDE_TYPE_xxx */
|
||||||
|
} PCIIDEState;
|
||||||
|
|
||||||
|
+static PCIIDEState *principal_ide_controller;
|
||||||
|
+extern FILE *logfile;
|
||||||
|
+
|
||||||
|
#define DMA_MULTI_THREAD
|
||||||
|
|
||||||
|
#ifdef DMA_MULTI_THREAD
|
||||||
|
@@ -2001,6 +2004,27 @@
|
||||||
|
ide_dummy_transfer_stop(s);
|
||||||
|
}
|
||||||
|
|
||||||
|
+void ide_unplug_harddisks(void)
|
||||||
|
+{
|
||||||
|
+ IDEState *s;
|
||||||
|
+ int i;
|
||||||
|
+
|
||||||
|
+ if (!principal_ide_controller) {
|
||||||
|
+ fprintf(logfile, "No principal controller?\n");
|
||||||
|
+ return;
|
||||||
|
+ }
|
||||||
|
+ for (i = 0; i < 4; i++) {
|
||||||
|
+ s = principal_ide_controller->ide_if + i;
|
||||||
|
+ if (!s->bs)
|
||||||
|
+ continue; /* drive not present */
|
||||||
|
+ if (s->is_cdrom)
|
||||||
|
+ continue; /* cdrom */
|
||||||
|
+ /* Is a hard disk, unplug it. */
|
||||||
|
+ s->bs = NULL;
|
||||||
|
+ ide_reset(s);
|
||||||
|
+ }
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
struct partition {
|
||||||
|
uint8_t boot_ind; /* 0x80 - active */
|
||||||
|
uint8_t head; /* starting head */
|
||||||
|
@@ -2436,6 +2460,9 @@
|
||||||
|
sizeof(PCIIDEState),
|
||||||
|
-1,
|
||||||
|
NULL, NULL);
|
||||||
|
+ if (principal_ide_controller)
|
||||||
|
+ abort();
|
||||||
|
+ principal_ide_controller = d;
|
||||||
|
d->type = IDE_TYPE_CMD646;
|
||||||
|
pci_conf = d->dev.config;
|
||||||
|
pci_conf[0x00] = 0x95; // CMD646
|
||||||
|
@@ -2493,6 +2520,9 @@
|
||||||
|
NULL, NULL);
|
||||||
|
d->type = IDE_TYPE_PIIX3;
|
||||||
|
|
||||||
|
+ if (principal_ide_controller)
|
||||||
|
+ abort();
|
||||||
|
+ principal_ide_controller = d;
|
||||||
|
pci_conf = d->dev.config;
|
||||||
|
pci_conf[0x00] = 0x86; // Intel
|
||||||
|
pci_conf[0x01] = 0x80;
|
||||||
|
diff -Nuar ioemu-orig/hw/pci.c ioemu/hw/pci.c
|
||||||
|
--- a/tools/ioemu/hw/pci.c 2007-03-01 15:18:35.000000000 -0700
|
||||||
|
+++ b/tools/ioemu/hw/pci.c 2007-03-01 15:19:15.000000000 -0700
|
||||||
|
@@ -514,3 +514,24 @@
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
+void pci_unplug_netifs(void)
|
||||||
|
+{
|
||||||
|
+ PCIBus *bus;
|
||||||
|
+ int x;
|
||||||
|
+
|
||||||
|
+ /* We only support one PCI bus */
|
||||||
|
+ for (bus = first_bus; bus; bus = NULL) {
|
||||||
|
+ for (x = 0; x < 256; x++) {
|
||||||
|
+ if (bus->devices[x] &&
|
||||||
|
+ bus->devices[x]->config[0xa] == 0 &&
|
||||||
|
+ bus->devices[x]->config[0xb] == 2) {
|
||||||
|
+ /* Found a netif. Remove it from the bus. Note that
|
||||||
|
+ we don't free it here, since there could still be
|
||||||
|
+ references to it floating around. There are only
|
||||||
|
+ ever one or two structures leaked, and it's not
|
||||||
|
+ worth finding them all. */
|
||||||
|
+ bus->devices[x] = NULL;
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
+}
|
||||||
|
diff -Nuar ioemu-orig/hw/xen_platform.c ioemu/hw/xen_platform.c
|
||||||
|
--- a/tools/ioemu/hw/xen_platform.c 2007-03-01 15:18:35.000000000 -0700
|
||||||
|
+++ b/tools/ioemu/hw/xen_platform.c 2007-03-01 15:19:15.000000000 -0700
|
||||||
|
@@ -29,9 +29,36 @@
|
||||||
|
|
||||||
|
extern FILE *logfile;
|
||||||
|
|
||||||
|
+static uint32_t ioport_base;
|
||||||
|
+
|
||||||
|
static void platform_ioport_write(void *opaque, uint32_t addr, uint32_t val)
|
||||||
|
{
|
||||||
|
- return;
|
||||||
|
+ DECLARE_DOMCTL;
|
||||||
|
+ int rc;
|
||||||
|
+
|
||||||
|
+ switch (addr - ioport_base) {
|
||||||
|
+ case 0:
|
||||||
|
+ fprintf(logfile, "Init hypercall page %x, addr %x.\n", val, addr);
|
||||||
|
+ domctl.domain = (domid_t)domid;
|
||||||
|
+ domctl.u.hypercall_init.gmfn = val;
|
||||||
|
+ domctl.cmd = XEN_DOMCTL_hypercall_init;
|
||||||
|
+ rc = xc_domctl(xc_handle, &domctl);
|
||||||
|
+ fprintf(logfile, "result -> %d.\n", rc);
|
||||||
|
+ break;
|
||||||
|
+ case 4:
|
||||||
|
+ fprintf(logfile, "Disconnect IDE hard disk...\n");
|
||||||
|
+ ide_unplug_harddisks();
|
||||||
|
+ fprintf(logfile, "Disconnect netifs...\n");
|
||||||
|
+ pci_unplug_netifs();
|
||||||
|
+ fprintf(logfile, "Shutdown taps...\n");
|
||||||
|
+ net_tap_shutdown_all();
|
||||||
|
+ fprintf(logfile, "Done.\n");
|
||||||
|
+ break;
|
||||||
|
+ default:
|
||||||
|
+ fprintf(logfile, "Write to bad port %x (base %x) on evtchn device.\n",
|
||||||
|
+ addr, ioport_base);
|
||||||
|
+ break;
|
||||||
|
+ }
|
||||||
|
}
|
||||||
|
|
||||||
|
static uint32_t platform_ioport_read(void *opaque, uint32_t addr)
|
||||||
|
@@ -42,6 +69,8 @@
|
||||||
|
static void platform_ioport_map(PCIDevice *pci_dev, int region_num,
|
||||||
|
uint32_t addr, uint32_t size, int type)
|
||||||
|
{
|
||||||
|
+ ioport_base = addr;
|
||||||
|
+
|
||||||
|
register_ioport_write(addr, 16, 4, platform_ioport_write, NULL);
|
||||||
|
register_ioport_read(addr, 16, 1, platform_ioport_read, NULL);
|
||||||
|
}
|
||||||
|
diff -Nuar ioemu-orig/vl.c ioemu/vl.c
|
||||||
|
--- a/tools/ioemu/vl.c 2007-03-01 15:18:35.000000000 -0700
|
||||||
|
+++ b/tools/ioemu/vl.c 2007-03-01 15:19:15.000000000 -0700
|
||||||
|
@@ -170,6 +170,19 @@
|
||||||
|
char domain_name[1024] = { 'H','V', 'M', 'X', 'E', 'N', '-'};
|
||||||
|
extern int domid;
|
||||||
|
|
||||||
|
+typedef struct IOHandlerRecord {
|
||||||
|
+ int fd;
|
||||||
|
+ IOCanRWHandler *fd_read_poll;
|
||||||
|
+ IOHandler *fd_read;
|
||||||
|
+ IOHandler *fd_write;
|
||||||
|
+ void *opaque;
|
||||||
|
+ /* temporary data */
|
||||||
|
+ struct pollfd *ufd;
|
||||||
|
+ struct IOHandlerRecord *next;
|
||||||
|
+} IOHandlerRecord;
|
||||||
|
+
|
||||||
|
+static IOHandlerRecord *first_io_handler;
|
||||||
|
+
|
||||||
|
char vncpasswd[64];
|
||||||
|
unsigned char challenge[AUTHCHALLENGESIZE];
|
||||||
|
|
||||||
|
@@ -3084,6 +3097,7 @@
|
||||||
|
typedef struct TAPState {
|
||||||
|
VLANClientState *vc;
|
||||||
|
int fd;
|
||||||
|
+ struct TAPState *next;
|
||||||
|
} TAPState;
|
||||||
|
|
||||||
|
static void tap_receive(void *opaque, const uint8_t *buf, int size)
|
||||||
|
@@ -3111,6 +3125,36 @@
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
+static TAPState *head_net_tap;
|
||||||
|
+
|
||||||
|
+void net_tap_shutdown_all(void)
|
||||||
|
+{
|
||||||
|
+ struct IOHandlerRecord **pioh, *ioh;
|
||||||
|
+
|
||||||
|
+ while (head_net_tap) {
|
||||||
|
+ pioh = &first_io_handler;
|
||||||
|
+ for (;;) {
|
||||||
|
+ ioh = *pioh;
|
||||||
|
+ if (ioh == NULL)
|
||||||
|
+ break;
|
||||||
|
+ if (ioh->fd == head_net_tap->fd) {
|
||||||
|
+ *pioh = ioh->next;
|
||||||
|
+ qemu_free(ioh);
|
||||||
|
+ break;
|
||||||
|
+ }
|
||||||
|
+ pioh = &ioh->next;
|
||||||
|
+ }
|
||||||
|
+ if (!ioh)
|
||||||
|
+ fprintf(stderr,
|
||||||
|
+ "warning: can't find iohandler for %d to close it properly.\n",
|
||||||
|
+ head_net_tap->fd);
|
||||||
|
+ close(head_net_tap->fd);
|
||||||
|
+ head_net_tap = head_net_tap->next;
|
||||||
|
+ }
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+
|
||||||
|
+
|
||||||
|
/* fd support */
|
||||||
|
|
||||||
|
static TAPState *net_tap_fd_init(VLANState *vlan, int fd)
|
||||||
|
@@ -3122,6 +3166,8 @@
|
||||||
|
return NULL;
|
||||||
|
s->fd = fd;
|
||||||
|
s->vc = qemu_new_vlan_client(vlan, tap_receive, NULL, s);
|
||||||
|
+ s->next = head_net_tap;
|
||||||
|
+ head_net_tap = s;
|
||||||
|
qemu_set_fd_handler(s->fd, tap_send, NULL, s);
|
||||||
|
snprintf(s->vc->info_str, sizeof(s->vc->info_str), "tap: fd=%d", fd);
|
||||||
|
return s;
|
||||||
|
@@ -4047,19 +4093,6 @@
|
||||||
|
|
||||||
|
#define MAX_IO_HANDLERS 64
|
||||||
|
|
||||||
|
-typedef struct IOHandlerRecord {
|
||||||
|
- int fd;
|
||||||
|
- IOCanRWHandler *fd_read_poll;
|
||||||
|
- IOHandler *fd_read;
|
||||||
|
- IOHandler *fd_write;
|
||||||
|
- void *opaque;
|
||||||
|
- /* temporary data */
|
||||||
|
- struct pollfd *ufd;
|
||||||
|
- struct IOHandlerRecord *next;
|
||||||
|
-} IOHandlerRecord;
|
||||||
|
-
|
||||||
|
-static IOHandlerRecord *first_io_handler;
|
||||||
|
-
|
||||||
|
/* XXX: fd_read_poll should be suppressed, but an API change is
|
||||||
|
necessary in the character devices to suppress fd_can_read(). */
|
||||||
|
int qemu_set_fd_handler2(int fd,
|
||||||
|
diff -Nuar ioemu-orig/vl.h ioemu/vl.h
|
||||||
|
--- a/tools/ioemu/vl.h 2007-03-01 15:18:35.000000000 -0700
|
||||||
|
+++ b/tools/ioemu/vl.h 2007-03-01 15:19:15.000000000 -0700
|
||||||
|
@@ -826,6 +826,7 @@
|
||||||
|
void pci_piix3_ide_init(PCIBus *bus, BlockDriverState **hd_table, int devfn);
|
||||||
|
int pmac_ide_init (BlockDriverState **hd_table,
|
||||||
|
SetIRQFunc *set_irq, void *irq_opaque, int irq);
|
||||||
|
+void ide_unplug_harddisks(void);
|
||||||
|
|
||||||
|
/* cdrom.c */
|
||||||
|
int cdrom_read_toc(int nb_sectors, uint8_t *buf, int msf, int start_track);
|
||||||
|
@@ -1268,6 +1269,8 @@
|
||||||
|
extern char domain_name[];
|
||||||
|
|
||||||
|
void destroy_hvm_domain(void);
|
||||||
|
+void net_tap_shutdown_all(void);
|
||||||
|
+void pci_unplug_netifs(void);
|
||||||
|
|
||||||
|
/* VNC Authentication */
|
||||||
|
#define AUTHCHALLENGESIZE 16
|
@ -1,8 +1,7 @@
|
|||||||
Index: xen-3.0.4-testing/tools/misc/xend
|
diff -ru xen-3.0.4-testing.orig/tools/misc/xend xen-3.0.4-testing/tools/misc/xend
|
||||||
===================================================================
|
--- xen-3.0.4-testing.orig/tools/misc/xend 2006-12-14 14:49:56.000000000 -0700
|
||||||
--- xen-3.0.4-testing.orig/tools/misc/xend
|
+++ xen-3.0.4-testing/tools/misc/xend 2007-03-01 18:05:38.000000000 -0700
|
||||||
+++ xen-3.0.4-testing/tools/misc/xend
|
@@ -60,22 +60,6 @@
|
||||||
@@ -60,22 +60,6 @@ def hline():
|
|
||||||
def msg(message):
|
def msg(message):
|
||||||
print >>sys.stderr, "*" * 3, message
|
print >>sys.stderr, "*" * 3, message
|
||||||
|
|
||||||
@ -25,7 +24,7 @@ Index: xen-3.0.4-testing/tools/misc/xend
|
|||||||
def check_user():
|
def check_user():
|
||||||
"""Check that the effective user id is 0 (root).
|
"""Check that the effective user id is 0 (root).
|
||||||
"""
|
"""
|
||||||
@@ -102,7 +86,6 @@ def start_blktapctrl():
|
@@ -102,7 +86,6 @@
|
||||||
|
|
||||||
def main():
|
def main():
|
||||||
try:
|
try:
|
||||||
@ -33,16 +32,24 @@ Index: xen-3.0.4-testing/tools/misc/xend
|
|||||||
check_user()
|
check_user()
|
||||||
except CheckError:
|
except CheckError:
|
||||||
sys.exit(1)
|
sys.exit(1)
|
||||||
Index: xen-3.0.4-testing/tools/python/xen/xend/XendDomain.py
|
diff -ru xen-3.0.4-testing.orig/tools/python/xen/xend/XendDomain.py xen-3.0.4-testing/tools/python/xen/xend/XendDomain.py
|
||||||
===================================================================
|
--- xen-3.0.4-testing.orig/tools/python/xen/xend/XendDomain.py 2006-12-18 14:57:04.000000000 -0700
|
||||||
--- xen-3.0.4-testing.orig/tools/python/xen/xend/XendDomain.py
|
+++ xen-3.0.4-testing/tools/python/xen/xend/XendDomain.py 2007-03-01 18:06:31.000000000 -0700
|
||||||
+++ xen-3.0.4-testing/tools/python/xen/xend/XendDomain.py
|
@@ -780,6 +780,8 @@
|
||||||
@@ -780,6 +780,8 @@ class XendDomain:
|
|
||||||
|
|
||||||
if dominfo.getDomid() == DOM0_ID:
|
if dominfo.getDomid() == DOM0_ID:
|
||||||
raise XendError("Cannot save privileged domain %s" % domname)
|
raise XendError("Cannot save privileged domain %s" % domname)
|
||||||
+ if dominfo.readVm('image/ostype') == "hvm":
|
+ if dominfo._readVm('image/ostype') == "hvm":
|
||||||
+ raise XendError("Cannot save fully virtualized domains")
|
+ raise XendError("Cannot save fully virtualized domains")
|
||||||
|
|
||||||
if dominfo.state != DOM_STATE_RUNNING:
|
if dominfo.state != DOM_STATE_RUNNING:
|
||||||
raise XendError("Cannot suspend domain that is not running.")
|
raise XendError("Cannot suspend domain that is not running.")
|
||||||
|
@@ -1158,6 +1160,8 @@
|
||||||
|
|
||||||
|
if dominfo.getDomid() == DOM0_ID:
|
||||||
|
raise XendError("Cannot save privileged domain %i" % domid)
|
||||||
|
+ if dominfo._readVm('image/ostype') == "hvm":
|
||||||
|
+ raise XendError("Cannot save fully virtualized domains")
|
||||||
|
|
||||||
|
fd = os.open(dst, os.O_WRONLY | os.O_CREAT | os.O_TRUNC)
|
||||||
|
try:
|
||||||
|
17
xen-perdomain-free.patch
Normal file
17
xen-perdomain-free.patch
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
Index: xen-3.0.4-testing/xen/arch/x86/domain.c
|
||||||
|
===================================================================
|
||||||
|
--- xen-3.0.4-testing.orig/xen/arch/x86/domain.c
|
||||||
|
+++ xen-3.0.4-testing/xen/arch/x86/domain.c
|
||||||
|
@@ -455,8 +455,10 @@ int arch_domain_create(struct domain *d)
|
||||||
|
fail:
|
||||||
|
free_xenheap_page(d->shared_info);
|
||||||
|
#ifdef __x86_64__
|
||||||
|
- free_domheap_page(virt_to_page(d->arch.mm_perdomain_l2));
|
||||||
|
- free_domheap_page(virt_to_page(d->arch.mm_perdomain_l3));
|
||||||
|
+ if (d->arch.mm_perdomain_l2)
|
||||||
|
+ free_domheap_page(virt_to_page(d->arch.mm_perdomain_l2));
|
||||||
|
+ if (d->arch.mm_perdomain_l3)
|
||||||
|
+ free_domheap_page(virt_to_page(d->arch.mm_perdomain_l3));
|
||||||
|
#endif
|
||||||
|
free_xenheap_pages(d->arch.mm_perdomain_pt, pdpt_order);
|
||||||
|
return rc;
|
@ -1,3 +1,3 @@
|
|||||||
version https://git-lfs.github.com/spec/v1
|
version https://git-lfs.github.com/spec/v1
|
||||||
oid sha256:3253fba32b807e1dbcbc7a3622682790f2fb76a6a09f513975961c8ca43b38e1
|
oid sha256:555986d5b819ceb302b46d7f185b78e21228cfdb4a14fd761c61ae3f9292fd22
|
||||||
size 124352
|
size 138263
|
||||||
|
98
xen.changes
98
xen.changes
@ -1,3 +1,101 @@
|
|||||||
|
-------------------------------------------------------------------
|
||||||
|
Mon Mar 5 09:38:36 MST 2007 - ccoffing@novell.com
|
||||||
|
|
||||||
|
- Default apic=0 for SLES 8 and 9, for performance. (#228133)
|
||||||
|
|
||||||
|
-------------------------------------------------------------------
|
||||||
|
Fri Mar 2 16:58:06 MST 2007 - carnold@novell.com
|
||||||
|
|
||||||
|
- Xen kernel crashes at domain creation time. Bug #248183.
|
||||||
|
Fix mouse for win2k hvm guest.
|
||||||
|
|
||||||
|
-------------------------------------------------------------------
|
||||||
|
Fri Mar 2 13:15:33 MST 2007 - jfehlig@novell.com
|
||||||
|
|
||||||
|
- Incorrect values returned for actions_after_* in Xen API. Added
|
||||||
|
patch xend-actions-after.patch for fix. Patch submitted upstream
|
||||||
|
as well. Bug #250870.
|
||||||
|
|
||||||
|
-------------------------------------------------------------------
|
||||||
|
Fri Mar 2 12:08:55 MST 2007 - ccoffing@novell.com
|
||||||
|
|
||||||
|
- Update vm-install:
|
||||||
|
+ Fixed possible "tree path exception" when editing disk
|
||||||
|
+ Fixed failure to properly refresh fields when editing disk
|
||||||
|
+ #248356: allow specifying bridge
|
||||||
|
|
||||||
|
-------------------------------------------------------------------
|
||||||
|
Fri Mar 2 10:23:38 MST 2007 - jfehlig@novell.com
|
||||||
|
|
||||||
|
- Add check for HVM domain in domain_save. The check is
|
||||||
|
performed in domain_suspend and should be included here as well.
|
||||||
|
|
||||||
|
-------------------------------------------------------------------
|
||||||
|
Thu Mar 1 18:13:20 MST 2007 - ccoffing@novell.com
|
||||||
|
|
||||||
|
- Update vm-install:
|
||||||
|
+ #250201: for linux PVFB, pass xencons=tty if graphics=none
|
||||||
|
+ #250016: honor non-sparse flag
|
||||||
|
|
||||||
|
-------------------------------------------------------------------
|
||||||
|
Thu Mar 1 17:25:44 MST 2007 - jfehlig@novell.com
|
||||||
|
|
||||||
|
- Fix exception caused by incorrect method name in xen-messages.diff.
|
||||||
|
This is one of perhaps several problems with save/restore,
|
||||||
|
bug #237859
|
||||||
|
|
||||||
|
-------------------------------------------------------------------
|
||||||
|
Thu Mar 1 15:43:00 MST 2007 - dpmerrill@novell.com
|
||||||
|
|
||||||
|
- Add xen-ioemu-hvm-pv-support.diff
|
||||||
|
This patch allows for shutting down the IDE drive.
|
||||||
|
|
||||||
|
-------------------------------------------------------------------
|
||||||
|
Thu Mar 1 11:27:00 MST 2007 - jfehlig@novell.com
|
||||||
|
|
||||||
|
- Fix bug #243667
|
||||||
|
+ Updated domUloader to accept '--args' parameter. The args
|
||||||
|
provided as an option to --args are simply added to the sexpr
|
||||||
|
returned by domUloader. pygrub has similar behavior.
|
||||||
|
|
||||||
|
-------------------------------------------------------------------
|
||||||
|
Wed Feb 28 18:16:53 MST 2007 - ccoffing@novell.com
|
||||||
|
|
||||||
|
- Update vm-install:
|
||||||
|
+ #249013, #228113: default to realtek instead of pcnet
|
||||||
|
+ #249124: write os-type to config files
|
||||||
|
+ Updated translations
|
||||||
|
+ Setting os_type should implicitly set full_virt; fixes NIC
|
||||||
|
model exceptions
|
||||||
|
+ Add "Add" button to Operating System Installation page, based
|
||||||
|
on usability feedback
|
||||||
|
|
||||||
|
-------------------------------------------------------------------
|
||||||
|
Wed Feb 28 15:55:15 MST 2007 - jfehlig@novell.com
|
||||||
|
|
||||||
|
- Added changeset 13786 and 14022 from xen-unstable. These
|
||||||
|
changesets affect the Xen API C bindings only and are low risk.
|
||||||
|
This is a continuation of support for FATE feature 110320. ECO
|
||||||
|
has been approved for late arrival of this feature.
|
||||||
|
|
||||||
|
-------------------------------------------------------------------
|
||||||
|
Mon Feb 26 10:39:06 MST 2007 - ccoffing@novell.com
|
||||||
|
|
||||||
|
- Update vm-install:
|
||||||
|
+ #244772: display error message in GUI if xen isn't running
|
||||||
|
+ #246049: better error message when OS==SUSE but ISO looks wrong
|
||||||
|
+ Fix printing of jobid when run with --background
|
||||||
|
|
||||||
|
-------------------------------------------------------------------
|
||||||
|
Wed Feb 21 15:54:51 MST 2007 - ccoffing@novell.com
|
||||||
|
|
||||||
|
- Don't allow "xm create" of running VM. (#245253)
|
||||||
|
- Update vm-install:
|
||||||
|
+ Fix inability to use already-extracted SUSE kernel/initrds
|
||||||
|
+ Fix accumulation of 0-byte tmp files
|
||||||
|
+ #237063: close fds before running vncviewer
|
||||||
|
+ default apic=0 for Windows, due to performance
|
||||||
|
|
||||||
-------------------------------------------------------------------
|
-------------------------------------------------------------------
|
||||||
Tue Feb 20 13:53:22 MST 2007 - carnold@novell.com
|
Tue Feb 20 13:53:22 MST 2007 - carnold@novell.com
|
||||||
|
|
||||||
|
109
xen.spec
109
xen.spec
@ -30,7 +30,7 @@ BuildRequires: glibc-32bit glibc-devel-32bit
|
|||||||
BuildRequires: kernel-source kernel-syms xorg-x11
|
BuildRequires: kernel-source kernel-syms xorg-x11
|
||||||
%endif
|
%endif
|
||||||
Version: 3.0.4_13138
|
Version: 3.0.4_13138
|
||||||
Release: 5
|
Release: 7
|
||||||
License: GNU General Public License (GPL)
|
License: GNU General Public License (GPL)
|
||||||
Group: System/Kernel
|
Group: System/Kernel
|
||||||
Autoreqprov: on
|
Autoreqprov: on
|
||||||
@ -122,15 +122,17 @@ Patch132: domheap-no-dma.patch
|
|||||||
Patch133: 32on64-per-domain-pa-bits.patch
|
Patch133: 32on64-per-domain-pa-bits.patch
|
||||||
Patch134: 32on64-fixes.patch
|
Patch134: 32on64-fixes.patch
|
||||||
Patch135: 32on64-call-gates.patch
|
Patch135: 32on64-call-gates.patch
|
||||||
Patch136: emul-privop-lock.patch
|
Patch136: 32on64-migrate.patch
|
||||||
Patch137: hide-asm-labels.patch
|
Patch137: emul-privop-lock.patch
|
||||||
Patch138: bug.patch
|
Patch138: hide-asm-labels.patch
|
||||||
Patch139: x86-mm-simplify.patch
|
Patch139: bug.patch
|
||||||
Patch140: vgacon-50-lines.patch
|
Patch140: x86-mm-simplify.patch
|
||||||
Patch141: vgacon-keep.patch
|
Patch141: vgacon-50-lines.patch
|
||||||
Patch142: x86-ptwr_emulate.patch
|
Patch142: vgacon-keep.patch
|
||||||
Patch143: pae-guest-linear-pgtable.patch
|
Patch143: x86-ptwr_emulate.patch
|
||||||
Patch144: suppress-rdtscp.patch
|
Patch144: suppress-rdtscp.patch
|
||||||
|
Patch145: pae-guest-linear-pgtable.patch
|
||||||
|
Patch146: x86-nmi-inject.patch
|
||||||
## Gerd's patches begin here
|
## Gerd's patches begin here
|
||||||
# fix cross-build for tools
|
# fix cross-build for tools
|
||||||
Patch150: cross-build-fix.diff
|
Patch150: cross-build-fix.diff
|
||||||
@ -170,11 +172,12 @@ Patch210: microcode-xen-13079.diff
|
|||||||
Patch211: xen-localtime.patch
|
Patch211: xen-localtime.patch
|
||||||
Patch212: svm-update-v_tpr-on-mmio.patch
|
Patch212: svm-update-v_tpr-on-mmio.patch
|
||||||
Patch213: svm_cpuid_ffxsr_13743.patch
|
Patch213: svm_cpuid_ffxsr_13743.patch
|
||||||
Patch214: 13630-domctl.patch
|
Patch214: 13574-win2k-mouse.patch
|
||||||
Patch215: 13903-domctl.patch
|
Patch215: 13630-domctl.patch
|
||||||
Patch216: 13908-domctl.patch
|
Patch216: 13903-domctl.patch
|
||||||
Patch217: bugfix-246160-domctl.patch
|
Patch217: 13908-domctl.patch
|
||||||
Patch218: x86-nmi-inject.patch
|
Patch218: bugfix-246160-domctl.patch
|
||||||
|
Patch219: xen-perdomain-free.patch
|
||||||
# pv driver building
|
# pv driver building
|
||||||
Patch250: pv-driver-build.patch
|
Patch250: pv-driver-build.patch
|
||||||
# Jim' Xen API patches
|
# Jim' Xen API patches
|
||||||
@ -198,9 +201,14 @@ Patch286: 13775_xenapi.patch
|
|||||||
Patch287: 13777_xenapi.patch
|
Patch287: 13777_xenapi.patch
|
||||||
Patch288: 13778_xenapi.patch
|
Patch288: 13778_xenapi.patch
|
||||||
Patch289: 13784_xenapi.patch
|
Patch289: 13784_xenapi.patch
|
||||||
Patch290: 13787_xenapi.patch
|
Patch290: 13786_xenapi.patch
|
||||||
Patch291: libxen_permissive.patch
|
Patch291: 13787_xenapi.patch
|
||||||
Patch292: xend_disk_decorate_rm.patch
|
Patch292: 14022_xenapi.patch
|
||||||
|
Patch293: libxen_permissive.patch
|
||||||
|
Patch294: xend_disk_decorate_rm.patch
|
||||||
|
Patch295: xend_multiple_create.patch
|
||||||
|
Patch296: xen-ioemu-hvm-pv-support.diff
|
||||||
|
Patch297: xend-actions-after.patch
|
||||||
# Misc unused patches / need to be re-ported:
|
# Misc unused patches / need to be re-ported:
|
||||||
Patch300: xen-enable-hvm-debug.diff
|
Patch300: xen-enable-hvm-debug.diff
|
||||||
Patch301: xen-removable.diff
|
Patch301: xen-removable.diff
|
||||||
@ -658,6 +666,8 @@ cd ..
|
|||||||
%patch142 -p1
|
%patch142 -p1
|
||||||
%patch143 -p1
|
%patch143 -p1
|
||||||
%patch144 -p1
|
%patch144 -p1
|
||||||
|
%patch145 -p1
|
||||||
|
%patch146 -p1
|
||||||
%patch150 -p1
|
%patch150 -p1
|
||||||
%patch151 -p1
|
%patch151 -p1
|
||||||
%patch152 -p1
|
%patch152 -p1
|
||||||
@ -691,6 +701,7 @@ cd ..
|
|||||||
%patch216 -p1
|
%patch216 -p1
|
||||||
%patch217 -p1
|
%patch217 -p1
|
||||||
%patch218 -p1
|
%patch218 -p1
|
||||||
|
%patch219 -p1
|
||||||
%patch250 -p1
|
%patch250 -p1
|
||||||
%patch270 -p1
|
%patch270 -p1
|
||||||
%patch271 -p1
|
%patch271 -p1
|
||||||
@ -715,6 +726,11 @@ cd ..
|
|||||||
%patch290 -p1
|
%patch290 -p1
|
||||||
%patch291 -p1
|
%patch291 -p1
|
||||||
%patch292 -p1
|
%patch292 -p1
|
||||||
|
%patch293 -p1
|
||||||
|
%patch294 -p1
|
||||||
|
%patch295 -p1
|
||||||
|
%patch296 -p1
|
||||||
|
%patch297 -p1
|
||||||
XEN_EXTRAVERSION=%version-%release
|
XEN_EXTRAVERSION=%version-%release
|
||||||
XEN_EXTRAVERSION=${XEN_EXTRAVERSION#%{xvers}}
|
XEN_EXTRAVERSION=${XEN_EXTRAVERSION#%{xvers}}
|
||||||
sed -i "s/XEN_EXTRAVERSION[ ]*.=.*\$/XEN_EXTRAVERSION = $XEN_EXTRAVERSION/" xen/Makefile
|
sed -i "s/XEN_EXTRAVERSION[ ]*.=.*\$/XEN_EXTRAVERSION = $XEN_EXTRAVERSION/" xen/Makefile
|
||||||
@ -1032,6 +1048,65 @@ rm -f $RPM_BUILD_ROOT/%pysite/*.egg-info
|
|||||||
%{insserv_cleanup}
|
%{insserv_cleanup}
|
||||||
|
|
||||||
%changelog
|
%changelog
|
||||||
|
* Mon Mar 05 2007 - ccoffing@novell.com
|
||||||
|
- Default apic=0 for SLES 8 and 9, for performance. (#228133)
|
||||||
|
* Fri Mar 02 2007 - carnold@novell.com
|
||||||
|
- Xen kernel crashes at domain creation time. Bug #248183.
|
||||||
|
Fix mouse for win2k hvm guest.
|
||||||
|
* Fri Mar 02 2007 - jfehlig@novell.com
|
||||||
|
- Incorrect values returned for actions_after_* in Xen API. Added
|
||||||
|
patch xend-actions-after.patch for fix. Patch submitted upstream
|
||||||
|
as well. Bug #250870.
|
||||||
|
* Fri Mar 02 2007 - ccoffing@novell.com
|
||||||
|
- Update vm-install:
|
||||||
|
+ Fixed possible "tree path exception" when editing disk
|
||||||
|
+ Fixed failure to properly refresh fields when editing disk
|
||||||
|
+ #248356: allow specifying bridge
|
||||||
|
* Fri Mar 02 2007 - jfehlig@novell.com
|
||||||
|
- Add check for HVM domain in domain_save. The check is
|
||||||
|
performed in domain_suspend and should be included here as well.
|
||||||
|
* Thu Mar 01 2007 - ccoffing@novell.com
|
||||||
|
- Update vm-install:
|
||||||
|
+ #250201: for linux PVFB, pass xencons=tty if graphics=none
|
||||||
|
+ #250016: honor non-sparse flag
|
||||||
|
* Thu Mar 01 2007 - jfehlig@novell.com
|
||||||
|
- Fix exception caused by incorrect method name in xen-messages.diff.
|
||||||
|
This is one of perhaps several problems with save/restore,
|
||||||
|
bug #237859
|
||||||
|
* Thu Mar 01 2007 - dpmerrill@novell.com
|
||||||
|
- Add xen-ioemu-hvm-pv-support.diff
|
||||||
|
This patch allows for shutting down the IDE drive.
|
||||||
|
* Thu Mar 01 2007 - jfehlig@novell.com
|
||||||
|
- Fix bug #243667
|
||||||
|
+ Updated domUloader to accept '--args' parameter. The args
|
||||||
|
provided as an option to --args are simply added to the sexpr
|
||||||
|
returned by domUloader. pygrub has similar behavior.
|
||||||
|
* Wed Feb 28 2007 - ccoffing@novell.com
|
||||||
|
- Update vm-install:
|
||||||
|
+ #249013, #228113: default to realtek instead of pcnet
|
||||||
|
+ #249124: write os-type to config files
|
||||||
|
+ Updated translations
|
||||||
|
+ Setting os_type should implicitly set full_virt; fixes NIC
|
||||||
|
model exceptions
|
||||||
|
+ Add "Add" button to Operating System Installation page, based
|
||||||
|
on usability feedback
|
||||||
|
* Wed Feb 28 2007 - jfehlig@novell.com
|
||||||
|
- Added changeset 13786 and 14022 from xen-unstable. These
|
||||||
|
changesets affect the Xen API C bindings only and are low risk.
|
||||||
|
This is a continuation of support for FATE feature 110320. ECO
|
||||||
|
has been approved for late arrival of this feature.
|
||||||
|
* Mon Feb 26 2007 - ccoffing@novell.com
|
||||||
|
- Update vm-install:
|
||||||
|
+ #244772: display error message in GUI if xen isn't running
|
||||||
|
+ #246049: better error message when OS==SUSE but ISO looks wrong
|
||||||
|
+ Fix printing of jobid when run with --background
|
||||||
|
* Wed Feb 21 2007 - ccoffing@novell.com
|
||||||
|
- Don't allow "xm create" of running VM. (#245253)
|
||||||
|
- Update vm-install:
|
||||||
|
+ Fix inability to use already-extracted SUSE kernel/initrds
|
||||||
|
+ Fix accumulation of 0-byte tmp files
|
||||||
|
+ #237063: close fds before running vncviewer
|
||||||
|
+ default apic=0 for Windows, due to performance
|
||||||
* Tue Feb 20 2007 - carnold@novell.com
|
* Tue Feb 20 2007 - carnold@novell.com
|
||||||
- Domain0 reboots after 2-6 hours of running guests. (#246160)
|
- Domain0 reboots after 2-6 hours of running guests. (#246160)
|
||||||
* Tue Feb 20 2007 - ccoffing@novell.com
|
* Tue Feb 20 2007 - ccoffing@novell.com
|
||||||
|
44
xend-actions-after.patch
Normal file
44
xend-actions-after.patch
Normal file
@ -0,0 +1,44 @@
|
|||||||
|
# HG changeset patch
|
||||||
|
# User Jim Fehlig <jfehlig@novell.com>
|
||||||
|
# Date 1172864588 25200
|
||||||
|
# Node ID 9e87f7af7f21182be5080cac0e4715053529a797
|
||||||
|
# Parent 3ac19fda0bc256bac20a4decf7e13bb086162220
|
||||||
|
VM.actions_after_[shutdown|reboot|suspend|crash] were not set properly in VM record returned via Xen API.
|
||||||
|
This patch fixes typos in key name for these fields.
|
||||||
|
|
||||||
|
Signed-off-by: Jim Fehlig <jfehlig@novell.com>
|
||||||
|
|
||||||
|
diff -r 3ac19fda0bc2 -r 9e87f7af7f21 tools/python/xen/xend/XendDomainInfo.py
|
||||||
|
--- a/tools/python/xen/xend/XendDomainInfo.py Fri Mar 02 12:11:52 2007 +0000
|
||||||
|
+++ b/tools/python/xen/xend/XendDomainInfo.py Fri Mar 02 12:43:08 2007 -0700
|
||||||
|
@@ -2090,26 +2090,26 @@ class XendDomainInfo:
|
||||||
|
return self.info.get('tools_version', {})
|
||||||
|
|
||||||
|
def get_on_shutdown(self):
|
||||||
|
- after_shutdown = self.info.get('action_after_shutdown')
|
||||||
|
+ after_shutdown = self.info.get('actions_after_shutdown')
|
||||||
|
if not after_shutdown or after_shutdown not in XEN_API_ON_NORMAL_EXIT:
|
||||||
|
return XEN_API_ON_NORMAL_EXIT[-1]
|
||||||
|
return after_shutdown
|
||||||
|
|
||||||
|
def get_on_reboot(self):
|
||||||
|
- after_reboot = self.info.get('action_after_reboot')
|
||||||
|
+ after_reboot = self.info.get('actions_after_reboot')
|
||||||
|
if not after_reboot or after_reboot not in XEN_API_ON_NORMAL_EXIT:
|
||||||
|
return XEN_API_ON_NORMAL_EXIT[-1]
|
||||||
|
return after_reboot
|
||||||
|
|
||||||
|
def get_on_suspend(self):
|
||||||
|
# TODO: not supported
|
||||||
|
- after_suspend = self.info.get('action_after_suspend')
|
||||||
|
+ after_suspend = self.info.get('actions_after_suspend')
|
||||||
|
if not after_suspend or after_suspend not in XEN_API_ON_NORMAL_EXIT:
|
||||||
|
return XEN_API_ON_NORMAL_EXIT[-1]
|
||||||
|
return after_suspend
|
||||||
|
|
||||||
|
def get_on_crash(self):
|
||||||
|
- after_crash = self.info.get('action_after_crash')
|
||||||
|
+ after_crash = self.info.get('actions_after_crash')
|
||||||
|
if not after_crash or after_crash not in XEN_API_ON_CRASH_BEHAVIOUR:
|
||||||
|
return XEN_API_ON_CRASH_BEHAVIOUR[0]
|
||||||
|
return after_crash
|
26
xend_multiple_create.patch
Normal file
26
xend_multiple_create.patch
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
Bugzilla #245253
|
||||||
|
|
||||||
|
Index: xen-3.0.4-testing/tools/python/xen/xend/XendDomain.py
|
||||||
|
===================================================================
|
||||||
|
--- xen-3.0.4-testing.orig/tools/python/xen/xend/XendDomain.py
|
||||||
|
+++ xen-3.0.4-testing/tools/python/xen/xend/XendDomain.py
|
||||||
|
@@ -32,6 +32,7 @@ import threading
|
||||||
|
import xen.lowlevel.xc
|
||||||
|
|
||||||
|
|
||||||
|
+from xen.xend import sxp
|
||||||
|
from xen.xend import XendRoot, XendCheckpoint, XendDomainInfo
|
||||||
|
from xen.xend.PrettyPrint import prettyprint
|
||||||
|
from xen.xend.XendConfig import XendConfig
|
||||||
|
@@ -860,6 +861,11 @@ class XendDomain:
|
||||||
|
self.domains_lock.acquire()
|
||||||
|
try:
|
||||||
|
self._refresh()
|
||||||
|
+ for domid, dom in self.domains.items():
|
||||||
|
+ if (dom.state != DOM_STATE_HALTED and
|
||||||
|
+ (dom.getName() == sxp.child_value(config, 'name') or
|
||||||
|
+ dom.get_uuid() == sxp.child_value(config, 'uuid'))):
|
||||||
|
+ raise XendError("Domain is already running")
|
||||||
|
|
||||||
|
dominfo = XendDomainInfo.create(config)
|
||||||
|
self._add_domain(dominfo)
|
Loading…
x
Reference in New Issue
Block a user