aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--.hgignore3
-rw-r--r--docs/misc/VMX_changes.txt2
-rw-r--r--docs/misc/hg-cheatsheet.txt14
-rw-r--r--docs/misc/vtpm.txt2
-rw-r--r--docs/misc/xenstore.txt4
-rw-r--r--docs/src/interface.tex10
-rw-r--r--docs/src/user.tex4
-rw-r--r--docs/xen-api/presentation.tex2
-rw-r--r--docs/xen-api/todo.tex2
-rw-r--r--docs/xen-api/wire-protocol.tex6
-rw-r--r--docs/xen-api/xenapi-datamodel.tex8
-rw-r--r--extras/mini-os/blkfront.c178
-rw-r--r--extras/mini-os/include/blkfront.h12
-rw-r--r--extras/mini-os/kernel.c39
-rw-r--r--extras/mini-os/lib/xmalloc.c14
-rw-r--r--stubdom/stubdom-dm2
-rw-r--r--tools/blktap/drivers/block-qcow.c2
-rw-r--r--tools/examples/xend-config-xenapi.sxp11
-rw-r--r--tools/examples/xend-config.sxp11
-rw-r--r--tools/firmware/Rules.mk17
-rw-r--r--tools/firmware/etherboot/Makefile15
-rw-r--r--tools/firmware/etherboot/eb-roms.h5695
-rwxr-xr-xtools/firmware/etherboot/make-eb-rom-list11
-rw-r--r--tools/firmware/extboot/Makefile12
-rw-r--r--tools/firmware/hvmloader/Makefile17
-rw-r--r--tools/firmware/hvmloader/acpi/Makefile12
-rw-r--r--tools/firmware/hvmloader/hvmloader.c93
-rw-r--r--tools/firmware/hvmloader/option_rom.h50
-rw-r--r--tools/firmware/hvmloader/smp.c132
-rw-r--r--tools/firmware/hvmloader/util.c38
-rw-r--r--tools/firmware/hvmloader/util.h5
-rw-r--r--tools/firmware/rombios/32bit/Makefile8
-rw-r--r--tools/firmware/rombios/32bit/tcgbios/Makefile8
-rw-r--r--tools/firmware/rombios/32bit/tcgbios/tcgbios.c2
-rw-r--r--tools/ioemu/Makefile11
-rw-r--r--tools/ioemu/block-cow.c3
-rw-r--r--tools/ioemu/block-vbd.c44
-rw-r--r--tools/ioemu/block.c4
-rw-r--r--tools/ioemu/hw/ide.c5
-rw-r--r--tools/ioemu/hw/rtl8139.c18
-rw-r--r--tools/ioemu/hw/xen_machine_fv.c1
-rw-r--r--tools/ioemu/osdep.c3
-rw-r--r--tools/ioemu/qemu-img.c4
-rw-r--r--tools/ioemu/tapdisk-ioemu.c142
-rw-r--r--tools/ioemu/target-i386-dm/helper2.c2
-rw-r--r--tools/ioemu/vl.c38
-rw-r--r--tools/ioemu/vl.h4
-rw-r--r--tools/ioemu/xenstore.c12
-rw-r--r--tools/libxc/xc_domain.c31
-rw-r--r--tools/libxc/xc_domain_restore.c28
-rw-r--r--tools/libxc/xc_domain_save.c62
-rw-r--r--tools/libxc/xc_evtchn.c24
-rw-r--r--tools/libxc/xc_hvm_build.c87
-rw-r--r--tools/libxc/xenctrl.h3
-rw-r--r--tools/libxc/xg_private.c17
-rw-r--r--tools/libxc/xg_private.h2
-rw-r--r--tools/python/xen/util/acmpolicy.py26
-rw-r--r--tools/python/xen/util/xsm/acm/acm.py21
-rw-r--r--tools/python/xen/xend/XendConstants.py1
-rw-r--r--tools/python/xen/xend/XendDomainInfo.py10
-rw-r--r--tools/python/xen/xend/XendOptions.py7
-rw-r--r--tools/python/xen/xend/balloon.py17
-rw-r--r--tools/python/xen/xend/image.py7
-rw-r--r--tools/python/xen/xm/main.py10
-rw-r--r--tools/python/xen/xm/shutdown.py2
-rw-r--r--tools/security/Makefile2
-rw-r--r--tools/security/policies/DEFAULT-UL-security_policy.xml41
-rw-r--r--tools/tests/blowfish.mk8
-rw-r--r--tools/xcutils/Makefile2
-rw-r--r--tools/xcutils/lsevtchn.c59
-rw-r--r--tools/xenstore/Makefile38
-rw-r--r--tools/xenstore/xenstore_client.c591
-rw-r--r--tools/xenstore/xenstored_core.c2
-rw-r--r--tools/xenstore/xenstored_solaris.c1
-rw-r--r--tools/xenstore/xenstored_watch.c2
-rw-r--r--tools/xenstore/xs.c100
-rw-r--r--tools/xenstore/xsls.c171
-rw-r--r--xen/arch/ia64/linux-xen/sn/kernel/irq.c2
-rw-r--r--xen/arch/ia64/vmx/vmx_hypercall.c5
-rw-r--r--xen/arch/ia64/xen/mm.c10
-rw-r--r--xen/arch/ia64/xen/tlb_track.c4
-rw-r--r--xen/arch/ia64/xen/xensetup.c2
-rw-r--r--xen/arch/x86/Makefile1
-rw-r--r--xen/arch/x86/acpi/boot.c62
-rw-r--r--xen/arch/x86/cpu/amd.c18
-rw-r--r--xen/arch/x86/domain.c25
-rw-r--r--xen/arch/x86/domain_build.c4
-rw-r--r--xen/arch/x86/hvm/emulate.c81
-rw-r--r--xen/arch/x86/hvm/hpet.c21
-rw-r--r--xen/arch/x86/hvm/hvm.c192
-rw-r--r--xen/arch/x86/hvm/i8254.c68
-rw-r--r--xen/arch/x86/hvm/intercept.c161
-rw-r--r--xen/arch/x86/hvm/io.c84
-rw-r--r--xen/arch/x86/hvm/mtrr.c2
-rw-r--r--xen/arch/x86/hvm/pmtimer.c8
-rw-r--r--xen/arch/x86/hvm/rtc.c8
-rw-r--r--xen/arch/x86/hvm/stdvga.c26
-rw-r--r--xen/arch/x86/hvm/svm/svm.c7
-rw-r--r--xen/arch/x86/hvm/vioapic.c54
-rw-r--r--xen/arch/x86/hvm/vlapic.c303
-rw-r--r--xen/arch/x86/hvm/vmx/realmode.c2
-rw-r--r--xen/arch/x86/hvm/vmx/vmcs.c85
-rw-r--r--xen/arch/x86/hvm/vmx/vmx.c295
-rw-r--r--xen/arch/x86/hvm/vmx/x86_32/exits.S2
-rw-r--r--xen/arch/x86/hvm/vmx/x86_64/exits.S2
-rw-r--r--xen/arch/x86/hvm/vpic.c40
-rw-r--r--xen/arch/x86/io_apic.c9
-rw-r--r--xen/arch/x86/mm.c51
-rw-r--r--xen/arch/x86/mm/hap/Makefile1
-rw-r--r--xen/arch/x86/mm/hap/hap.c12
-rw-r--r--xen/arch/x86/mm/hap/p2m-ept.c257
-rw-r--r--xen/arch/x86/mm/p2m.c357
-rw-r--r--xen/arch/x86/mm/paging.c15
-rw-r--r--xen/arch/x86/mm/shadow/common.c8
-rw-r--r--xen/arch/x86/pci.c118
-rw-r--r--xen/arch/x86/setup.c2
-rw-r--r--xen/arch/x86/time.c142
-rw-r--r--xen/arch/x86/traps.c295
-rw-r--r--xen/arch/x86/x86_64/compat/mm.c4
-rw-r--r--xen/arch/x86/x86_64/mm.c8
-rw-r--r--xen/common/compat/domain.c4
-rw-r--r--xen/common/compat/grant_table.c20
-rw-r--r--xen/common/domain.c10
-rw-r--r--xen/common/domctl.c7
-rw-r--r--xen/common/event_channel.c12
-rw-r--r--xen/common/grant_table.c6
-rw-r--r--xen/common/keyhandler.c8
-rw-r--r--xen/common/memory.c25
-rw-r--r--xen/common/page_alloc.c27
-rw-r--r--xen/common/softirq.c102
-rw-r--r--xen/common/trace.c9
-rw-r--r--xen/common/xencomm.c1
-rw-r--r--xen/drivers/passthrough/amd/iommu_detect.c37
-rw-r--r--xen/drivers/passthrough/amd/iommu_init.c2
-rw-r--r--xen/drivers/passthrough/amd/iommu_map.c74
-rw-r--r--xen/drivers/passthrough/amd/pci_amd_iommu.c11
-rw-r--r--xen/drivers/passthrough/io.c72
-rw-r--r--xen/drivers/passthrough/iommu.c2
-rw-r--r--xen/drivers/passthrough/pci-direct.h48
-rw-r--r--xen/drivers/passthrough/vtd/Makefile2
-rw-r--r--xen/drivers/passthrough/vtd/dmar.c26
-rw-r--r--xen/drivers/passthrough/vtd/dmar.h8
-rw-r--r--xen/drivers/passthrough/vtd/intremap.c58
-rw-r--r--xen/drivers/passthrough/vtd/iommu.c476
-rw-r--r--xen/drivers/passthrough/vtd/iommu.h4
-rw-r--r--xen/drivers/passthrough/vtd/qinval.c89
-rw-r--r--xen/drivers/passthrough/vtd/utils.c69
-rw-r--r--xen/drivers/passthrough/vtd/vtd.h9
-rw-r--r--xen/drivers/passthrough/vtd/x86/Makefile1
-rw-r--r--xen/drivers/passthrough/vtd/x86/vtd.c303
-rw-r--r--xen/include/asm-ia64/domain.h2
-rw-r--r--xen/include/asm-ia64/linux-xen/asm/sn/README.origin1
-rw-r--r--xen/include/asm-ia64/linux-xen/asm/sn/pcibr_provider.h2
-rw-r--r--xen/include/asm-ia64/linux-xen/asm/sn/pcidev.h (renamed from xen/include/asm-ia64/linux/asm/sn/pcidev.h)4
-rw-r--r--xen/include/asm-ia64/linux-xen/linux/interrupt.h2
-rw-r--r--xen/include/asm-ia64/linux-xen/linux/linux-pci.h (renamed from xen/include/asm-ia64/linux-xen/linux/pci.h)0
-rw-r--r--xen/include/asm-ia64/linux/asm/sn/README.origin1
-rw-r--r--xen/include/asm-x86/domain.h26
-rw-r--r--xen/include/asm-x86/hvm/domain.h12
-rw-r--r--xen/include/asm-x86/hvm/hvm.h4
-rw-r--r--xen/include/asm-x86/hvm/io.h21
-rw-r--r--xen/include/asm-x86/hvm/svm/amd-iommu-proto.h1
-rw-r--r--xen/include/asm-x86/hvm/svm/vmcb.h6
-rw-r--r--xen/include/asm-x86/hvm/vcpu.h6
-rw-r--r--xen/include/asm-x86/hvm/vlapic.h2
-rw-r--r--xen/include/asm-x86/hvm/vmx/vmcs.h47
-rw-r--r--xen/include/asm-x86/hvm/vmx/vmx.h126
-rw-r--r--xen/include/asm-x86/mm.h3
-rw-r--r--xen/include/asm-x86/numa.h1
-rw-r--r--xen/include/asm-x86/p2m.h80
-rw-r--r--xen/include/asm-x86/paging.h2
-rw-r--r--xen/include/public/hvm/params.h8
-rw-r--r--xen/include/xen/hvm/iommu.h5
-rw-r--r--xen/include/xen/hypercall.h1
-rw-r--r--xen/include/xen/iommu.h6
-rw-r--r--xen/include/xen/mm.h7
-rw-r--r--xen/include/xen/numa.h7
-rw-r--r--xen/include/xen/pci.h29
-rw-r--r--xen/include/xen/sched.h9
-rw-r--r--xen/include/xen/softirq.h59
-rw-r--r--xen/include/xen/xencomm.h8
-rw-r--r--xen/xsm/acm/acm_chinesewall_hooks.c8
-rw-r--r--xen/xsm/acm/acm_simple_type_enforcement_hooks.c12
183 files changed, 7494 insertions, 5493 deletions
diff --git a/.hgignore b/.hgignore
index 7c7d4a9d86..5913471871 100644
--- a/.hgignore
+++ b/.hgignore
@@ -150,6 +150,7 @@
^tools/ioemu/qemu-tech\.html$
^tools/ioemu/qemu\.1$
^tools/ioemu/qemu\.pod$
+^tools/ioemu/tapdisk-ioemu$
^tools/libxc/ia64/asm/.*\.h$
^tools/libxc/ia64/acpi/.*\.h$
^tools/libxc/ia64/acpi/platform/.*\.h$
@@ -198,6 +199,7 @@
^tools/vtpm/tpm_emulator/.*$
^tools/vtpm/vtpm/.*$
^tools/vtpm_manager/manager/vtpm_managerd$
+^tools/xcutils/lsevtchn$
^tools/xcutils/xc_restore$
^tools/xcutils/xc_save$
^tools/xcutils/readnotes$
@@ -208,6 +210,7 @@
^tools/xenstat/xentop/xentop$
^tools/xenstore/testsuite/tmp/.*$
^tools/xenstore/xen$
+^tools/xenstore/xenstore$
^tools/xenstore/xenstore-chmod$
^tools/xenstore/xenstore-exists$
^tools/xenstore/xenstore-list$
diff --git a/docs/misc/VMX_changes.txt b/docs/misc/VMX_changes.txt
index 739d315e79..276af66e25 100644
--- a/docs/misc/VMX_changes.txt
+++ b/docs/misc/VMX_changes.txt
@@ -79,7 +79,7 @@ Changes to the existing code:
* include/asm-x86/processor.h: struct arch_vmx_struct arch_vmx has
been added to the thread_struct data structure. The arch_vmx has
- the addtional VMX-related CPU context.
+ the additional VMX-related CPU context.
* arch/x86/io_apic.c: reverse mapping between vector and irq has
been added. We will revisit this code when considering MSI
diff --git a/docs/misc/hg-cheatsheet.txt b/docs/misc/hg-cheatsheet.txt
index 1feb4ec6d9..fa13eefbf9 100644
--- a/docs/misc/hg-cheatsheet.txt
+++ b/docs/misc/hg-cheatsheet.txt
@@ -12,7 +12,7 @@ control. This note aims to provide a quick guide to getting up and
running with the new tools as quickly as possible, and is written from
the perspective of someone who has been using BK.
-For a more detailed exposition, see the mecurial tutorial:
+For a more detailed exposition, see the mercurial tutorial:
http://www.serpentine.com/mercurial/index.cgi?Tutorial
The Hg manpage is available at:
@@ -69,7 +69,7 @@ descendent in one repository -- something BK won't allow. This is
actually pretty neat. For example, it would in principle enable you to
have both the 2.0-testing and unstable trees in a single
repository. We shyed away from doing this as we thought the risk of
-commiting to the wrong head was too great.
+committing to the wrong head was too great.
One slightly confusing aspect of Hg is that many of the commands have
aliases, and hence when looking things up in the man page its not
@@ -81,7 +81,7 @@ more sense, at least to RCS refugees like me.
Getting Xen
-----------
-The URL for the mainline Xen mercurial respository is:
+The URL for the mainline Xen mercurial repository is:
http://xenbits.xensource.com/xen-unstable.hg
(similarly for xen-2.0 and xen-2.0-testing)
@@ -273,9 +273,9 @@ Pushing changesets to a parent repository
Pushes changes up to a parent. You can't push if you pulled the
repository off the web interface. In fact, you can currently only push
-to an ssh target -- filesystem drectory targets don't work, but this
+to an ssh target -- filesystem directory targets don't work, but this
will be fixed soon.
-For now it is possible to set up assymetric pull/push paths. Pulls can
+For now it is possible to set up asymmetric pull/push paths. Pulls can
be done via web interface while pushes via ssh. Example of .hg/hgrc config
file:
| [paths]
@@ -332,7 +332,7 @@ by other checked-out versions. This can confuse the Xen build
system. Hg will probably get fixed soon, but in the meantime you can
cleanup with "find -depth -type d -print | xargs -r rmdir".
-You can return to the tip by ommiting an explicit changeset id.
+You can return to the tip by omitting an explicit changeset id.
The manifest command lets you see the contents of the repository for
the current changeset.
@@ -347,7 +347,7 @@ This will print a bunch of records of the form:
| 7fc869aae2945a9f4626fad96552db3103e61cb9 644 README
| ...
-This lists the hash of each file, its 1-bit 'executable' atribute
+This lists the hash of each file, its 1-bit 'executable' attribute
(either file permission mode 644 or 755), and the file name. So, to
determine the files that change across two changesets, you would dump
the respective manifests to files, and use diff.
diff --git a/docs/misc/vtpm.txt b/docs/misc/vtpm.txt
index e38ccb236a..62479ff85d 100644
--- a/docs/misc/vtpm.txt
+++ b/docs/misc/vtpm.txt
@@ -143,7 +143,7 @@ PCR-07: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
PCR-08: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
[...]
-At this point the user domain has been sucessfully connected to its
+At this point the user domain has been successfully connected to its
virtual TPM instance.
For further information please read the documentation in
diff --git a/docs/misc/xenstore.txt b/docs/misc/xenstore.txt
index baf2c42dc0..f46cf4f525 100644
--- a/docs/misc/xenstore.txt
+++ b/docs/misc/xenstore.txt
@@ -129,7 +129,7 @@ The following are the actual type values, including the request and
reply payloads as applicable:
----------- Database read, write and permissions operatons ----------
+---------- Database read, write and permissions operations ----------
READ <path>| <value|>
WRITE <path>|<value|>
@@ -206,7 +206,7 @@ WATCH_EVENT <epath>|<token>|
as described above. req_id and tx_id are both 0.
<epath> is the event's path, ie the actual path that was
- modifed; however if the event was the recursive removal of an
+ modified; however if the event was the recursive removal of an
parent of <wpath>, <epath> is just
<wpath> (rather than the actual path which was removed). So
<epath> is a child of <wpath>, regardless.
diff --git a/docs/src/interface.tex b/docs/src/interface.tex
index e4292d8531..5fa0c5fd68 100644
--- a/docs/src/interface.tex
+++ b/docs/src/interface.tex
@@ -470,7 +470,7 @@ typedef struct shared_info {
* are delivered by this mechanism:
* 1. Bi-directional inter- and intra-domain connections. Domains must
* arrange out-of-band to set up a connection (usually by allocating
- * an unbound 'listener' port and avertising that via a storage service
+ * an unbound 'listener' port and advertising that via a storage service
* such as xenstore).
* 2. Physical interrupts. A domain with suitable hardware-access
* privileges can bind an event-channel port to a physical interrupt
@@ -915,7 +915,7 @@ These activities include:
(e.g. performance-related statistics, etc).
\end{itemize}
-The store is arranged as a hierachical collection of key-value pairs.
+The store is arranged as a hierarchical collection of key-value pairs.
Each domain has a directory hierarchy containing data related to its
configuration. Domains are permitted to register for notifications
about changes in subtrees of the store, and to apply changes to the
@@ -1114,9 +1114,9 @@ This path contains:
\end{description}
\end{description}
- \item[device-misc/] miscellanous information for devices
+ \item[device-misc/] miscellaneous information for devices
\begin{description}
- \item[vif/] miscellanous information for vif devices
+ \item[vif/] miscellaneous information for vif devices
\begin{description}
\item[nextDeviceID] the next device id to use
\end{description}
@@ -1511,7 +1511,7 @@ Otherwise an error message is automatically sent back by the device driver.
The virtual TPM implementation listens for TPM request on /dev/vtpm. Since
it must be able to apply the TPM request packet to the virtual TPM instance
associated with the virtual machine, a 4-byte virtual TPM instance
-identifier is prepended to each packet by the backend driver (in network
+identifier is pretended to each packet by the backend driver (in network
byte order) for internal routing of the request.
\subsection{Virtual TPM ring interface}
diff --git a/docs/src/user.tex b/docs/src/user.tex
index 9a02101db9..3bd5ee4fa9 100644
--- a/docs/src/user.tex
+++ b/docs/src/user.tex
@@ -3394,7 +3394,7 @@ or \verb|A-Bank.MarketAnalysis| workloads.
Alternatively, a system that has two hard-drives does not need a VIO
domain but can directly assign one hardware storage device to each of
the workloads if the platform offers an IO-MMU, cf
-Section~\ref{s:ddsecurity}. Sharing hardware through virtualizated devices
+Section~\ref{s:ddsecurity}. Sharing hardware through virtualized devices
is a trade-off between the amount of trusted code (size of the trusted
computing base) and the amount of acceptable over-provisioning. This
holds both for peripherals and for system platforms.
@@ -4652,7 +4652,7 @@ answering the questions as follows:
\begin{enumerate}
\item When the program asks for \textbf{model},
-scroll down and selese \textbf{SummaSketch (MM Compatible)}.
+scroll down and select \textbf{SummaSketch (MM Compatible)}.
\item When the program asks for \textbf{COM Port} specify \textbf{com2}.
diff --git a/docs/xen-api/presentation.tex b/docs/xen-api/presentation.tex
index a1f33dc99f..17fe3c598a 100644
--- a/docs/xen-api/presentation.tex
+++ b/docs/xen-api/presentation.tex
@@ -69,7 +69,7 @@ VM object to be updated automatically.
The API reference explicitly lists the fields that are
bound together in this way. It also contains a diagram that shows
relationships between classes. In this diagram an edge signifies the
-existance of a pair of fields that are bound together, using standard
+existence of a pair of fields that are bound together, using standard
crows-foot notation to signify the type of relationship (e.g.\
one-many, many-many).
diff --git a/docs/xen-api/todo.tex b/docs/xen-api/todo.tex
index b66dec0aba..615a5e57da 100644
--- a/docs/xen-api/todo.tex
+++ b/docs/xen-api/todo.tex
@@ -32,7 +32,7 @@ code, potential error description, but otherwise no value.
\item Clarify session behaviour wrt timeouts and disconnects.
-\item Clarify behaviour of progress field on asyncrhonous request polling when
+\item Clarify behaviour of progress field on asynchronous request polling when
that request fails.
\item Clarify which calls have asynchronous counterparts by marking them as such in the reference. (Individual getters and setters are too small and quick to justify having async versions)
diff --git a/docs/xen-api/wire-protocol.tex b/docs/xen-api/wire-protocol.tex
index 2a75c65dcb..6c0dc29771 100644
--- a/docs/xen-api/wire-protocol.tex
+++ b/docs/xen-api/wire-protocol.tex
@@ -185,7 +185,7 @@ you must login and initiate a session. For example:
Where {\tt uname} and {\tt password} refer to your username and password
respectively, as defined by the Xen administrator.
The {\tt session\_id} returned by {\tt session.login\_with\_password} is passed
-to subequent RPC calls as an authentication token.
+to subsequent RPC calls as an authentication token.
A session can be terminated with the {\tt session.logout} function:
\begin{verbatim}
@@ -210,7 +210,7 @@ Async.VM.clone(...)}, that is non-blocking.
Instead of returning its result directly, an asynchronous RPC call
returns a {\tt task-id}; this identifier is subsequently used
-to track the status of a running asynchronous RPC. Note that an asychronous
+to track the status of a running asynchronous RPC. Note that an asynchronous
call may fail immediately, before a {\tt task-id} has even been created---to
represent this eventuality, the returned {\tt task-id}
is wrapped in an XML-RPC struct with a {\tt Status}, {\tt ErrorDescription} and
@@ -248,7 +248,7 @@ Create a python object referencing the remote server:
\end{verbatim}
Acquire a session token by logging in with a username and password
-(error-handling ommitted for brevity; the session token is pointed to by the
+(error-handling omitted for brevity; the session token is pointed to by the
key {\tt 'Value'} in the returned dictionary)
\begin{verbatim}
diff --git a/docs/xen-api/xenapi-datamodel.tex b/docs/xen-api/xenapi-datamodel.tex
index a9ebaad545..04a0266550 100644
--- a/docs/xen-api/xenapi-datamodel.tex
+++ b/docs/xen-api/xenapi-datamodel.tex
@@ -75,7 +75,7 @@ host.host\_CPUs & host\_cpu.host & many-to-one\\
\hline
\end{tabular}\end{center}
-The following represents bound fields (as specified above) diagramatically, using crows-foot notation to specify one-to-one, one-to-many or many-to-many
+The following represents bound fields (as specified above) diagrammatically, using crows-foot notation to specify one-to-one, one-to-many or many-to-many
relationships:
\begin{center}\resizebox{0.8\textwidth}{!}{
@@ -444,7 +444,7 @@ returned. Also returned is a developer-only diagnostic reason.
\subsubsection{VLAN\_TAG\_INVALID}
-You tried to create a VLAN, but the tag you gave was invalid -- it mmust be
+You tried to create a VLAN, but the tag you gave was invalid -- it must be
between 0 and 4095. The parameter echoes the VLAN tag you gave.
\vspace{0.3cm}
@@ -1390,7 +1390,7 @@ $\mathit{RO}_\mathit{run}$ & {\tt resident\_on} & host ref & the host the VM is
$\mathit{RW}$ & {\tt memory/static\_max} & int & Statically-set (i.e. absolute) maximum (bytes) \\
$\mathit{RW}$ & {\tt memory/dynamic\_max} & int & Dynamic maximum (bytes) \\
$\mathit{RW}$ & {\tt memory/dynamic\_min} & int & Dynamic minimum (bytes) \\
-$\mathit{RW}$ & {\tt memory/static\_min} & int & Statically-set (i.e. absolute) mininum (bytes) \\
+$\mathit{RW}$ & {\tt memory/static\_min} & int & Statically-set (i.e. absolute) minimum (bytes) \\
$\mathit{RW}$ & {\tt VCPUs/params} & (string $\rightarrow$ string) Map & configuration parameters for the selected VCPU policy \\
$\mathit{RW}$ & {\tt VCPUs/max} & int & Max number of VCPUs \\
$\mathit{RW}$ & {\tt VCPUs/at\_startup} & int & Boot number of VCPUs \\
@@ -14954,7 +14954,7 @@ Check whether a VM with the given security label could run on the system.
\begin{tabular}{|c|c|p{7cm}|}
\hline
{\bf type} & {\bf name} & {\bf description} \\ \hline
-{\tt string } & security_label & reference to the object \\ \hline
+{\tt string } & security\_label & reference to the object \\ \hline
\end{tabular}
diff --git a/extras/mini-os/blkfront.c b/extras/mini-os/blkfront.c
index b227f06247..8588518607 100644
--- a/extras/mini-os/blkfront.c
+++ b/extras/mini-os/blkfront.c
@@ -48,11 +48,7 @@ struct blkfront_dev {
char *nodename;
char *backend;
- unsigned sector_size;
- unsigned sectors;
- int mode;
- int barrier;
- int flush;
+ struct blkfront_info info;
#ifdef HAVE_LIBC
int fd;
@@ -70,7 +66,7 @@ void blkfront_handler(evtchn_port_t port, struct pt_regs *regs, void *data)
wake_up(&blkfront_queue);
}
-struct blkfront_dev *init_blkfront(char *nodename, uint64_t *sectors, unsigned *sector_size, int *mode, int *info)
+struct blkfront_dev *init_blkfront(char *nodename, struct blkfront_info *info)
{
xenbus_transaction_t xbt;
char* err;
@@ -163,9 +159,9 @@ done:
return NULL;
}
if (*c == 'w')
- *mode = dev->mode = O_RDWR;
+ dev->info.mode = O_RDWR;
else
- *mode = dev->mode = O_RDONLY;
+ dev->info.mode = O_RDONLY;
free(c);
snprintf(path, sizeof(path), "%s/state", dev->backend);
@@ -177,24 +173,26 @@ done:
xenbus_unwatch_path(XBT_NIL, path);
snprintf(path, sizeof(path), "%s/info", dev->backend);
- *info = xenbus_read_integer(path);
+ dev->info.info = xenbus_read_integer(path);
snprintf(path, sizeof(path), "%s/sectors", dev->backend);
// FIXME: read_integer returns an int, so disk size limited to 1TB for now
- *sectors = dev->sectors = xenbus_read_integer(path);
+ dev->info.sectors = xenbus_read_integer(path);
snprintf(path, sizeof(path), "%s/sector-size", dev->backend);
- *sector_size = dev->sector_size = xenbus_read_integer(path);
+ dev->info.sector_size = xenbus_read_integer(path);
snprintf(path, sizeof(path), "%s/feature-barrier", dev->backend);
- dev->barrier = xenbus_read_integer(path);
+ dev->info.barrier = xenbus_read_integer(path);
snprintf(path, sizeof(path), "%s/feature-flush-cache", dev->backend);
- dev->flush = xenbus_read_integer(path);
+ dev->info.flush = xenbus_read_integer(path);
+
+ *info = dev->info;
}
unmask_evtchn(dev->evtchn);
- printk("%u sectors of %u bytes\n", dev->sectors, dev->sector_size);
+ printk("%u sectors of %u bytes\n", dev->info.sectors, dev->info.sector_size);
printk("**************************\n");
return dev;
@@ -258,11 +256,11 @@ void blkfront_aio(struct blkfront_aiocb *aiocbp, int write)
uintptr_t start, end;
// Can't io at non-sector-aligned location
- ASSERT(!(aiocbp->aio_offset & (dev->sector_size-1)));
+ ASSERT(!(aiocbp->aio_offset & (dev->info.sector_size-1)));
// Can't io non-sector-sized amounts
- ASSERT(!(aiocbp->aio_nbytes & (dev->sector_size-1)));
+ ASSERT(!(aiocbp->aio_nbytes & (dev->info.sector_size-1)));
// Can't io non-sector-aligned buffer
- ASSERT(!((uintptr_t) aiocbp->aio_buf & (dev->sector_size-1)));
+ ASSERT(!((uintptr_t) aiocbp->aio_buf & (dev->info.sector_size-1)));
start = (uintptr_t)aiocbp->aio_buf & PAGE_MASK;
end = ((uintptr_t)aiocbp->aio_buf + aiocbp->aio_nbytes + PAGE_SIZE - 1) & PAGE_MASK;
@@ -280,7 +278,7 @@ void blkfront_aio(struct blkfront_aiocb *aiocbp, int write)
req->nr_segments = n;
req->handle = dev->handle;
req->id = (uintptr_t) aiocbp;
- req->sector_number = aiocbp->aio_offset / dev->sector_size;
+ req->sector_number = aiocbp->aio_offset / dev->info.sector_size;
for (j = 0; j < n; j++) {
uintptr_t data = start + j * PAGE_SIZE;
@@ -292,10 +290,10 @@ void blkfront_aio(struct blkfront_aiocb *aiocbp, int write)
aiocbp->gref[j] = req->seg[j].gref =
gnttab_grant_access(dev->dom, virtual_to_mfn(data), write);
req->seg[j].first_sect = 0;
- req->seg[j].last_sect = PAGE_SIZE / dev->sector_size - 1;
+ req->seg[j].last_sect = PAGE_SIZE / dev->info.sector_size - 1;
}
- req->seg[0].first_sect = ((uintptr_t)aiocbp->aio_buf & ~PAGE_MASK) / dev->sector_size;
- req->seg[n-1].last_sect = (((uintptr_t)aiocbp->aio_buf + aiocbp->aio_nbytes - 1) & ~PAGE_MASK) / dev->sector_size;
+ req->seg[0].first_sect = ((uintptr_t)aiocbp->aio_buf & ~PAGE_MASK) / dev->info.sector_size;
+ req->seg[n-1].last_sect = (((uintptr_t)aiocbp->aio_buf + aiocbp->aio_nbytes - 1) & ~PAGE_MASK) / dev->info.sector_size;
dev->ring.req_prod_pvt = i + 1;
@@ -315,6 +313,62 @@ void blkfront_aio_read(struct blkfront_aiocb *aiocbp)
blkfront_aio(aiocbp, 0);
}
+static void blkfront_push_operation(struct blkfront_dev *dev, uint8_t op, uint64_t id)
+{
+ int i;
+ struct blkif_request *req;
+ int notify;
+
+ blkfront_wait_slot(dev);
+ i = dev->ring.req_prod_pvt;
+ req = RING_GET_REQUEST(&dev->ring, i);
+ req->operation = op;
+ req->nr_segments = 0;
+ req->handle = dev->handle;
+ req->id = id;
+ /* Not needed anyway, but the backend will check it */
+ req->sector_number = 0;
+ dev->ring.req_prod_pvt = i + 1;
+ wmb();
+ RING_PUSH_REQUESTS_AND_CHECK_NOTIFY(&dev->ring, notify);
+ if (notify) notify_remote_via_evtchn(dev->evtchn);
+}
+
+void blkfront_aio_push_operation(struct blkfront_aiocb *aiocbp, uint8_t op)
+{
+ struct blkfront_dev *dev = aiocbp->aio_dev;
+ blkfront_push_operation(dev, op, (uintptr_t) aiocbp);
+}
+
+void blkfront_sync(struct blkfront_dev *dev)
+{
+ unsigned long flags;
+
+ if (dev->info.mode == O_RDWR) {
+ if (dev->info.barrier == 1)
+ blkfront_push_operation(dev, BLKIF_OP_WRITE_BARRIER, 0);
+
+ if (dev->info.flush == 1)
+ blkfront_push_operation(dev, BLKIF_OP_FLUSH_DISKCACHE, 0);
+ }
+
+ /* Note: This won't finish if another thread enqueues requests. */
+ local_irq_save(flags);
+ DEFINE_WAIT(w);
+ while (1) {
+ blkfront_aio_poll(dev);
+ if (RING_FREE_REQUESTS(&dev->ring) == RING_SIZE(&dev->ring))
+ break;
+
+ add_waiter(w, blkfront_queue);
+ local_irq_restore(flags);
+ schedule();
+ local_irq_save(flags);
+ }
+ remove_waiter(w);
+ local_irq_restore(flags);
+}
+
int blkfront_aio_poll(struct blkfront_dev *dev)
{
RING_IDX rp, cons;
@@ -337,95 +391,47 @@ moretodo:
rsp = RING_GET_RESPONSE(&dev->ring, cons);
nr_consumed++;
- if (rsp->status != BLKIF_RSP_OKAY)
- printk("block error %d for op %d\n", rsp->status, rsp->operation);
+ struct blkfront_aiocb *aiocbp = (void*) (uintptr_t) rsp->id;
+ int status = rsp->status;
+
+ if (status != BLKIF_RSP_OKAY)
+ printk("block error %d for op %d\n", status, rsp->operation);
switch (rsp->operation) {
case BLKIF_OP_READ:
case BLKIF_OP_WRITE:
{
- struct blkfront_aiocb *aiocbp = (void*) (uintptr_t) rsp->id;
- int status = rsp->status;
int j;
for (j = 0; j < aiocbp->n; j++)
gnttab_end_access(aiocbp->gref[j]);
- dev->ring.rsp_cons = ++cons;
- /* Nota: callback frees aiocbp itself */
- aiocbp->aio_cb(aiocbp, status ? -EIO : 0);
- if (dev->ring.rsp_cons != cons)
- /* We reentered, we must not continue here */
- goto out;
break;
}
- default:
- printk("unrecognized block operation %d response\n", rsp->operation);
+
case BLKIF_OP_WRITE_BARRIER:
case BLKIF_OP_FLUSH_DISKCACHE:
- dev->ring.rsp_cons = ++cons;
break;
+
+ default:
+ printk("unrecognized block operation %d response\n", rsp->operation);
}
+
+ dev->ring.rsp_cons = ++cons;
+ /* Nota: callback frees aiocbp itself */
+ if (aiocbp && aiocbp->aio_cb)
+ aiocbp->aio_cb(aiocbp, status ? -EIO : 0);
+ if (dev->ring.rsp_cons != cons)
+ /* We reentered, we must not continue here */
+ break;
}
-out:
RING_FINAL_CHECK_FOR_RESPONSES(&dev->ring, more);
if (more) goto moretodo;
return nr_consumed;
}
-static void blkfront_push_operation(struct blkfront_dev *dev, uint8_t op)
-{
- int i;
- struct blkif_request *req;
- int notify;
-
- blkfront_wait_slot(dev);
- i = dev->ring.req_prod_pvt;
- req = RING_GET_REQUEST(&dev->ring, i);
- req->operation = op;
- req->nr_segments = 0;
- req->handle = dev->handle;
- /* Not used */
- req->id = 0;
- /* Not needed anyway, but the backend will check it */
- req->sector_number = 0;
- dev->ring.req_prod_pvt = i + 1;
- wmb();
- RING_PUSH_REQUESTS_AND_CHECK_NOTIFY(&dev->ring, notify);
- if (notify) notify_remote_via_evtchn(dev->evtchn);
-}
-
-void blkfront_sync(struct blkfront_dev *dev)
-{
- unsigned long flags;
-
- if (dev->mode == O_RDWR) {
- if (dev->barrier == 1)
- blkfront_push_operation(dev, BLKIF_OP_WRITE_BARRIER);
-
- if (dev->flush == 1)
- blkfront_push_operation(dev, BLKIF_OP_FLUSH_DISKCACHE);
- }
-
- /* Note: This won't finish if another thread enqueues requests. */
- local_irq_save(flags);
- DEFINE_WAIT(w);
- while (1) {
- blkfront_aio_poll(dev);
- if (RING_FREE_REQUESTS(&dev->ring) == RING_SIZE(&dev->ring))
- break;
-
- add_waiter(w, blkfront_queue);
- local_irq_restore(flags);
- schedule();
- local_irq_save(flags);
- }
- remove_waiter(w);
- local_irq_restore(flags);
-}
-
#ifdef HAVE_LIBC
int blkfront_open(struct blkfront_dev *dev)
{
diff --git a/extras/mini-os/include/blkfront.h b/extras/mini-os/include/blkfront.h
index 687f8434dc..c8de59d335 100644
--- a/extras/mini-os/include/blkfront.h
+++ b/extras/mini-os/include/blkfront.h
@@ -15,13 +15,23 @@ struct blkfront_aiocb
void (*aio_cb)(struct blkfront_aiocb *aiocb, int ret);
};
-struct blkfront_dev *init_blkfront(char *nodename, uint64_t *sectors, unsigned *sector_size, int *mode, int *info);
+struct blkfront_info
+{
+ uint64_t sectors;
+ unsigned sector_size;
+ int mode;
+ int info;
+ int barrier;
+ int flush;
+};
+struct blkfront_dev *init_blkfront(char *nodename, struct blkfront_info *info);
#ifdef HAVE_LIBC
int blkfront_open(struct blkfront_dev *dev);
#endif
void blkfront_aio(struct blkfront_aiocb *aiocbp, int write);
void blkfront_aio_read(struct blkfront_aiocb *aiocbp);
void blkfront_aio_write(struct blkfront_aiocb *aiocbp);
+void blkfront_aio_push_operation(struct blkfront_aiocb *aiocbp, uint8_t op);
int blkfront_aio_poll(struct blkfront_dev *dev);
void blkfront_sync(struct blkfront_dev *dev);
void shutdown_blkfront(struct blkfront_dev *dev);
diff --git a/extras/mini-os/kernel.c b/extras/mini-os/kernel.c
index a8596c8471..6888eee508 100644
--- a/extras/mini-os/kernel.c
+++ b/extras/mini-os/kernel.c
@@ -91,9 +91,7 @@ static void netfront_thread(void *p)
}
static struct blkfront_dev *blk_dev;
-static uint64_t blk_sectors;
-static unsigned blk_sector_size;
-static int blk_mode;
+static struct blkfront_info blk_info;
static uint64_t blk_size_read;
static uint64_t blk_size_write;
@@ -111,9 +109,9 @@ static struct blk_req *blk_alloc_req(uint64_t sector)
{
struct blk_req *req = xmalloc(struct blk_req);
req->aiocb.aio_dev = blk_dev;
- req->aiocb.aio_buf = _xmalloc(blk_sector_size, blk_sector_size);
- req->aiocb.aio_nbytes = blk_sector_size;
- req->aiocb.aio_offset = sector * blk_sector_size;
+ req->aiocb.aio_buf = _xmalloc(blk_info.sector_size, blk_info.sector_size);
+ req->aiocb.aio_nbytes = blk_info.sector_size;
+ req->aiocb.aio_offset = sector * blk_info.sector_size;
req->aiocb.data = req;
req->next = NULL;
return req;
@@ -125,7 +123,7 @@ static void blk_read_completed(struct blkfront_aiocb *aiocb, int ret)
if (ret)
printk("got error code %d when reading at offset %ld\n", ret, aiocb->aio_offset);
else
- blk_size_read += blk_sector_size;
+ blk_size_read += blk_info.sector_size;
free(aiocb->aio_buf);
free(req);
}
@@ -154,10 +152,10 @@ static void blk_write_read_completed(struct blkfront_aiocb *aiocb, int ret)
free(req);
return;
}
- blk_size_read += blk_sector_size;
+ blk_size_read += blk_info.sector_size;
buf = (int*) aiocb->aio_buf;
rand_value = req->rand_value;
- for (i = 0; i < blk_sector_size / sizeof(int); i++) {
+ for (i = 0; i < blk_info.sector_size / sizeof(int); i++) {
if (buf[i] != rand_value) {
printk("bogus data at offset %ld\n", aiocb->aio_offset + i);
break;
@@ -177,7 +175,7 @@ static void blk_write_completed(struct blkfront_aiocb *aiocb, int ret)
free(req);
return;
}
- blk_size_write += blk_sector_size;
+ blk_size_write += blk_info.sector_size;
/* Push write check */
req->next = blk_to_read;
blk_to_read = req;
@@ -195,7 +193,7 @@ static void blk_write_sector(uint64_t sector)
req->rand_value = rand_value = rand();
buf = (int*) req->aiocb.aio_buf;
- for (i = 0; i < blk_sector_size / sizeof(int); i++) {
+ for (i = 0; i < blk_info.sector_size / sizeof(int); i++) {
buf[i] = rand_value;
rand_value *= RAND_MIX;
}
@@ -207,35 +205,34 @@ static void blk_write_sector(uint64_t sector)
static void blkfront_thread(void *p)
{
time_t lasttime = 0;
- int blk_info;
- blk_dev = init_blkfront(NULL, &blk_sectors, &blk_sector_size, &blk_mode, &blk_info);
+ blk_dev = init_blkfront(NULL, &blk_info);
if (!blk_dev)
return;
- if (blk_info & VDISK_CDROM)
+ if (blk_info.info & VDISK_CDROM)
printk("Block device is a CDROM\n");
- if (blk_info & VDISK_REMOVABLE)
+ if (blk_info.info & VDISK_REMOVABLE)
printk("Block device is removable\n");
- if (blk_info & VDISK_READONLY)
+ if (blk_info.info & VDISK_READONLY)
printk("Block device is read-only\n");
#ifdef BLKTEST_WRITE
- if (blk_mode == O_RDWR) {
+ if (blk_info.mode == O_RDWR) {
blk_write_sector(0);
- blk_write_sector(blk_sectors-1);
+ blk_write_sector(blk_info.sectors-1);
} else
#endif
{
blk_read_sector(0);
- blk_read_sector(blk_sectors-1);
+ blk_read_sector(blk_info.sectors-1);
}
while (1) {
- uint64_t sector = rand() % blk_sectors;
+ uint64_t sector = rand() % blk_info.sectors;
struct timeval tv;
#ifdef BLKTEST_WRITE
- if (blk_mode == O_RDWR)
+ if (blk_info.mode == O_RDWR)
blk_write_sector(sector);
else
#endif
diff --git a/extras/mini-os/lib/xmalloc.c b/extras/mini-os/lib/xmalloc.c
index d4c3941738..82d5cc61db 100644
--- a/extras/mini-os/lib/xmalloc.c
+++ b/extras/mini-os/lib/xmalloc.c
@@ -208,6 +208,13 @@ void xfree(const void *p)
pad = (struct xmalloc_pad *)p - 1;
hdr = (struct xmalloc_hdr *)((char *)p - pad->hdr_size);
+ /* Big allocs free directly. */
+ if ( hdr->size >= PAGE_SIZE )
+ {
+ free_pages(hdr, get_order(hdr->size));
+ return;
+ }
+
/* We know hdr will be on same page. */
if(((long)p & PAGE_MASK) != ((long)hdr & PAGE_MASK))
{
@@ -222,13 +229,6 @@ void xfree(const void *p)
*(int*)0=0;
}
- /* Big allocs free directly. */
- if ( hdr->size >= PAGE_SIZE )
- {
- free_pages(hdr, get_order(hdr->size));
- return;
- }
-
/* Merge with other free block, or put in list. */
/* spin_lock_irqsave(&freelist_lock, flags); */
list_for_each_entry_safe( i, tmp, &freelist, freelist )
diff --git a/stubdom/stubdom-dm b/stubdom/stubdom-dm
index 03fbd3ba0d..49df178fcb 100644
--- a/stubdom/stubdom-dm
+++ b/stubdom/stubdom-dm
@@ -74,7 +74,7 @@ done
creation="xm create -c stubdom-$domname target=$domid memory=32 extra=\"$extra\""
-(while true ; do sleep 60 ; done) | $creation &
+(while true ; do sleep 60 ; done) | /bin/sh -c "$creation" &
#xterm -geometry +0+0 -e /bin/sh -c "$creation ; echo ; echo press ENTER to shut down ; read" &
consolepid=$!
diff --git a/tools/blktap/drivers/block-qcow.c b/tools/blktap/drivers/block-qcow.c
index 25838b44f9..549cc7c793 100644
--- a/tools/blktap/drivers/block-qcow.c
+++ b/tools/blktap/drivers/block-qcow.c
@@ -1112,7 +1112,7 @@ int qcow_create(const char *filename, uint64_t total_size,
int shift, length, adjust, flags = 0, ret = 0;
QCowHeader header;
QCowHeader_ext exthdr;
- char backing_filename[1024], *ptr;
+ char backing_filename[PATH_MAX], *ptr;
uint64_t tmp, size, total_length;
struct stat st;
diff --git a/tools/examples/xend-config-xenapi.sxp b/tools/examples/xend-config-xenapi.sxp
index d80083ad7f..dcbddf959e 100644
--- a/tools/examples/xend-config-xenapi.sxp
+++ b/tools/examples/xend-config-xenapi.sxp
@@ -167,12 +167,15 @@
#(network-script network-nat)
#(vif-script vif-nat)
-
-# Dom0 will balloon out when needed to free memory for domU.
-# dom0-min-mem is the lowest memory level (in MB) dom0 will get down to.
-# If dom0-min-mem=0, dom0 will never balloon out.
+# dom0-min-mem is the lowest permissible memory level (in MB) for dom0.
+# This is a minimum both for auto-ballooning (as enabled by
+# enable-dom0-ballooning below) and for xm mem-set when applied to dom0.
(dom0-min-mem 196)
+# Whether to enable auto-ballooning of dom0 to allow domUs to be created.
+# If enable-dom0-ballooning = no, dom0 will never balloon out.
+(enable-dom0-ballooning yes)
+
# In SMP system, dom0 will use dom0-cpus # of CPUS
# If dom0-cpus = 0, dom0 will take all cpus available
(dom0-cpus 0)
diff --git a/tools/examples/xend-config.sxp b/tools/examples/xend-config.sxp
index 22c0b24a25..f3ee4f3a15 100644
--- a/tools/examples/xend-config.sxp
+++ b/tools/examples/xend-config.sxp
@@ -165,12 +165,15 @@
#(network-script network-nat)
#(vif-script vif-nat)
-
-# Dom0 will balloon out when needed to free memory for domU.
-# dom0-min-mem is the lowest memory level (in MB) dom0 will get down to.
-# If dom0-min-mem=0, dom0 will never balloon out.
+# dom0-min-mem is the lowest permissible memory level (in MB) for dom0.
+# This is a minimum both for auto-ballooning (as enabled by
+# enable-dom0-ballooning below) and for xm mem-set when applied to dom0.
(dom0-min-mem 196)
+# Whether to enable auto-ballooning of dom0 to allow domUs to be created.
+# If enable-dom0-ballooning = no, dom0 will never balloon out.
+(enable-dom0-ballooning yes)
+
# In SMP system, dom0 will use dom0-cpus # of CPUS
# If dom0-cpus = 0, dom0 will take all cpus available
(dom0-cpus 0)
diff --git a/tools/firmware/Rules.mk b/tools/firmware/Rules.mk
new file mode 100644
index 0000000000..47db139592
--- /dev/null
+++ b/tools/firmware/Rules.mk
@@ -0,0 +1,17 @@
+# Firmware is a 32-bit target
+override XEN_TARGET_ARCH = x86_32
+
+# User-supplied CFLAGS are not useful here.
+CFLAGS :=
+
+include $(XEN_ROOT)/tools/Rules.mk
+
+CFLAGS += -Werror
+
+# Disable PIE/SSP if GCC supports them. They can break us.
+CFLAGS += $(call cc-option,$(CC),-nopie,)
+CFLAGS += $(call cc-option,$(CC),-fno-stack-protector,)
+CFLAGS += $(call cc-option,$(CC),-fno-stack-protector-all,)
+
+# Extra CFLAGS suitable for an embedded type of environment.
+CFLAGS += -fno-builtin -msoft-float
diff --git a/tools/firmware/etherboot/Makefile b/tools/firmware/etherboot/Makefile
index 7de2ad5935..ecc931704e 100644
--- a/tools/firmware/etherboot/Makefile
+++ b/tools/firmware/etherboot/Makefile
@@ -10,21 +10,16 @@ D=etherboot-$(EB_VERSION)
T=etherboot-$(EB_VERSION).tar.gz
E=etherboot-build
-ROM_ZHS = $(addprefix eb-, $(addsuffix .zrom.h, $(NICS)))
+ROMS = $(addprefix $E/src/bin/, $(addsuffix .zrom, $(NICS)))
.PHONY: all
all: eb-roms.h
-eb-%.zrom.h: $E/src/Config
- $(MAKE) -C $E/src bin/$*.zrom
- ../hvmloader/mkhex etherboot_$* <$E/src/bin/$*.zrom >$@.new
- mv -f $@.new $@
-
-eb-rom-list.h: make-eb-rom-list $E/src/bin/Roms
- ./$^ $(NICS) >$@.new && mv -f $@.new $@
+%.zrom: $E/src/Config
+ $(MAKE) -C $E/src bin/$(*F).zrom
-eb-roms.h.new: eb-rom-list.h $(ROM_ZHS)
- cat $^ >$@
+eb-roms.h.new: $(ROMS)
+ cat $^ | ../hvmloader/mkhex etherboot >$@
eb-roms.h: Config
$(MAKE) $@.new
diff --git a/tools/firmware/etherboot/eb-roms.h b/tools/firmware/etherboot/eb-roms.h
index 5ac5166141..39fdce227c 100644
--- a/tools/firmware/etherboot/eb-roms.h
+++ b/tools/firmware/etherboot/eb-roms.h
@@ -1,11 +1,5 @@
-/* autogenerated - do not edit */
-#define ETHERBOOT_ROM_LIST \
- ETHERBOOT_ROM(rtl8139, 0x10ec,0x8139) \
- ETHERBOOT_ROM(eepro100, 0x8086,0x1229) \
-
-/*end.*/
-unsigned etherboot_rtl8139[] = {
-0xeb40aa55, 0xbfe94b65, 0x68744500, 0x6f627265,
+unsigned etherboot[] = {
+0xeb40aa55, 0xbfe9ca65, 0x68744500, 0x6f627265,
0x0000746f, 0x00540000, 0x0034001c, 0x52494350,
0x813910ec, 0x00180000, 0x00000200, 0x00010040,
0x00008000, 0x506e5024, 0x00000201, 0x00008a00,
@@ -24,7 +18,7 @@ unsigned etherboot_rtl8139[] = {
0x55506650, 0x468be589, 0x02468910, 0x8912468b,
0x685d0446, 0x5066104d, 0x0f2e0e50, 0x000206b6,
0x5009e0c1, 0xe6e8146a, 0x8f2e5800, 0x2e064a06,
-0x0648068f, 0xc72e6658, 0x00038406, 0x66000000,
+0x0648068f, 0xc72e6658, 0x00038006, 0x66000000,
0x00020168, 0x50686600, 0xe8000178, 0xc4830010,
0x89175b12, 0x3ce85bdc, 0x0002ca01, 0x6650006a,
0xc0200f50, 0x586601a8, 0x832d7458, 0x0000247c,
@@ -39,18 +33,18 @@ unsigned etherboot_rtl8139[] = {
0x1f07a10f, 0x8cc03166, 0x66d88ec8, 0x6604e0c1,
0x00038005, 0x0ba36600, 0x1f586604, 0x500179e9,
0xbb061e60, 0xc38e0040, 0x131e8b26, 0x06e3c100,
-0x14d1eb81, 0x2606ebc1, 0x00131e89, 0x8c06e3c1,
-0x89d88ed0, 0x4c8b36e6, 0x78c98518, 0x99878d15,
+0x1511eb81, 0x2606ebc1, 0x00131e89, 0x8c06e3c1,
+0x89d88ed0, 0x4c8b36e6, 0x78c98518, 0xd9878d15,
0xbfc08e13, 0xc1831000, 0x8ecf291a, 0xfcfc89d0,
-0x6066a4f3, 0x1f0ec38e, 0x5f4fb966, 0x89660000,
+0x6066a4f3, 0x1f0ec38e, 0x5b7fb966, 0x89660000,
0xcf8966ce, 0xf3fd4166, 0x66fca467, 0x66506661,
-0xd889c031, 0x04e0c166, 0x84a32666, 0xc7266603,
-0x10038006, 0x6600014d, 0x87e58958, 0x5e89165e,
+0xd889c031, 0x04e0c166, 0x80a32666, 0xc7266603,
+0x10038406, 0x66000151, 0x87e58958, 0x5e89165e,
0x611f0714, 0xb80650cb, 0xc08e0040, 0x0013a126,
-0x0506e0c1, 0xe8c11510, 0x13a32606, 0xc3580700,
-0x0000e860, 0x815d0000, 0x0002b6ed, 0xfab9fd00,
-0x8d000058, 0x06530db4, 0xbc8d0000, 0x0050d90d,
-0xfca4f300, 0x50dab58d, 0xbd8d0000, 0x00000650,
+0x0506e0c1, 0xe8c11550, 0x13a32606, 0xc3580700,
+0x0000e860, 0x815d0000, 0x0002b6ed, 0x21b9fd00,
+0x8d000055, 0x06530db4, 0xbc8d0000, 0x0059320d,
+0xfca4f300, 0x5933b58d, 0xbd8d0000, 0x00000650,
0xffffffbd, 0xa405ebff, 0x0775db01, 0xee831e8b,
0x72db11fc, 0x40c031f2, 0x0775db01, 0xee831e8b,
0x11db11fc, 0x75db01c0, 0x831e8b07, 0xdb11fcee,
@@ -106,7 +100,7 @@ unsigned etherboot_rtl8139[] = {
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x02000000, 0x0002bd01, 0x00000000, 0x90909090,
-0x000090ec, 0xffedffff, 0xf8835858, 0xcb017500,
+0x000094ec, 0xffedffff, 0xf8835858, 0xcb017500,
0x0804c483, 0xcd027502, 0xfb18cd19, 0xfbfa9090,
0x15cdf958, 0xbbf6edfd, 0x0eb4069c, 0x0001bb66,
0x0c10cd00, 0x16cdc031, 0x4bffe430, 0xb407b973,
@@ -138,1398 +132,1398 @@ unsigned etherboot_rtl8139[] = {
0x0bfdc1c8, 0x500342dd, 0xc88c66d7, 0x04244487,
0xdda17d03, 0xec837eee, 0x08010f08, 0x02a80f66,
0x435c66a0, 0x7eddb777, 0x600e6616, 0x8938128d,
-0x44070c03, 0xae3be850, 0x5dfdbedb, 0x050ced81,
-0x98ad8906, 0x168b0591, 0x6fffbca9, 0x7400fedf,
-0x90b58d21, 0xbd8d0739, 0x39054990, 0x390472f4,
-0x890d76fc, 0x76fdb9e6, 0x3248bbfc, 0xfc89cf29,
-0xe3e8a4f3, 0x362d8b51, 0xb3db6c29, 0xe868bdcd,
-0x3f450c4f, 0xb70f1220, 0x6db7240a, 0x5c046ff7,
-0x8d502624, 0x50608085, 0x7c548ffa, 0xfb7fd38e,
-0xec01fb6d, 0x936158cb, 0x66a102a9, 0xe61f6607,
-0x648b9d0c, 0xa37dd424, 0xf79cdcd0, 0xbe852696,
-0xca9dcb9d, 0xbff62db5, 0x57565507, 0x10247c8b,
-0x61983d2b, 0x8336a810, 0x68affbbb, 0xe8550e48,
-0x5b217cba, 0xd637df40, 0x42a30eed, 0xbe778904,
-0x29b4b923, 0xb6dbf77b, 0x732ea3f1, 0xf8ea2015,
-0xb8000881, 0x6ddd1c10, 0xd88ebfff, 0xd08ec08e,
-0xe88ee08e, 0xc35d5e5f, 0x89e64035, 0x77ee4435,
-0x3d05f9f3, 0x584c1d48, 0x250b50a3, 0xfbac0554,
-0xbb59e17b, 0x0300e968, 0x68535f1d, 0xe4514328,
-0xf770fbf7, 0x890bb1e8, 0xa5282ca5, 0x6ca52f20,
-0xde977b29, 0xe4cf615c, 0x8100768d, 0xa88fbcfc,
-0x74d7ba15, 0xed0c6020, 0x02341b22, 0xbb7b1919,
-0x17072db7, 0x7e8bd0ff, 0xf23b8b8b, 0x8b8b191c,
-0x3ca18b15, 0x28d0bb04, 0x8be2ffbc, 0x68d6da4c,
-0xfd025189, 0x597ff1b8, 0x08618904, 0x890c6989,
-0x14796071, 0x6dc3006f, 0x1bcd0bdb, 0x8b08431f,
-0x095a374a, 0xebf4f662, 0x0c6a08bf, 0x8b10728b,
-0x051c147a, 0x4389ffb8, 0xb6959c2d, 0xbea29c28,
-0x840c5401, 0xce8b664b, 0xb8bb188d, 0xef181f30,
-0x21a29687, 0x2e9d5d58, 0xc3c2e428, 0x2b07357b,
-0x38815080, 0x0f0d2300, 0x82858907, 0x68956ffa,
-0x921b11d7, 0x284f2907, 0xd4bd530c, 0x5350ee68,
-0x2c1d9da9, 0x2f024389, 0x03d4bedf, 0x88101f0a,
-0x0c020443, 0x0f076388, 0xc231585b, 0x90c3db8d,
-0xc6535600, 0x6cd6a10c, 0xbddaddfa, 0x70bb0010,
-0x29c62904, 0xb801006a, 0xe6dfc2e8, 0x2d062e66,
-0x056850e4, 0x6c0986e8, 0x38de176f, 0x18c03b80,
-0xc03903c6, 0xb0050f93, 0x7f5d6500, 0x0921188d,
-0x055a0603, 0x5bd30aa1, 0x145db6eb, 0x047f1887,
-0x13026a10, 0x6c7dd7b6, 0x1c065016, 0x4eefb850,
-0xe859602d, 0x793d2dbf, 0x66c2892c, 0x010a20f6,
-0xb10f0374, 0xb6c730ed, 0x8843bbc6, 0xce961203,
-0x3f7cb3c8, 0xefeffc1e, 0x95f7b072, 0x2e2c3f8e,
-0x250304bd, 0x282f6cf3, 0x32c8fc23, 0xb0b937b5,
-0x2d0c26c0, 0x30be0526, 0xa1e805fb, 0x83063126,
-0x19b901f0, 0x01b0b939, 0x0c0c152f, 0xecb0ccb9,
-0x29535671, 0x19e4b817, 0x47151539, 0x196d2f57,
-0x66287b7e, 0x8dca13c7, 0x0a6a1887, 0xbbeeef4a,
-0x2474db57, 0x2a24bb22, 0x3eeb8156, 0x2b186f0d,
-0xdcd805f0, 0x01181820, 0x35fb3975, 0x14881dfc,
-0x74d28566, 0x16186617, 0x0506e0a9, 0x6e0bad62,
-0x017220d2, 0xbd16f9d0, 0x20debec5, 0x24e475c0,
-0x10321d12, 0x1b07deeb, 0x0e6dfd73, 0x6cba8800,
-0x07b15d56, 0x22c5cdb1, 0x55404d3f, 0x636e8f9c,
-0x3b2c2c83, 0x06334440, 0xc36c619e, 0x31657df7,
-0x7f1e39ed, 0x1406500c, 0x3dafd986, 0xb0034673,
-0x65e805e1, 0x03fdb74b, 0x02d081db, 0xf63a75fb,
-0x34b22404, 0xb5deef91, 0x23e4405a, 0xb9fc0adf,
-0xa5f34e05, 0xae868343, 0x14c5dffb, 0x850c7d60,
-0x21a574db, 0x1b9db206, 0xdb5ae70d, 0x5f87d889,
-0x0e070939, 0xb07c08fc, 0xe81c8f5d, 0x140101ed,
-0xfffe98e8, 0x0bdbb9fd, 0x2f60a3ea, 0x0ab4e80f,
-0x6c682096, 0xdbf36d06, 0x1364a30e, 0x10c4ff3c,
-0xc2fb704e, 0x3284dcdb, 0x072a05d3, 0x74a3990a,
-0x7dc27608, 0x0d64a1b6, 0x086805c7, 0x90790924,
-0x003cbded, 0x15897009, 0x73db6378, 0x057c0f9b,
-0x19800911, 0x83b1b210, 0x23840975, 0x8c2288a3,
-0x1bedb73c, 0xa12c906c, 0xf8843159, 0xd8f9867c,
-0x0f726896, 0x89fc1489, 0xdb4f0805, 0x0c4e6bff,
-0x470ceb2b, 0x3914c183, 0xe7d91ff8, 0xefdb7fb9,
-0xeb756663, 0x837f918b, 0x928131fa, 0x5f3d5277,
-0xff86f0db, 0xbd4b772d, 0xf6318400, 0x372b941e,
-0xa9bf6bf8, 0x23d6391b, 0x770c72ce, 0xd876c53c,
-0x06ef12d8, 0xc30da98b, 0x3fc70729, 0xbdac3b16,
-0x19d20935, 0x2fef623d, 0xff4b472d, 0x8944777c,
-0x399903c3, 0xf7c2fc37, 0xb113d689, 0x0cab3b27,
-0x06772e72, 0x267608a3, 0x8d6ed977, 0x4367413b,
-0x77440d72, 0xd9b1cf3b, 0x260856dd, 0xd619218b,
-0x30333589, 0xf762c1c2, 0x862787d8, 0xf8675a1c,
-0x18a3cc8d, 0x34ace5e9, 0x64c82c14, 0x9879f65f,
-0x097481c7, 0x5d760c78, 0x4bb3eb3a, 0x2b9013b8,
-0xbc6fef05, 0x36b2c3a7, 0xeb9b14be, 0x6dc5811b,
-0x213fffeb, 0x75455246, 0x5703662e, 0x21116204,
-0xb58e044f, 0x3d09c344, 0x89d3aa3b, 0x4aeffdf1,
-0x170bb72d, 0x0ae7c1fa, 0x8166c729, 0xbadd80fa,
-0xcabb0b75, 0x8944c38e, 0x150369d3, 0xfc777d6c,
-0xffe28125, 0x1a8c8db8, 0xd6fc8906, 0x5c3768ea,
-0xf2893942, 0x772096a6, 0x465edf7f, 0x5c12ebc9,
-0x02c7044a, 0x00c2816c, 0x7549667c, 0xb772c40b,
-0x70e946ec, 0xcc42e4df, 0x5c3bb3af, 0xa109bdf2,
-0xb90408d0, 0x660d83ee, 0xc99c69b8, 0xf0662c89,
-0x33e8ed1a, 0x232404fd, 0xfbe177b5, 0x535723de,
-0xd3bf7705, 0x1ce88151, 0xfb85c826, 0x2bf9897b,
-0xebc1390d, 0x1676be0a, 0x915d0b73, 0xda832472,
-0x5fcad7e3, 0xd2b796db, 0xc2e2c117, 0xf31ecb07,
-0x140b60d7, 0x5f72a732, 0x0f63738d, 0x25742a72,
-0x5b9082a1, 0x37bb870d, 0x97032fb6, 0xe9821ca3,
-0xd2a6fc9e, 0x8a6b160d, 0x2e7c9d24, 0xbbb7ad61,
-0x51d1753b, 0x10883a68, 0x473058e7, 0xa6ee4dde,
-0xe8088cfe, 0x10b41e05, 0xbdb239e8, 0xb9db1a67,
-0xbc084657, 0xb1421983, 0xe8a77e1b, 0xd9e8f291,
-0x22c962fe, 0x23b82894, 0xc1781d7b, 0xdc11f0fd,
-0x9a8dd029, 0x00e3810b, 0x86ffe41b, 0x0d8bb705,
-0xecde8715, 0xc839ce29, 0xd8390c77, 0xa36df847,
-0x12fb6477, 0x0476000a, 0x56086e58, 0xfa4c5afd,
-0xe851d129, 0x2f4de497, 0x18473529, 0x1e44ef7b,
-0x438b599b, 0xcdb2c829, 0x07537899, 0x6904764f,
-0x74ddcfd8, 0xda34d039, 0xafb10574, 0xaf40ff08,
-0x05a97b30, 0x573fe852, 0x0d8b2c08, 0x06d549a3,
-0x140a602c, 0xc849db0c, 0xc0847a25, 0x5af60d75,
-0x8c675045, 0x1f845b34, 0xb95c0958, 0x2e5a7ce8,
-0x8b56c4a0, 0x086808c5, 0x2bcc2620, 0x99b5f1b6,
-0x5359563d, 0xb7efa412, 0x21856bef, 0x5230262d,
-0xbe7974ed, 0x6c1a1054, 0x892408fd, 0x89d729f7,
-0xdd0e0715, 0x54fe3eb1, 0xab898389, 0xf7839f82,
-0xdd36b80b, 0x2d8943de, 0x3354550f, 0xdefb8386,
-0x21fd2c5c, 0x8c8a1554, 0xeac1fed5, 0xb1e37d04,
-0x960313db, 0x43688b89, 0x352b0257, 0xe0db966f,
-0x3e060c59, 0x5b788fd9, 0xaa9d629c, 0x370f1d3a,
-0xfdd62946, 0xbb73061c, 0x6e36da92, 0x53e2f1a5,
-0x06047902, 0x685dfb0b, 0x007e1db4, 0x74b5153b,
-0x6d80d602, 0xea8177e7, 0x03828ba0, 0xa041585b,
-0xcb3ca114, 0x85b3ebc5, 0x2822191a, 0x11048ddb,
-0x7432377a, 0x47207b14, 0x8dcd87cd, 0x00be9691,
-0x2b9a1915, 0xd0408934, 0x4f1b56f4, 0x290c2bc7,
-0xf7fe91df, 0x28b5386c, 0xbf6687d3, 0x760d8f01,
-0x5678c7b0, 0xc65915e8, 0x180475ff, 0xdd0bc601,
-0x17bb22ed, 0xc31458fd, 0xf45e5502, 0xcf730403,
-0xc13321ad, 0x181be101, 0x305d0e93, 0xe0062da1,
-0x9fd917d8, 0x2f485721, 0xf8890603, 0x2b061712,
-0x095bcfb5, 0x1045fb43, 0x02a66e31, 0xc19946c9,
-0xde0d6203, 0x181c5b6a, 0x1c42d213, 0xad0cc903,
-0x3d03dee0, 0x3c497611, 0xe36c584b, 0xe7338190,
-0xdfd66189, 0xd2b01c76, 0x526e2d84, 0x5708b150,
-0xd7c74be8, 0xa495736e, 0x17e9910c, 0x3da7312d,
-0x2904d8b0, 0xbbeb4246, 0xb7c2d82e, 0x03ec0dbe,
-0x0ac9104d, 0x46fe26d4, 0x03014c2c, 0x9bfce183,
-0xa4c45504, 0x2910be8d, 0x5b5154cc, 0xaee27c84,
-0xf59ab745, 0x066bd054, 0x875dec89, 0xe860a13f,
-0x8b4c9294, 0x79a4249c, 0x6e015a9a, 0xc4f76435,
-0x4260b94b, 0x6cf85e2e, 0x7408998d, 0xc8979d65,
-0xe6815b12, 0x06ba0c05, 0xe85b51b8, 0x83d3c283,
-0x4f75cd0f, 0x5b71363f, 0xc2ef8b19, 0x8e886b04,
-0xddc1c695, 0xfec2835e, 0x17dd1f02, 0x8e108c42,
-0x1bdff0b0, 0x7cf13941, 0x535250f0, 0x70125955,
-0xf1fae381, 0x2a64f6ed, 0x4c0c2775, 0x75f0895b,
-0x427645c7, 0x266f458e, 0xd97411dd, 0x4fbf8b6c,
-0x00e8d10c, 0x6a20a86a, 0x8cf67c10, 0x02e47350,
-0xe8d0dfd0, 0x5fdc91e9, 0x83542036, 0x6ae903c0,
-0x90dbb3f5, 0xd1821301, 0x2cc51534, 0x9a36b75f,
-0x5bc9beff, 0xc8b30e76, 0x1ac118a4, 0xf0ec16bf,
-0x7b10bba9, 0x25008ba3, 0x09086841, 0x10cf08ff,
-0xa98045bb, 0x2b7b9856, 0x60a1b1c1, 0x0abef339,
-0x613f4ae2, 0xe20c5782, 0xebd93917, 0xa37e06db,
-0x1604c109, 0xbec10142, 0xc10b5bf5, 0x8b0f850a,
-0x40a1c85e, 0xa331ba2b, 0x651a36e5, 0x499cd330,
-0xbf020847, 0x7d9c6c30, 0x830f026e, 0x03e5f0e7,
-0x89ef4b86, 0xb964273d, 0xdce07580, 0x97257ef0,
-0x0e838d0f, 0x8e2d189d, 0x36fd3a18, 0x05b88d32,
-0x1ae19605, 0x76674098, 0x1e04d00b, 0x6f588289,
-0xad1ef785, 0xe58309cb, 0x1dfaa4f0, 0xa57328d0,
-0x68046a51, 0xb95d8855, 0xcfacfdb1, 0xf5c60555,
-0x0707c658, 0x5d73a464, 0x05d3431d, 0xaf490e08,
-0xa10c6c11, 0xba288883, 0x1c896c5b, 0x7b0aa62b,
-0x74162210, 0x28c6c44b, 0xff510514, 0x74601805,
-0x1c50adbb, 0x0d071d54, 0xc5b6cc1e, 0x283cb3ba,
-0x070f2003, 0xaeb2022a, 0x8222c18b, 0x26032e13,
-0x10ccdb6a, 0x7f11309b, 0x75321014, 0xe457b64f,
-0x3643057f, 0x3ec6405f, 0x43757413, 0x054680ae,
-0x06c6f948, 0x4e4a12f9, 0x52125005, 0x0436163b,
-0x01586ad3, 0x738d3c3d, 0xfd18e196, 0x05432860,
-0x68f104c7, 0x742b195a, 0xb5efff64, 0x06462554,
-0x46c60201, 0x46942c08, 0xee9276d9, 0x461486ae,
-0x5a0e2c0a, 0xec0f7583, 0x46ed1246, 0xe2140320,
-0xeb1b1946, 0x160322ba, 0x1a281822, 0xf6131c05,
-0x651e184a, 0x46e92446, 0x89560382, 0x46ac6526,
-0xb7db172a, 0xe3833a47, 0x285e0c0f, 0x70b42c6a,
-0x8f060868, 0x09462871, 0x8c80c768, 0xb63c77bf,
-0xdf891cc1, 0x24d23468, 0x9d76d6e8, 0x375389b1,
-0xd4df6a5a, 0x842c8971, 0x14ddac5c, 0x3b07f918,
-0x96e0c1dc, 0x24ba3030, 0x09c6d1f0, 0xf7592dd7,
-0x001ac225, 0xa705c2c0, 0xeb6b47dd, 0x6c8e62d9,
-0x685fbaf0, 0xe9e804e3, 0xf91d21f6, 0x441bcc02,
-0x235b1822, 0x36f415fb, 0x56567df8, 0x0b745339,
-0xdddd9a9a, 0xb095be87, 0x97047401, 0xe80e68be,
-0xf73df8da, 0x66241a14, 0xafcfc529, 0x4ef06e0f,
-0x48cdb503, 0x81cd250b, 0x8d0af4e1, 0x02090a94,
-0x9ad4f8e3, 0x4e83e0cd, 0x7f38de0b, 0x8a17a3c1,
-0xbad0361e, 0x75d044a9, 0x01f38e17, 0x4c835fd0,
-0x06296027, 0x80833062, 0xaeb4fc1d, 0x42845981,
-0xa4d2e743, 0x91d4a0da, 0x9eb1c082, 0xfbd0c811,
-0xeb291c1a, 0x70acb85a, 0xe3837d0b, 0x0b899392,
-0x684bbac0, 0xd61d31b1, 0x5d7c325c, 0xebba178c,
-0xe8671857, 0x23c3541b, 0x21dafc22, 0x05527716,
-0xefc4e82d, 0x3634222c, 0x1c6de3c7, 0xfb30d08a,
-0x7b6168d0, 0x66104f6b, 0x1102c010, 0x0af31982,
-0xde180c1a, 0xdad4a9a0, 0xb1fbe083, 0xd46c36e0,
-0x1204bef6, 0x800fe283, 0x106df6a9, 0x040e140a,
-0x02334fbc, 0xb508947c, 0x2f46464d, 0xaf343018,
-0xd8bf38ef, 0xcbeb2de8, 0xd820acd0, 0x4114abc6,
-0xad036019, 0x81c55424, 0x77052a38, 0x20e277c7,
-0x028b4676, 0x04428b43, 0xe898795c, 0x08076d8a,
-0xdc04f57a, 0x302d6d0b, 0xd14a6b23, 0x989a0471,
-0xe26f0ae0, 0x80c6b622, 0x8b0ddf83, 0x245d6317,
-0x68167d5b, 0x8b0db89b, 0x0640b243, 0xbee1e927,
-0x7fd76a6d, 0xaf09135b, 0x0a031072, 0x3790baeb,
-0x2d1b0c35, 0xcb3c8c68, 0x49fae8b3, 0x753b6f99,
-0x78cad904, 0xb05a15c4, 0x0bd9b239, 0x1fa8000a,
-0x4e42888b, 0x9c09b46f, 0x638e5728, 0xbe02f8c0,
-0xbbf4f8db, 0x07771aa1, 0xa085348b, 0xed147b27,
-0x77761940, 0x7718651b, 0x1b741e54, 0x07760a48,
-0xb81d6c7a, 0x19ff2cb8, 0x72db8c14, 0x02bae874,
-0x921d6f86, 0x0dddb87a, 0xb81789ad, 0x3a397440,
-0xd81ecdeb, 0xa73f0364, 0xa1247b8d, 0xf6530024,
-0x75ecf25c, 0x497a33ac, 0x0b2994b2, 0x35b86306,
-0xa0928e0c, 0x6a6461e2, 0x0c866303, 0x7d193153,
-0x037ba054, 0xc377906d, 0x85a3208d, 0x205c6868,
-0x851906bf, 0xc5ffffff, 0x09e7d350, 0xb0f631d7,
-0xeeea8980, 0xedee88b0, 0xc383cb89, 0x872f7804,
-0x4a2df05c, 0xd98877bc, 0xddb6f8d3, 0x89dedc3f,
-0x4ff7c019, 0x8ba602e0, 0xc8832414, 0xed778a29,
-0x080b7365, 0xd5794b8c, 0xbbed3e39, 0xeb65ee10,
-0x8cbf5276, 0xf80fb1f8, 0x3dece6d1, 0xf725f78b,
-0xc888c609, 0xeb7f9b24, 0xd426f7b0, 0xc49b306c,
-0xc35f9155, 0x060b9e97, 0x534307cb, 0x4fa9538b,
-0xb068c4df, 0x68ee37f1, 0xd4fb2e9a, 0xe31f4293,
-0x09d80ec1, 0xfe690ae8, 0x8d686b8b, 0xf528b698,
-0xa8ec3755, 0x48fc983c, 0x35c97f42, 0x3b13ec04,
-0x8a5c5b8b, 0xfd920b04, 0x0dffefed, 0x8341ee00,
-0xf27e05f9, 0x758d62bf, 0xf2899a37, 0x8400b9ee,
-0xd8df00b6, 0x63445d0c, 0xb8efda89, 0x6245038b,
-0x40e24f77, 0x99c8b4ef, 0xef30551a, 0xb858e028,
-0x4c0d20c5, 0x1aef7266, 0xeebfdef6, 0x0704a5d6,
-0x840eb866, 0x08210b3d, 0x08dd95bd, 0x05ef0c25,
-0xb8ef663c, 0xb2c0d0d0, 0xa32c74e1, 0x35d8e830,
-0x685c7bb8, 0x4be5bc9e, 0x85c243a5, 0x30559e16,
-0x68f2fc22, 0xb30cce8a, 0x4288fc0b, 0x321c896c,
-0xa3d7437e, 0x16d85c5a, 0xc0c85106, 0x0aee5206,
-0x95b83b81, 0x39e88971, 0x81293d5a, 0x5e25c280,
-0xb62694a8, 0x3fe15af8, 0x7296bc06, 0x8d57fb9b,
-0x3a610756, 0x46e31e1a, 0x1452a150, 0x5ebda8d5,
-0x3ebdca58, 0x17e47e58, 0x51224812, 0x9788ec58,
-0xd766140a, 0x666251b6, 0x6fb86ee0, 0x01c4f67d,
-0x31892eba, 0xfb0633ba, 0x9dbd8eeb, 0x0e38b852,
-0x50063bb8, 0x5c72ff98, 0x68da7b63, 0x0750935b,
-0x3029ec31, 0x3f04ccb4, 0xe852dc93, 0xc1a28041,
-0xa016b7df, 0x7504a85c, 0x00c7182c, 0x1afe7e59,
-0x40c776dc, 0x4c064948, 0x20501bf3, 0x1811061e,
-0x1a5fcc8c, 0xdb166204, 0x8d1c683d, 0xee4adb54,
-0x44fd301c, 0x2c0aa312, 0x0edec486, 0x3746b876,
-0x6a233b7c, 0x17425d06, 0x682ce3bb, 0x66e803dc,
-0x7712524d, 0x208a6454, 0x5411e2df, 0xf93bbbd8,
-0xe868d42e, 0x37534013, 0x11ea6838, 0xe7c0777e,
-0x7f0ec32e, 0x4a83c608, 0xfe014300, 0x3bebadf8,
-0x358bf376, 0xb5148d5b, 0xcff7f114, 0x6630d6e0,
-0x81687703, 0x6e8d25c1, 0x8182d620, 0xefea0bde,
-0x7230cb81, 0xde1ad910, 0x1eefc0b0, 0x1270faeb,
-0x3e614f8b, 0x157378ea, 0x2515f758, 0xef1b800c,
-0x95a186e0, 0x95500700, 0x870beae0, 0xf02537b9,
-0x6224db72, 0x5b1032b1, 0x850a0df1, 0x8d1374df,
-0xf0031846, 0xa3e10d06, 0xe81f93d8, 0x2be3e8f8,
-0x49488c05, 0x6ec0b642, 0x7942dc34, 0x0ceb664e,
-0x60c301a8, 0xc52d2580, 0x42f0f5aa, 0xb26dc7b3,
-0xdbb7840d, 0x15389082, 0x52e8db68, 0x35dd80ae,
-0x2d5c0d1e, 0xd47ad495, 0xad81fed5, 0xc11e252f,
-0x3ea810ef, 0xc0771140, 0xff83653f, 0x35860f3b,
-0x6deeff81, 0x1ed12ff7, 0x8d3a0e7d, 0x003dfc4f,
-0x644e2d20, 0x77f70d1b, 0xfcbb8d9b, 0x50d32941,
-0xcc828d53, 0x9bba1045, 0x6076d4a3, 0x29a80b21,
-0x1983a5d8, 0x05142bfa, 0x5e035e6c, 0xf1d7ff60,
-0xbc18cad7, 0x07478d79, 0xb60aa3db, 0xb8b83815,
-0x38a2cde3, 0xff618398, 0xac519fbe, 0x0001baef,
-0x4f031af7, 0x081447db, 0xc51f3f49, 0xf21b5825,
-0xfb1cf0c6, 0x23f5ffff, 0xecbc752d, 0xeb855153,
-0xdc088291, 0x6d028101, 0x06765113, 0xdbaf8008,
-0x9146cc97, 0x25ed8352, 0x49267fac, 0xdbc36f85,
-0xc3660374, 0xeb8a530d, 0x6fb01af6, 0xf02185e6,
-0xc3ee36c2, 0x76e8ae35, 0x23d7f1fb, 0x73987059,
-0xc864aae8, 0x988bdcbf, 0x09601719, 0xc0649be8,
-0xebc08887, 0xb9f42151, 0x3c173a19, 0x52a6fe96,
-0xd7765e68, 0x44ef0b15, 0xe819f840, 0x2e5be811,
-0xcf8c10da, 0x796aa1bf, 0x1d6d6faf, 0x080c89c7,
-0x0131f8ca, 0xfadb3b00, 0xc38aa5db, 0x0c4384db,
-0x08743a3c, 0x0b1eb343, 0x7e1eec2e, 0x64bff475,
-0x056c9486, 0xff791f73, 0x36243f37, 0xd114c03a,
-0x8331f24a, 0x57e108c7, 0x721e67e2, 0xf65653e1,
-0x3a526859, 0xf6fd1fa4, 0x5a04478a, 0x34986859,
-0xb229ef73, 0x41ec1a96, 0xaad24c85, 0x70589603,
-0xe928092d, 0xbc42461e, 0x50c3c344, 0x0843ba75,
-0x03428dfe, 0x4fe2ddc2, 0x037a8082, 0x25740d2f,
-0xd59377d2, 0xe851e847, 0x180c17c2, 0x3a388031,
-0x77e8f07e, 0x3980311f, 0x5280752f, 0x516568a8,
-0x56ebf764, 0x05e889a3, 0x3e585e84, 0xd3eb42f0,
-0xe9040500, 0x01402773, 0xfd0aaeb7, 0x756a525f,
-0x33815251, 0x78783917, 0xa308ee58, 0x92f3eb10,
-0x332d7f11, 0xfc053d36, 0x61a8dfb9, 0x47850343,
-0xb84af0e4, 0xbbb7bb17, 0xc604eb17, 0x903d4004,
-0xfff5726d, 0xa501bc1f, 0xbbe8fb69, 0x06153d65,
-0xc8c268f8, 0x6e56bc02, 0x9a8eeed1, 0x0462dbdd,
-0x74ed179a, 0x04e9f3e8, 0x8860c1f8, 0xaeeea093,
-0x02e647e8, 0x6ac61db3, 0xf479c03d, 0xf4b7b406,
-0x8515b2b4, 0xcd8c6447, 0x0b21db22, 0x0d1f99e0,
-0x2e26f75b, 0xf9097e3a, 0x01b58e0f, 0x8408fe72,
-0xbbda1ad9, 0x4a7f6f35, 0x6f09f685, 0xf17a1800,
-0xf3d1efdd, 0x04e4a13c, 0xbe0c50ff, 0xd8ec46ff,
-0x71f07519, 0x33219875, 0x375fc2c6, 0x09a1c202,
-0xb8f8658d, 0xa7bf66c9, 0x04feedcd, 0x8c020d4a,
-0x79fea9a2, 0x04f72774, 0x71b97c3e, 0x414599f0,
-0xbb33ec3d, 0xa10b4075, 0x3d927ffd, 0x742e0df0,
-0x9f7ef06b, 0x9beb621e, 0xba9290e3, 0xe5076c4f,
-0x053bd548, 0x08940418, 0x5029b41f, 0x926d1943,
-0x4755cc68, 0x7a58532d, 0x6bc14644, 0xe8a37731,
-0x4e22a443, 0x8e105b24, 0x95e005fc, 0x09badc09,
-0x30d8cdb7, 0x2ee90333, 0x73344553, 0x7666ec10,
-0xda46b9e0, 0x2e09befb, 0x49ca0406, 0xe78e7ab5,
-0x9429856e, 0x4df200ee, 0x5f85e9d9, 0x6b782b81,
-0x396fc985, 0x63d02042, 0xe75f3ec1, 0x9644b17a,
-0x75fbe991, 0xbec4ba87, 0xb80b57be, 0x7afdc4ca,
-0x0e047bf1, 0xe9103e63, 0xfdfe8c2d, 0xbbdf6360,
-0xb8fed002, 0xecae0356, 0xecd9d809, 0x18b7e9ef,
-0xfb011442, 0x22a753ae, 0xa10d873c, 0xe25e78a6,
-0x06bbdcde, 0x6a36147b, 0x8dd46801, 0x344c686e,
-0x3b63ba01, 0x2826fa3f, 0x6885f9e9, 0x1323ab23,
-0xc2ae3730, 0xfd9cccd4, 0xf0ea4860, 0xc86f2243,
-0x425e1318, 0x372be94b, 0x2231ef24, 0x2999084d,
-0x34d3880f, 0xb3cdb043, 0xfdc9ee01, 0x5d31fcd5,
-0xe19868ba, 0xacc746e8, 0xef87a5ae, 0xf1f829df,
-0x950c8d42, 0x16a3a162, 0xd3c5f02f, 0x7f0f05e8,
-0x21ebc107, 0xd0ac61f0, 0xa322d0fa, 0xc60a7e0f,
-0x17963719, 0x4f0d75e2, 0xf14ac503, 0x0ba1778e,
-0x89687fe6, 0xbecdb6c2, 0x6082058e, 0x8ba6a331,
-0x5bd8b50a, 0x14e77ae2, 0xbf7b86ab, 0x31fd8fb3,
-0x0d105089, 0xa11c5889, 0xbe8a2021, 0x7845a803,
-0xd301c767, 0x84fd3991, 0xebccc6c7, 0xfe98e9ec,
-0x3be802c9, 0x07849c15, 0x3634ac17, 0x2efa85dd,
-0x689dca78, 0xac4c9c2a, 0xfbb03fdd, 0x48fa81d1,
-0x247c7669, 0xbe0f1869, 0xb896401d, 0x6fe01621,
-0x746f4813, 0x7e307728, 0xc76f3855, 0x8d566172,
-0x4e87c5b6, 0x622005c6, 0x4d6ee483, 0x8c26425b,
-0x27613488, 0xfa2c047b, 0x74237850, 0x5f673a2d,
-0x27e87b0f, 0xf7caeb33, 0xaa012757, 0xe8ee91ee,
-0xb712fb58, 0x0bf308e8, 0xcf6893ab, 0x60fec36a,
-0xcb10e206, 0x83be017e, 0x3950783c, 0x4dc589da,
-0x07870f34, 0x061f0301, 0x0488af21, 0x1620d939,
-0x247a043f, 0x8ac4820f, 0x0e76cb39, 0x6db9aa39,
-0xf53985a0, 0x35010f17, 0x3396e51b, 0x28f4fe16,
-0x2c416c12, 0x98f56a3a, 0xcbb6bc1c, 0x0bd8cea8,
-0x27fe1e14, 0x03d421cc, 0x6c811ea3, 0xf50e01c1,
-0xde380d8a, 0xbb3dd6dd, 0x09789113, 0x390d8b2c,
-0x281f1c03, 0xf74dfba0, 0x7c76b972, 0x77142c0f,
-0x8b0a72ad, 0x1b753913, 0x77f3eede, 0x346c3ba1,
-0x34781376, 0xc82b092b, 0xa90c85d5, 0xc3d989c5,
-0x47c05f6a, 0x8d3eebe9, 0x80ee98b0, 0xc1fd3eab,
-0x5351561b, 0x10706855, 0xc42f40df, 0x3c3a1053,
-0xf69febfb, 0xff8bb122, 0xfac03119, 0xb4fb191b,
-0xa38bdce0, 0xd482d86f, 0xdf0471e9, 0x50ae9b61,
-0xd1eba446, 0xa90ddc54, 0x2de8f508, 0x98c29d24,
-0x80f47091, 0xa0794e53, 0xd080c155, 0x36f4d0d3,
-0x10ce3a2b, 0x500c0707, 0x80f990b8, 0x4d2d791d,
-0xd2ef4dce, 0x81baee17, 0x6838142d, 0x009f9aaf,
-0xb42ab14b, 0xe86cdb64, 0x3075f94c, 0x4899187a,
-0x5b08cb5f, 0x583d58c2, 0xbea4a1fa, 0xa19724d6,
-0x2422f1cb, 0xdda24aa1, 0x1b92ddf1, 0xb0291cb4,
-0x09cf8905, 0x1b7674d7, 0xd518a085, 0x392e2bee,
-0x6dda5df1, 0x0e726fdc, 0x3986821c, 0x037ab0c2,
-0x86085a5c, 0xa9249b29, 0x0ee0beb0, 0xb47a0876,
-0x08b8a109, 0x34743374, 0x445d4b3f, 0x77d8428a,
-0xbc329436, 0x5352c3df, 0xa1ba8d08, 0x24c62ca0,
-0x445220e8, 0xdbd632c3, 0x01c350b0, 0x1d1d01b7,
-0xada2663c, 0x4115a337, 0x5ea2e418, 0x8ce9d46b,
-0x69bd81ba, 0x416dbaca, 0x160ff7ac, 0x770269c2,
-0x6f442d0b, 0xa8efedee, 0xac2d131a, 0x72140324,
-0x1cc4a605, 0x700750b4, 0x1636460d, 0x5cea203d,
-0x7efe6fdd, 0xa0ba8363, 0x063a014a, 0x5aeb6f75,
-0xac1398b4, 0x60640edd, 0x823a37ff, 0x95398fdb,
-0x06774048, 0xf939c872, 0x7fdcc472, 0x742708e8,
-0xe0c15716, 0xa4808b05, 0xfef43526, 0x413970af,
-0x89a77340, 0x10458b35, 0x8d8e1067, 0x7f624661,
-0xd8c25b9d, 0x1b76dcd7, 0x8637e6c1, 0x8bdba3ac,
-0xf62ceda4, 0x8e8b31a9, 0xb0dbae4c, 0xff4c3611,
-0xea11f801, 0xd319c129, 0x8d0d1f42, 0x845b6dd6,
-0x440f991d, 0x392bb040, 0x5b09ea09, 0x085c7fab,
-0x1638821a, 0xfcfb1e01, 0x25f02835, 0xb7290900,
-0x3ddedf8b, 0xc1014f33, 0xcd01fb11, 0x5e4d5c11,
-0xf07dd43b, 0x09f8ac0f, 0x5b5d0c1d, 0x85740171,
-0x3a489e1a, 0x6d8dff38, 0x1584d7b4, 0xa34d8294,
-0xdc1a154e, 0xc143eda7, 0x780de31d, 0xb91c6a79,
-0x09dbfb82, 0x3db715bc, 0x88881072, 0x2e2c7c3e,
-0x55068406, 0x68346a08, 0x3aa3e84f, 0xd30a6d03,
-0x0e9458c7, 0x68746c5a, 0x6fc23218, 0xd6ed0c0e,
-0xde290598, 0x2f50c706, 0x06b82ded, 0x2dd8112e,
-0xaeb81127, 0x34d5b440, 0x3226f996, 0x088017f8,
-0x688dcf69, 0x31697e34, 0x9f91d4db, 0x58c3c049,
-0xea75bb83, 0xf0fe2304, 0xff57833a, 0xb9bab4b3,
-0x6d85f628, 0x55692051, 0xef9350e8, 0x867bd3d9,
-0x16726ca1, 0x38ab0351, 0x63a1aefb, 0xaea87f57,
-0x3966dfc0, 0x383474fa, 0xa24f7607, 0x8e0c3155,
-0x8e3cbebc, 0x02e14221, 0x5d6deb41, 0x026ce0f1,
-0x16e9b44e, 0xc889d29c, 0x2ad58e24, 0xe8671a39,
-0x25740e59, 0x6b0dc220, 0x72844005, 0x59de08c5,
-0x57e34bff, 0xa850e2b8, 0xec5b7eac, 0x052ee52d,
-0xcf1b7420, 0x604f3ce3, 0x4e6ff329, 0x55b0533b,
-0x63e952dc, 0xc8bb516c, 0x19da29de, 0xc61ca78f,
-0xa1b36918, 0x10ce154a, 0x2b5381b8, 0xfdebe928,
-0xc0ddb1df, 0x3d802cfd, 0x25377f45, 0x0544af81,
-0xec1c0d62, 0x2d021020, 0xe0a1ece0, 0x81146cc0,
-0xf8f4cbca, 0x402d0914, 0xa553b58e, 0xd6804d4f,
-0xed85ce48, 0xdd1bdb82, 0x1d8ad94f, 0x32eb1d44,
-0xfc4c8ac8, 0x87e1c1a3, 0x34ce488f, 0x38a3f887,
-0xdde25cc1, 0x881a99a2, 0x25992315, 0xb625e9f0,
-0xc1dce20e, 0x90148da8, 0xbbf0c8f3, 0x2d840cb1,
-0x84263c15, 0xb6bd2522, 0x7593dc06, 0xdc58756e,
-0x9808232f, 0x222017ea, 0x9f1c85a2, 0x4ae80268,
-0xb5a07304, 0x72b44ded, 0x7a8b47d5, 0x13468a0c,
-0xc0da5762, 0x7c0336b0, 0xad7af50a, 0xb61a376f,
-0x80186c4f, 0x047474e8, 0x0a7b7402, 0xa1bfe10c,
-0xe9c82992, 0xbd9bff58, 0x1d35c01a, 0x7544869b,
-0x7bc0486a, 0xe433a177, 0xeb89fb3b, 0x3ded0476,
-0xb1b7868c, 0x488fcda1, 0x743d9242, 0x97cf5b6d,
-0x2129945f, 0xaf509854, 0x254ab5e1, 0xa3ad269a,
-0x5f6de019, 0xfed3e9c3, 0x6e01faa1, 0x036d0be9,
-0x7d8484da, 0x251f10c0, 0xd5b86717, 0x28461213,
-0x71b1323b, 0x783424a4, 0x4b60522a, 0x16fd3c0c,
-0x3573282e, 0xb9d21b2c, 0x0d121e08, 0xda65a05b,
-0xf88c77db, 0x8d05eb00, 0x29522e90, 0x26b07030,
-0xdf940536, 0xd9733550, 0x07630763, 0x335a58a6,
-0xf69c3a1a, 0xdfba3c1b, 0x74932505, 0x5106e60a,
-0x1e2bbb88, 0x518973db, 0xd7169e0a, 0x82eefc04,
-0x6b400d50, 0x5031048d, 0x0dc1998d, 0x511cd0b8,
-0x845233a8, 0xd837f7e2, 0x756919e9, 0xd292d50f,
-0xc37c026a, 0x2b56507b, 0x1827901d, 0x3c70e853,
-0xa6bddc2e, 0x4a35c020, 0x5b5e0831, 0x3edc193b,
-0x05c35e6d, 0xd98c52e8, 0x87d809e5, 0x98a3683f,
-0x0e022404, 0x2e3a3deb, 0x6cae6fc5, 0x428d1c32,
-0x77d766fc, 0xf6706b07, 0xeb046dff, 0xe9a8e890,
-0x840bffff, 0x90420bf6, 0xeb1986ea, 0x49f8d5db,
-0x64c4d81b, 0x1033ff8c, 0x35347760, 0x2fd52829,
-0xa91b5e1b, 0x5553d59e, 0x6e3bd384, 0xb7f80d3d,
-0x457fffdf, 0x3e74464c, 0x752ec031, 0x7d8175d1,
-0x03133600, 0x31f4f11b, 0x60d639da, 0xbc75d389,
-0xbd8eb5af, 0xd6533c41, 0x2cc8bba2, 0xe105c73d,
-0xd6f16383, 0x1ca19bba, 0xb5b14525, 0x3d00bb41,
-0xb1350001, 0x36b17049, 0xe80bfb1a, 0xa3a2bc02,
-0x2dda9274, 0x7299b6e8, 0xb6340888, 0xa3238d75,
-0x2707742b, 0x058c0320, 0xbe60ee06, 0xe8776013,
-0x816a6bbb, 0x12d7cc06, 0x325e0bc0, 0xc2af0a8a,
-0x11151811, 0x3da2d0af, 0x006b811d, 0xd37d8c53,
-0x4e05a780, 0xbf0414ab, 0x7ccec46f, 0xc668cb47,
-0xb823203d, 0x9df276c0, 0xe6e9dcdd, 0x19de63fe,
-0xba128106, 0x2fbaf6dd, 0x093a1fba, 0x5920bf84,
-0x23f859b9, 0x5c00e7e8, 0x39106a53, 0x318dc320,
-0x883a99f6, 0x8b0ce82a, 0x78a3c6a5, 0x8c6af7d0,
-0xbc2e3e9f, 0xa352d405, 0xe8b9a38d, 0x167a71b0,
-0x5f31f58c, 0xc60ba984, 0xecea156a, 0xc10a0251,
-0x17b785be, 0x95548d27, 0x80021c3d, 0x7442be99,
-0x36ffe36a, 0x3907bd76, 0x514676df, 0x43924b8b,
-0x5fdde056, 0x010814cb, 0x0c5651f1, 0x51044b03,
-0xa5ad5647, 0x7c741ff8, 0x0303438a, 0x1ed90873,
-0x15f67b65, 0x5d5503b0, 0xb6755493, 0xc19ac524,
-0x2682219a, 0x7facb052, 0x555c6348, 0x0039bbd6,
-0xa224a100, 0x2e7ac5dc, 0x6e9c01e8, 0xc52aafba,
-0x25087c0c, 0x49dfe901, 0xb0b06051, 0x5009cb2b,
-0xcc298a52, 0xe0910a3d, 0xf7d63972, 0x0c0d8b06,
-0x5fdc9b5d, 0x41a4353f, 0xdb196368, 0x0ebc3cf6,
-0xf14da2df, 0xd4e91375, 0x2f015a13, 0x8d0fc339,
-0x89e0e128, 0xe5d86e19, 0x4a3faddc, 0xa46c4a3d,
-0xee407983, 0xf8b185c2, 0x8bd975da, 0x1e491298,
-0x60f30b04, 0x77fdb6d9, 0x1d5c8dc9, 0xcb0a0c21,
-0x1a833050, 0x9c301568, 0xdb81a728, 0x00c4ff12,
-0x60eb1572, 0x3987082f, 0xe214c103, 0x0c241a9b,
-0x8b277330, 0x3efd4613, 0x8dfb46fc, 0x348d0c4b,
-0x0ec08363, 0x762ef001, 0xbad94e9b, 0x76073930,
-0xd57417c6, 0x992cadc5, 0x281b1e74, 0x963f16a0,
-0x2c9e1f70, 0x44e4d203, 0x106b35c1, 0xde80119b,
-0xe84bb56d, 0x1fe9ed5d, 0x0026badd, 0x364a8e00,
-0xa8096d19, 0x3809ac0c, 0x2032b6c8, 0x39e9b809,
-0x90774304, 0x0c8e5c2c, 0x1d3c6434, 0x757db4a1,
-0xb8a4eb0e, 0x7d31ae01, 0x8410ab98, 0xe1c1c54b,
-0xb4ae232d, 0x2f423a5a, 0xdb6d407b, 0xa7fb703c,
-0xc181fd4f, 0x505b8b9d, 0x4902718b, 0xd406fc40,
-0x2203ceb0, 0x04ecdb20, 0xc6c60153, 0x516f1120,
-0x3df30ee8, 0xb7dced84, 0x4a31a1c3, 0xa1187466,
-0x8ded08c4, 0x20ff205e, 0x73a40d72, 0x70996609,
-0xc091616a, 0x4e89e3ea, 0x92db92c4, 0x688b801b,
-0x86443841, 0x376b518e, 0x5853a1bc, 0x4307eb3c,
-0x467d3c7e, 0x1fbdb4ac, 0xe2c13e8c, 0xe5757405,
-0x596c8a8d, 0x1aeee52f, 0x7348763c, 0x82132f04,
-0xdbb9bab4, 0x448663be, 0x1c440f76, 0x76400c50,
-0xd0ddd5b9, 0xb3eb40bd, 0xa248058b, 0x10c18540,
-0x2201941c, 0x94f545b4, 0x627ba378, 0x412ba6f7,
-0x3838f983, 0x41213486, 0x98050b80, 0x5dceaf86,
-0x47052601, 0x76101887, 0xae1121ee, 0x572eff17,
-0xe29a8334, 0x1411ed8d, 0x5a7b3339, 0x351ab845,
-0xdc9e011a, 0x1300f120, 0x039001a0, 0x120edba6,
-0x6e1392d1, 0x6c10bd77, 0x2df7f886, 0x2689a731,
-0xd1015905, 0x398bc839, 0x738dbff7, 0x76d03906,
-0x181e4102, 0x201ef70e, 0x0c137376, 0x1f23d088,
-0x6ec44b0a, 0x76953bc2, 0x0f108e0a, 0xebfc0739,
-0x7609108f, 0x68153b0c, 0x87eefe11, 0x546c0dc2,
-0x1c07ff02, 0xc221d0f7, 0xdd6cd139, 0x3efb8d86,
-0x3bd1297f, 0x55320b38, 0x570e250b, 0xd0bbde64,
-0xc0cae188, 0x42c04666, 0x7e83e3ec, 0x930105e3,
-0xca0e8b28, 0x0c234b47, 0xb87cc943, 0xbc72de15,
-0x46e9e381, 0x68084018, 0x1c7ef1fd, 0xb37cdc16,
-0x31aec035, 0xb23e0843, 0x4954a9bd, 0x10481e77,
-0x7c80049d, 0x6c01c930, 0x8f0d0d0d, 0x56dc2e60,
-0x86e9b1e0, 0x7d11eaca, 0x1edf8f08, 0x6d12ad93,
-0x66ee2906, 0xd84c57a3, 0x6eb1168f, 0x4f3f5de9,
-0x9d889dbb, 0xe29b8028, 0x7d032950, 0x4c69ba66,
-0x7c684c7e, 0x17e9c316, 0x65cc89fa, 0x12ac2927,
-0x26859404, 0x24703576, 0x02281501, 0x8f8546c0,
-0x00e800ce, 0x76160ca8, 0xe8bafe1b, 0x82fb3909,
-0x730c0835, 0xd410014d, 0x45afed16, 0x222e73eb,
-0xac7b05da, 0xc2f98ffe, 0x3109eac1, 0x19d629c9,
-0xd80142cf, 0xd2f62c89, 0x3f891b1b, 0x29882fa3,
-0x513989eb, 0xb8344922, 0xc8df6f27, 0xf06f06f1,
-0xfde4ad72, 0x09f031fa, 0xecef5b6d, 0x5e4074c2,
-0x09df3ea1, 0x58e80149, 0x295a36bf, 0x55304ec5,
-0x57001553, 0x41416338, 0x332a1561, 0x8c6dbd83,
-0x2594a191, 0xb2d8a592, 0x77f166c5, 0xb951e9b5,
-0x1e08293d, 0x090b6496, 0xd7e83d0c, 0x2c3bc2c4,
-0x5964a3b9, 0x250134f7, 0xe1550882, 0x71f82330,
-0x37e9c712, 0x8eda9090, 0xd2382960, 0x0ddcda31,
-0x73f02fda, 0xa0c1f625, 0x740e04b6, 0x2687b903,
-0xc2c33468, 0x95315b81, 0x46fed1a6, 0x2bfc1083,
-0xd93941d0, 0x9e0edb72, 0x7ea004e0, 0x0ccb54ea,
-0x2ad12edd, 0xd2f71cc1, 0xd8027416, 0x25475c05,
-0x02ba1cd2, 0x891d3d3d, 0x2d05efba, 0xc03df706,
-0x78c80de7, 0x787817ab, 0x55b85f69, 0xe9f713ed,
-0xa160dfdb, 0x1fc5c8b3, 0x290cfbc1, 0xdb5b35c3,
-0x026c475a, 0x6f07d583, 0xe086c309, 0x027ad0be,
-0xbbcbc129, 0xca2903e2, 0xdcdb4086, 0x16c24fd6,
-0x800223db, 0xddbdb115, 0xd17711c8, 0x89430be2,
-0xf67827d1, 0xeaac4149, 0xf5e8c05b, 0xbd0579d0,
-0x646dab69, 0x15bf0f40, 0x05b6c268, 0x100c6cde,
-0xab288aeb, 0xe3297f16, 0xb744700d, 0x841e8aa1,
-0xf8d6fc30, 0x74144346, 0x9f418a1c, 0x88da8818,
-0x06ff7ec8, 0x2bdf1c4b, 0x75c238df, 0x1f47460a,
-0xf0bfe475, 0x7d1bd52f, 0xc3be0fdf, 0x04dfe183,
-0x295ed1be, 0x721a3bd0, 0xdbf27814, 0x5b0a147f,
-0x5e01eef7, 0x5b0e744c, 0x229bce5e, 0xc2f6fad2,
-0x3842be06, 0x058d118a, 0xec76093c, 0x64b4382f,
-0xad0eee92, 0xe005f495, 0x18b0518e, 0x31e1ea89,
-0x15ff31f6, 0x884a184a, 0x7013644a, 0x021a00e5,
-0xd07d34b2, 0x9d68e11b, 0x9a3b74d1, 0xffff6f77,
-0x02ffa86f, 0x8942097f, 0x39802414, 0xc126752e,
-0x094708e6, 0x7e0313c6, 0xf6ebf1c4, 0x7bf089c2,
-0x0410c8c1, 0x8922c689, 0x0dc6bc30, 0x29a23947,
-0x4407a4e8, 0xd1430a1f, 0xe9cfdee1, 0xf8bfedd6,
-0x02eb1258, 0x64e460e4, 0xe1a8c09e, 0x0cd7a804,
-0x097b86e0, 0x6f18c5e8, 0x0cb5e872, 0x18f89ba9,
-0xe8f50168, 0x7f0bd00f, 0xfd51fbbf, 0xb097b8e8,
-0xe864e6d1, 0xe6df08af, 0x08f8ec60, 0xa6eb1576,
-0x834db627, 0x8b7bddfb, 0xf01d2e6e, 0x890d743a,
-0x26e94b0e, 0x10bd4dd1, 0xe80d0642, 0xe29d67d5,
-0xf619c3c8, 0xda3d80cf, 0x9bf9360e, 0xe82e2961,
-0x23e810ab, 0xe5db6f7d, 0xc0958842, 0x6f13c064,
-0x51cef7bb, 0x45eb5b7c, 0xe8187507, 0x92b34cff,
-0xef2921bb, 0xae08cfe8, 0xc059e217, 0xfbce74b7,
-0xfb07740d, 0x12280ab3, 0x74cb8c96, 0xf777fb70,
-0xe8f33c77, 0x1bf878a2, 0x04041174, 0x789bba74,
-0x75cc7dab, 0xff93badf, 0xba0b0aeb, 0x0f6baacf,
-0x527c61f0, 0xbecdbe13, 0x861061d0, 0xe8db8410,
-0x1361ce81, 0x1c5c1bf1, 0xe805eb58, 0xce72eb9a,
-0xa306ee52, 0x1462f218, 0x1f681c27, 0x9f15f6c2,
-0x1a2d708c, 0x07181a20, 0xd22ab041, 0xe05c8fb9,
-0xd41fa7c1, 0x8dd0868d, 0xe20626be, 0xf8d63e0e,
-0x688d08e4, 0xc1a350ed, 0xf00a818e, 0x433036ff,
-0x990e80fc, 0xb900b08f, 0xddc6d7c1, 0x14c3a7c1,
-0xa4a0c049, 0x4060cfbb, 0x8bedc19f, 0xdc831c93,
-0xbf6c873c, 0xd577403d, 0xc4747817, 0x9d9a016f,
-0x934b26bd, 0x4b4bc016, 0x04758385, 0x39f00af0,
-0x0d72dfc2, 0x9e6a735c, 0x9672ea99, 0x6c68dbf7,
-0x75e4c280, 0xa9656911, 0xefdfbf0a, 0xea8130c2,
-0x47e28107, 0x6d2c543b, 0xe4135fff, 0x14208d0c,
-0x40d70b61, 0xce7ea3af, 0x9e7f56e9, 0xe8066be3,
-0x39748976, 0xf75557f8, 0x03558ff1, 0x685350fc,
-0x864acfdc, 0x6e75e820, 0xe5a24553, 0xcb1a775f,
-0x2e00cb44, 0x4b629b01, 0x7f061cac, 0x72badc1b,
-0x0fff65e9, 0x62c6d61c, 0x540c3906, 0x8b810937,
-0x3058bc21, 0xd8a71301, 0xc993b20e, 0x426467fc,
-0xbb89d3f8, 0x0131fc2d, 0xc3a19148, 0x85bb267f,
-0x8be375ff, 0xe0a73ab3, 0xd9ad1230, 0x2abbff09,
-0x5db0febb, 0xf2f73905, 0x76f21fa4, 0x73113932,
-0xb7c2df2c, 0x66b439b9, 0x48fa139a, 0x0df88ea1,
-0xf5143a85, 0xbb14d338, 0x39b9b007, 0xe7893309,
-0xf73bf019, 0x9a77a068, 0x81750a77, 0x868d79a5,
-0x2a604b68, 0xa07ceee8, 0x168046bc, 0x18a26fd3,
-0xd8b1a81d, 0xba15cf02, 0x038275b6, 0x289f78fc,
-0x582b115e, 0x7d237d0e, 0x4be2e17a, 0x06a328a1,
-0x2041a27b, 0x52e0bffc, 0x0fbc0e04, 0x9c0d999f,
-0x0672e9d6, 0x8275035f, 0x32a13d08, 0xc2ae7e29,
-0x508dc8f1, 0x6a1c02fc, 0xc6821972, 0x51d31559,
-0x70269489, 0x1532b6f6, 0x4ec31024, 0x3b62dc5f,
-0x168b0cea, 0xb1da29e6, 0x2302b08d, 0x3ef84add,
-0x3e78230d, 0x42ec15db, 0x0afc42f1, 0x480d89b2,
-0x2c0cea60, 0x9604e722, 0x2f8cd062, 0x408bc2d9,
-0xd94687fc, 0x070d63a1, 0x3cc239ce, 0x1d4ca57d,
-0xf1bacaa8, 0x6817b5e2, 0x528b3050, 0xe87523f8,
-0xcea450ac, 0x78c12f8f, 0x8c766095, 0xa2e6a164,
-0x2289f417, 0x70d4dba4, 0x10b87ab5, 0xa71ae084,
-0xa8971021, 0xb99e92e8, 0xbafbd832, 0x03281a20,
-0xec230453, 0x35d30293, 0xf2086d20, 0x5f8f67b0,
-0xb2fb24db, 0x5fe4e84a, 0x26417e00, 0x603515f0,
-0xe8780375, 0x55bb4334, 0x375a5827, 0x4b1a0edf,
-0x114b68a2, 0x397ea143, 0xa10d3883, 0x66ec8f01,
-0xefbe7c83, 0x2256346a, 0x75337820, 0xee740fd4,
-0x1a74a17b, 0x0a4f5f08, 0xe6c75be8, 0xf4a722b6,
-0x2aa722cc, 0xa186df28, 0xebe80abf, 0x6128a9e0,
-0x0927dc43, 0x594f00b8, 0xdfe83658, 0x8b3be605,
-0x1d773ec8, 0x708b40be, 0xdc30be83, 0x17df305f,
-0x26d715b0, 0x939e1f84, 0xc821ac67, 0x8b91128e,
-0x8f633c83, 0x9d15b2e9, 0x551a3a75, 0x9f37320b,
-0x297891e3, 0x0806189a, 0x5b590637, 0x74036805,
-0x3d125e61, 0xf1761c04, 0x5b9be951, 0x21080007,
-0x0200147b, 0xffc42475, 0xaf049db0, 0x501c438d,
-0x422b13e8, 0xdb6c06f8, 0x140618ca, 0x8db63116,
-0x1a020084, 0x1ff39db0, 0x22a1c5d2, 0x94d3cdb0,
-0x403fa5a9, 0x18407209, 0x7e0946e0, 0xc6661c2b,
-0x59784503, 0xede25841, 0x8845fe28, 0x0143c603,
-0x05000437, 0xa689544c, 0x664ac88b, 0xa7c5f6c5,
-0xe74388ac, 0x10090618, 0x4148c3b5, 0xda1baca1,
-0x0fed0170, 0x14c46b06, 0xde899a07, 0xf6aae8b3,
-0x4cd42190, 0xfd12f8e5, 0xa2eb0342, 0x10fe1363,
-0x51a4e16d, 0x10403e0f, 0x410b0539, 0x643ef42b,
-0x02411f80, 0x324236a6, 0x2df620c0, 0xee78342d,
-0xaa14c294, 0x2feb29bf, 0xec2da8d1, 0xad4194b6,
-0xcd408a02, 0x02dbf6f0, 0x3c23f83c, 0xe9ec753c,
-0x46a56809, 0x609c76ee, 0x0fe302b6, 0xb074d4f0,
-0x68891b01, 0xe5737b31, 0xed15441c, 0x0c6d5b50,
-0x8819a370, 0x8a54d6db, 0x110688bf, 0xa89ad8c6,
-0x4379b377, 0xe514e883, 0x01db0c85, 0xe801a0fd,
-0x58c648e7, 0x5c16dd1e, 0x225a9837, 0xe8034356,
-0x30ed10cd, 0xc65219c8, 0x2f112686, 0xf79ee228,
-0x84e9c44e, 0x28272445, 0xa160991f, 0xb53f11ca,
-0x110fb1e8, 0x4bc37ea0, 0xb7727e8d, 0x46c3eedb,
-0xeb835114, 0x0edf860c, 0x5f030247, 0x0fc07304,
-0x79475d0b, 0x6e3de8f0, 0x4536ebd5, 0x8f110aaf,
-0x0623c35f, 0x823a7d07, 0x008925c4, 0x1f16c70f,
-0x4fe50ca3, 0xc702e804, 0x030e0369, 0x33e8017e,
-0x2a06eefc, 0xc7fa163c, 0x0df9834e, 0x5015e276,
-0x40b475bd, 0x66e40c4c, 0x090d5a07, 0x6e9db321,
-0xc066ed09, 0xd188002b, 0xad510bf6, 0x097d800a,
-0xd8640f11, 0xd827db53, 0xe4555600, 0x0340c4c3,
-0xcae76af6, 0x8f5dce54, 0x103cdfc6, 0xbd8d028c,
-0x785fb3b0, 0x74b52c0f, 0x05663d39, 0x26778d04,
-0x821fe336, 0x6f8db656, 0xfa3ee80e, 0x00d81330,
-0xbae77dda, 0x7eddca4b, 0x11088cdb, 0xc7f63b0f,
-0x51021b45, 0xdfb18eff, 0x531c5f38, 0x310ce856,
-0x1677de0c, 0x20c78356, 0x1b60e857, 0x27fad9ef,
-0x34680411, 0x5a0fea74, 0x06f336ec, 0xda316468,
-0x666a550f, 0xd6b708e0, 0x402d0792, 0xe0e979fb,
-0x26c08eda, 0xdbf70595, 0x0fc4852c, 0x16d18857,
-0x740cc58c, 0x0b6a1b81, 0xc0316243, 0x12212548,
-0xbff1bfc4, 0x0e6a8d38, 0xc60e528a, 0x0f0a3cbb,
-0x42fea087, 0xc6e28d53, 0x7b899390, 0xa755682c,
-0xb0544ecd, 0xa9433734, 0xf7fe7fbb, 0x2716c13f,
-0xc674821a, 0x6ac1c3f4, 0x6519617b, 0xaf8f0c84,
-0x62b380cf, 0xf4582478, 0x7046e91c, 0x1e7843a8,
-0x7bcd8f3a, 0x3afc6c9b, 0x8422c683, 0x04560845,
-0xa5df742b, 0xd6867572, 0x1387805c, 0x6be1836b,
-0x277e8501, 0x26e89706, 0x6316d839, 0x4e0f30fd,
-0xf88aaf6c, 0x0ba4f7b0, 0x4c1de3e9, 0xdb05dc3d,
-0xff6dc286, 0x3e13cf8f, 0x093414ea, 0x14cffdb8,
-0x0c8b74ae, 0x08748d24, 0x012278f3, 0x31cf12e0,
-0x73cfd129, 0x736db60e, 0x15297785, 0x2034450e,
-0x0efe030e, 0x0f7cf6f4, 0xfc15fdff, 0x01dfe7eb,
-0x623f3468, 0xc42ba04d, 0x186ee8fd, 0xf8982fc4,
-0x057e074c, 0xf81e07b9, 0x84a5fc52, 0xe8e3d3c3,
-0xc751f2f6, 0xaa071c71, 0xa437d3a5, 0x29f9f799,
-0xd1125fb1, 0xa4c1bbda, 0x8b54273c, 0xd6381048,
-0x77d341b1, 0xa173748f, 0xca12c134, 0xa04323c8,
-0xfe248b54, 0x96b5dbaa, 0xaa4f8db1, 0x460813b8,
-0x5b046ec4, 0x07fe766d, 0x6274a1f3, 0x0616fc78,
-0xe0d1c307, 0x1318bc80, 0xb6225ede, 0x05550618,
-0x0604f07e, 0x41e06174, 0x54c03af7, 0xb4682303,
-0x43c4cb80, 0x1917eb30, 0xec40b703, 0x54e72ba3,
-0xd486d91b, 0x61101980, 0xf8e6f8fc, 0x31770fa1,
-0x6851df03, 0x22a664c3, 0x01831487, 0xdc663804,
-0x397df6ae, 0x43120601, 0x0406146d, 0x1554ed8c,
-0x57171640, 0xd5b8c0a9, 0x55241414, 0x94cd252c,
-0x13dd2c8a, 0x7450182a, 0xa96c019a, 0x4f0ebe22,
-0x438d68d8, 0xf876506c, 0xb801b3d6, 0x217016e0,
-0xc3db0ada, 0x0b39638f, 0xf6810b86, 0x7c3045b6,
-0xb4199175, 0x2ee26b27, 0xb1df7526, 0x3e546856,
-0x5914b80c, 0xee526b60, 0x18ede9c3, 0x7d28b977,
-0x39197a5d, 0x3c6a78c5, 0xc69a50b8, 0x6604fc36,
-0xe8823ca3, 0x9318341b, 0xe22c0452, 0x5b14cdb1,
-0xc7000f5e, 0x9e6315d7, 0x1c02ea69, 0xe71a2971,
-0xbf1c4a24, 0x8cfc360b, 0x06427437, 0x32ff2550,
-0x6834df68, 0x2078e81e, 0x2be818ee, 0x592a1f1e,
-0x665ac442, 0x671fbe5b, 0xdd10e71e, 0xec473ae7,
-0xec112040, 0xc7220b14, 0x0722d9ef, 0x713a0224,
-0x1354cf04, 0xbfa805a0, 0xcdbddb88, 0x4413abc2,
-0x61932c35, 0xc5e8ff23, 0x23113b68, 0x22e9d99d,
-0x3de0f01a, 0xcd04e38e, 0xc7b4ce0a, 0x502bfa6e,
-0xd163e9ac, 0x19500176, 0xddb0b40d, 0x987ee013,
-0xfb2d9136, 0xee12c76a, 0xc7561544, 0x2ec5eb37,
-0xfa72e105, 0x0088e245, 0xb5b6dec9, 0x40b43de2,
-0x0ca3affa, 0x9764aed9, 0x5002efaa, 0xf100f4e0,
-0x6c14ef73, 0x5bc1ace8, 0x7b01ecfe, 0xba0750ee,
-0xfe5de8cc, 0x0e1b7d68, 0xcc45843c, 0x0d028b5b,
-0x71164848, 0x95dbdecc, 0xc1d4b8c2, 0x3d791302,
-0xe118c30e, 0xf1bdd59d, 0x08f6688d, 0x5aa34714,
-0x1ae9154a, 0x1c19e724, 0x6db10744, 0x204e0512,
-0xb2f0602c, 0x84c076c7, 0x200da8e9, 0x206aa0c1,
-0x984d9e10, 0x869a0263, 0x73ede4cd, 0xce04ed87,
-0xc60fd40d, 0x03b1b520, 0xfda7c09d, 0xeb3a4d79,
-0xc07fed04, 0x065d0fe9, 0x578da475, 0xc301492c,
-0x0873752e, 0x6aff101a, 0x2f03426c, 0x105c8dd9,
-0xf29ae732, 0x60c76ecc, 0x98fd61db, 0x16dc87a0,
-0x1b52c261, 0xd009d82f, 0x010e8bb3, 0x8af67360,
-0x2e1cef38, 0x13116c0d, 0x1f073622, 0x96a6ba29,
-0x01780d72, 0x38124c59, 0xbb16e284, 0xdaf07549,
-0x58c6bdeb, 0x7d05820a, 0xb05742b8, 0x1e10691d,
-0x0249d039, 0xc6c0f040, 0xd5192458, 0xef790206,
-0x12205e16, 0x2e472560, 0x69a1e789, 0x36f1b669,
-0xaa3da3a6, 0x528ca541, 0xfe42768e, 0xa6e74805,
-0x704d72d8, 0x85b19c0f, 0x7c0ac919, 0xb9c14188,
-0x9ae9885b, 0x0ec1bef1, 0x59950bc7, 0x8b832115,
-0xb4771aea, 0x4f72537e, 0x416dc50d, 0xce7d8a06,
-0x2038fece, 0x098461dc, 0x6c057363, 0x86d26e08,
-0xe0e8f197, 0x21c00d1a, 0x12107e42, 0xbf1e17c6,
-0x7878b64d, 0xfc18306c, 0x87c49d38, 0x063c36e8,
-0x7fd7e92d, 0xb1a58055, 0x5010da17, 0x26e857c5,
-0x9a1819ee, 0x14afd885, 0xb4e997ab, 0x202520ae,
-0xbd5285c2, 0x1a25522e, 0x809a9c1f, 0x531df08b,
-0x28cc7569, 0x1ffd84fe, 0x63e9018b, 0x6a1c6efd,
-0x35f65e80, 0x10a18a34, 0x0c040fb9, 0xd2c1c245,
-0x428258a3, 0xad74d3ed, 0xd05ba841, 0xeefbae5a,
-0xa3d84f63, 0xd703e535, 0x7e1adb31, 0xaf747df3,
-0xcc22a31a, 0x257d2097, 0x8291a12f, 0x6c21209f,
-0xfbf4fc8b, 0x8c24bce3, 0x8024b42f, 0xa4249c06,
-0xdfffff83, 0x981583c6, 0x1e1e2c8d, 0xd8841a9f,
-0x24d14f06, 0x44740b84, 0x7d3e0abc, 0x1801db04,
-0xd02ce380, 0xd2711a04, 0x9ebe945f, 0x0d020886,
-0xdb90a148, 0x44afc83d, 0x011f28a1, 0x520a9b4a,
-0x816c7d17, 0x511868a5, 0x0c553089, 0xec3e4153,
-0xc140ef61, 0x0131ec09, 0xc9f525c4, 0x47e83988,
-0x8eb7cb1f, 0xf9b16b94, 0xbc9da004, 0x2fc5a874,
-0xea0e8edb, 0x1b88b6f4, 0x0b73ee39, 0x3edd93bd,
-0x0a467786, 0x89b8f572, 0x2854a82d, 0x8e05afc5,
-0x20524c75, 0x2e186a15, 0xbd5744c2, 0x6c34e840,
-0xb8c868b8, 0x2c6c50be, 0x2e0452f4, 0x5c1ebb64,
-0x0141b67e, 0xbab60dbf, 0xf130047b, 0xd178225e,
-0x44de1bdd, 0x687700dd, 0x423a49a8, 0x15fffffe,
-0xd4c362c6, 0xa180d988, 0x27badf7e, 0x6a30a090,
-0x804bac84, 0x75d8313d, 0x56c33042, 0x541a7f02,
-0xe1b61135, 0x0330e5ff, 0x568a2b75, 0x03fa8001,
-0x8d131776, 0x8b9b8346, 0xba68c4fd, 0xee1e37e8,
-0xb3c2851b, 0xff0be027, 0x22e90230, 0xaf5c12c1,
-0x576a580b, 0x156e837b, 0xcaab9b49, 0x75d284f6,
-0xfb351a7f, 0x55bb3608, 0x08c050ac, 0x0801841d,
-0x196465df, 0xb3810e2b, 0xfd308001, 0xa02361db,
-0x961a9789, 0xff6a9275, 0xdfd805c6, 0x7318ee85,
-0x006a1246, 0xfdd0e88e, 0xaa1c05e6, 0x560019b3,
-0xc1f0ccdb, 0x8ee9b656, 0x01c18202, 0xdfb1eadf,
-0x08954e74, 0xeb948f01, 0x5256ed89, 0xad1f6fe8,
-0xa1791d0e, 0xff9ca47a, 0xbd287c22, 0x86cf0ba3,
-0xc735c589, 0x32d84461, 0x891a483d, 0x54d7e0cb,
-0xec04e96c, 0xfbad8a6e, 0x88609d09, 0x108b0e66,
-0x5eb70310, 0x1409c218, 0xfedae78c, 0x48aa5edb,
-0x311a7a86, 0x99ec8ec9, 0x95bfc1da, 0x73d13830,
-0x3200b817, 0xed1839e8, 0xaf1616df, 0x1144dd41,
-0xf980f372, 0x08487405, 0x09b68380, 0x31d14817,
-0x0bad7607, 0xc9148db5, 0xf23db92a, 0x4b4535df,
-0x4cd2c047, 0x3c02416c, 0x63db763c, 0xb002ebb5,
-0x5051a13c, 0x5003c08d, 0x54309ad4, 0xd51c8091,
-0x16e81964, 0x10bf3cd4, 0x510dd503, 0xa8cf4388,
-0xafa3e916, 0xfe1d1f83, 0xc9fef7c8, 0xabd3fd80,
-0x7e803e05, 0xea86a301, 0x9d981e00, 0x008680f0,
-0x9a4f6b62, 0x1b724762, 0x150625c6, 0x1346fe58,
-0x9c3df6e9, 0x285347b6, 0xa39a16a3, 0x3a31493d,
-0xe8476915, 0xaf4b1c27, 0x3b1f24b6, 0x8323db93,
-0xfb3e4e1e, 0x5ae904eb, 0x93143bfc, 0xa4b8e400,
-0xead1a16e, 0xce6f803b, 0x060af009, 0xf80f2479,
-0x31fbd731, 0x46e0dc37, 0x8d7d2771, 0x0180027e,
-0x55c139f8, 0x76c7aa3f, 0x758e5d83, 0x042c241d,
-0x25781f80, 0xbab83034, 0xef6e7408, 0x4b731c77,
-0x7b472843, 0x6f2d40ca, 0x7552385f, 0xb6641b44,
-0x877c5147, 0x175d3b03, 0x5e7cb7c0, 0xfae9a572,
-0x44c0b61e, 0x0f7520dd, 0x570dec09, 0xe871e827,
-0xbbe90d4f, 0xd3e9340f, 0x3dfffffc, 0xc425e80b,
-0x1af9dd36, 0x8842bd15, 0xbe01e998, 0xf8838952,
-0x6181e99c, 0x8db76f64, 0xa2d1f041, 0x2f5c1e21,
-0xadc518c0, 0x74c9ed20, 0x75631326, 0x85813316,
-0x0ed03115, 0x2a5ff899, 0xf8b41176, 0x1ba81d3c,
-0x2c3baf1b, 0x04290674, 0x036ff77c, 0x75022a7f,
-0x1a38a1f4, 0x75044339, 0x1456c3ea, 0x0fab816e,
-0xb000f269, 0xc3edc549, 0x3e47f7ec, 0x2e1a73f1,
-0x81a0b96d, 0xb49fc558, 0xe3260756, 0x1a599819,
-0x7d7ff511, 0x9d16ba82, 0xbfac1422, 0xa0c3636e,
-0xc03104de, 0x1a7a06b9, 0x85db6874, 0x4053783c,
-0xaa7076d2, 0x48570990, 0xd9a2fa3b, 0xf0a3e44b,
-0xc108afbe, 0x945bddc4, 0xba7f6b48, 0x107e21ff,
-0x55a83a3d, 0xba6630fb, 0x00c58ef7, 0xa5805829,
-0x5306c0bc, 0x118ab587, 0xa1573fda, 0x85e2acb6,
-0xf9b14800, 0xf01ddfe8, 0x13fd2ac4, 0xc1011a87,
-0xf8f602ef, 0xea848f44, 0xba0f49ec, 0x43aa8570,
-0x6e72685a, 0x2b6c388c, 0x44671396, 0x4e275718,
-0x244a66b8, 0x09210547, 0x0656558f, 0x27194be8,
-0xd385df0f, 0xe91a996e, 0xa314f2eb, 0xcf82f57e,
-0x047316ba, 0x52f5d7f3, 0x056c4359, 0x5660d02b,
-0xbba0c5ed, 0x57b1386e, 0x81d7c25c, 0x680078ec,
-0xe06dba9c, 0x1608d403, 0x0492a8ac, 0xe16e20a2,
-0xa1fa1f7c, 0x1e210aa4, 0x47803408, 0x22a2d8cf,
-0x3723a616, 0x2d7eedca, 0x24a21ab6, 0x4740b90c,
-0xeb95dba7, 0xc279ef82, 0x3d04013c, 0xf8184d0c,
-0x96e8063e, 0x51d02ab6, 0xd1ed91f3, 0x6e010c96,
-0x7818ff10, 0x1554c107, 0x18050385, 0x03958378,
-0x0fa3f7d3, 0x0261b669, 0x2d2f2295, 0x0d0c9ae6,
-0x73ce8d06, 0x3232182b, 0x5416c1f2, 0x3887e068,
-0x4dfbf201, 0x800f1037, 0x680d6a52, 0xe917931c,
-0xcd006017, 0xff8dc632, 0xf4e010dc, 0xe814bec7,
-0x713df15c, 0xed9b70e9, 0x89ba2e1c, 0x284b5ff7,
-0x31cba13b, 0x8f50fe9c, 0x7d581f9a, 0x242cfbfb,
-0x436afb68, 0xe8ffb66a, 0xcafaf2dc, 0x7ea26bbd,
-0x246a28ff, 0x6a561ce8, 0xc91bd175, 0xb58ee8c7,
-0x6c4838f2, 0x687f04f8, 0x5728eb00, 0x0c4ece0c,
-0xc4ddee51, 0x09cf587b, 0x1adc8ca1, 0xd8225ee8,
-0x892fde0d, 0x2dc729df, 0xd615d47f, 0x638455ab,
-0x5a7f0424, 0x85ee8484, 0x13570c03, 0x6384e32b,
-0xfa2b1cf1, 0x71611d16, 0x420760d6, 0x0416e31d,
-0x9192643a, 0xcc3d162e, 0x64109bf0, 0x43b543e4,
-0x66c27316, 0x319e99a4, 0x409a4cdb, 0xebff8b38,
-0x13fb8309, 0xf9858f0f, 0x0c581455, 0x02c7e118,
-0xf69f5f18, 0x010ec612, 0x0750f5f0, 0x4a11ed49,
-0x43c2767c, 0x05e5b108, 0x2426a875, 0xde3f65b6,
-0xf939f685, 0x4ae4bd81, 0x7548423c, 0x6c348143,
-0x025d0f82, 0x38ec3d8c, 0x16b70513, 0x970a6d45,
-0x20641d8e, 0x4ced9df3, 0x9a941d1a, 0xbb08ece7,
-0x5d1ab323, 0x3b703102, 0x5d008316, 0xffe53374,
-0x27536fb3, 0x838d993e, 0x00831f1b, 0xb6050807,
-0x2e7768df, 0x470412d3, 0xd78ed23c, 0xc36cbfad,
-0xcf483944, 0x42c8daa1, 0x50ba8110, 0x77024c03,
-0xc64784fb, 0x155abd51, 0xa068495a, 0xbc0dc22f,
-0x41575a92, 0xad86a7a3, 0x03841af0, 0xbe681535,
-0x03418df0, 0x02756dd2, 0x0267682e, 0x6899fa78,
-0x7342c5bc, 0x0d3411ae, 0x0e6aa3eb, 0x8158f796,
-0xa91f30c1, 0x78048368, 0xff3bf840, 0x28e82835,
-0x6ce89ef0, 0xf24c21ee, 0xebb49448, 0x307b6a8a,
-0xd0533642, 0x1482e8d9, 0x303d82d7, 0x0068453e,
-0xc9146b77, 0xc1c8c23b, 0xfffe3cbc, 0xbddc68de,
-0xfd848d67, 0x00001184, 0xe81e3fa7, 0xd81e48e4,
-0xc7a4ef83, 0xedaa0fed, 0xe9a2be88, 0xb21f69e2,
-0xf809a804, 0x39ba09bb, 0xf738e38e, 0x01029be2,
-0xc211eeb7, 0x20e7e944, 0xc0310090, 0x182144d1,
-0x3867f292, 0x3aa9044b, 0xd1d2ccca, 0x548c04f1,
-0xf6fb040f, 0x1d102d02, 0x132703a3, 0x7f16aaa9,
-0xd3518be1, 0x5c418bf2, 0x2ce50e77, 0x771806e8,
-0xc1ad8665, 0x451d51de, 0x8b150c7f, 0x80835457,
-0x0c8dfc5b, 0xd5891c76, 0xf78dd889, 0x51a96df5,
-0x07df57db, 0x1119cf32, 0xba69ba97, 0x446c277c,
-0x9f396868, 0xfdd86478, 0x7877c442, 0x7277df03,
-0x4213548b, 0x5008b758, 0x68e28a21, 0x316b5e72,
-0x1977b788, 0xa35876d8, 0x9788d44d, 0x6110ae80,
-0x4703e41c, 0x6ac1536c, 0xfe10786b, 0x2ce2d913,
-0xc77bdb15, 0x22ff5378, 0x04ac3860, 0x44f43c14,
-0x33906c38, 0x608207fc, 0xc3299b90, 0x4ae9d619,
-0x00db6f60, 0x04e1a37c, 0x77034651, 0x20c0336c,
-0x4e481197, 0x46528879, 0x79f858fc, 0x7b5650ad,
-0x0fe0f281, 0x3109e0c5, 0x89da486c, 0x751721c7,
-0xed31879b, 0xbd3bd62e, 0x7860d168, 0xe200aa8d,
-0xeb0e2034, 0xe86d16c6, 0x1f75d829, 0xecd65c07,
-0x07b7a0bb, 0xd875c289, 0xf7de75eb, 0x20a11889,
-0x3f505420, 0x18954bee, 0x0341ed50, 0x104c40ff,
-0x6e2b187c, 0x30c12a36, 0x1c42928b, 0x0038005f,
-0x8948dcde, 0x82277842, 0x4257001b, 0x41db6774,
-0x688b6774, 0x68b57c3e, 0x7360b19b, 0xa22ee4c0,
-0x0aa77838, 0x3642856d, 0x84358fe0, 0x40dc2076,
-0x3f45038b, 0x86eebb71, 0x4cf3a753, 0x4819db31,
-0x6f394c31, 0xd3c7ff86, 0x06720fb9, 0xc1396f77,
-0x441a6b77, 0xabb87451, 0xa7403609, 0xd17ee281,
-0xaafa5ac7, 0x4428d06e, 0x18131ca9, 0xc41d6c70,
-0xb32c2655, 0xec3ecf78, 0x66602558, 0xc3f6ae9c,
-0xb59d4b74, 0xfebddf6b, 0x2b514674, 0x86502826,
-0x9dc2a74c, 0x5a582bdd, 0x2c8f0c53, 0xee1bec78,
-0x8b5c46fe, 0xc8296056, 0xda194876, 0xc8014c56,
-0xd7a5da11, 0xe93e0f04, 0x36b3ff6e, 0x47588250,
-0x525470fc, 0x40ba4a50, 0x6efdd0c7, 0x280fc7bd,
-0xcd880f0c, 0xb717c3a6, 0x849ff1e0, 0xb18d71dd,
-0x203dfbec, 0xba50415e, 0x3a3db8d4, 0x28712360,
-0x4124b3fe, 0x3e4d8f84, 0x686e831c, 0x0dda53b3,
-0xe20e1da0, 0xbd392ba3, 0x0a025120, 0xbb36c1b1,
-0xd5781639, 0x02964ca0, 0xda8aa7e8, 0xfca5287b,
-0xdd6e5a83, 0x9b6a9d05, 0xd374a3e9, 0x9e9ace01,
-0x11625fa7, 0x0afa53df, 0x0a3df007, 0x29f137db,
-0xdad719c6, 0x4655cf01, 0xd29c1702, 0xbddc8b50,
-0x2fc217be, 0x41a279c9, 0x6c93100a, 0x2a41614e,
-0xfd4bdce0, 0x4041b458, 0x2c5b284b, 0x44f59ac4,
-0x961bd8f7, 0x300040c5, 0x55165763, 0xd76274bf,
-0x31de98b0, 0x7c887ff8, 0xdcaf8946, 0x855d202c,
-0x7bb1bec0, 0x94c60222, 0x50047a83, 0x0fb1c03d,
-0x25502823, 0x309cdd02, 0x46ddc8ee, 0x3c2d02ae,
-0x1b84bd2b, 0x76e80206, 0x072d3cdb, 0x3a800d89,
-0xa4c5ac3e, 0x7b8de78b, 0x41387c74, 0x0f200aec,
-0x3f6b0740, 0x5202c3b8, 0x89980954, 0x9b18502d,
-0x49a97c55, 0x36bab62d, 0x296bc043, 0x5c7c20a3,
-0xfc5330c0, 0x3a1da3be, 0x2715d772, 0xfbb7e203,
-0x05b83589, 0xc232b4a3, 0xed83adfc, 0x57be26f8,
-0x57206142, 0x4efc52c3, 0x41e8e11a, 0x481834dc,
-0x5484ab20, 0x19ad8ff6, 0x12c5987e, 0x00000bc7,
-0xf43c2141, 0x844a1c60, 0x9061e423, 0x7d0e91ea,
-0x8e061a42, 0xe7272470, 0xe54802db, 0x1d8376fe,
-0x71e952a4, 0xeb66e3db, 0xe82cd197, 0x8df909f9,
-0x108631b8, 0x842b66d0, 0x0ad871e3, 0xdb241e5a,
-0xdd1074dc, 0x7a80890d, 0xbefe4e1b, 0xaef17df7,
-0x72071111, 0x41d1e915, 0x87dfbb7c, 0x2b7838dd,
-0xfb813b43, 0x118779fe, 0x66c3f634, 0x07eeb7f4,
-0x2ba4df75, 0x57530eab, 0x5223d9e8, 0x8986bb18,
-0xb910cd8a, 0xe055ec24, 0x8d34f05f, 0xfdf8fd46,
-0xaddcb877, 0x1d56fa23, 0x10edc124, 0xba040899,
-0xec110a8d, 0x8d2b087b, 0x7954da0b, 0x18ba2d44,
-0xa805c1b7, 0xfa68bf15, 0xb678a030, 0x042c0c13,
-0x230a2706, 0x177384ed, 0x345c02a0, 0x051acf01,
-0xe9722468, 0x7f62cf04, 0x4274d2c4, 0x35731440,
-0xdf64ece0, 0x08e9c16e, 0x73280beb, 0xee753f21,
-0x8758235d, 0x3943dbed, 0x1ee175d5, 0x02b06105,
-0x21df4998, 0x1e2f014b, 0x5a303f4d, 0xe2980bba,
-0x2d428819, 0x066602c3, 0x7ba91d0a, 0x04428ddc,
-0x45060727, 0xf6dc306a, 0xc7c5d91a, 0xc9693023,
-0xee93c40a, 0x42b21758, 0x146ae814, 0x61d5a71f,
-0x643c9a01, 0xfb52be05, 0x24d6f04d, 0xeb0c2418,
-0x24fe8608, 0x56552e7f, 0xe089ff29, 0x45287da4,
-0x74fce283, 0xe1cda8e1, 0x7401ee4e, 0x268622dd,
-0xb0383579, 0x1050f0d0, 0x174fd27e, 0xd4873d42,
-0x612ddd02, 0x1a045019, 0x43424d55, 0x8a47236c,
-0xdd6a172c, 0x688446f5, 0xc418c30b, 0xdb5b547c,
-0xf758d488, 0x3bdbbc1a, 0xedafd76b, 0xd0b5e9fd,
-0x58456110, 0xb708ad0a, 0x1a700319, 0x1adf2ddd,
-0x0f0d837b, 0xf6e8def8, 0x5d544721, 0x74a68a7b,
-0x6dc6f842, 0xbc571903, 0xfb008af1, 0xbee9474f,
-0x468295b4, 0x18e44241, 0x52a3601a, 0x805b56db,
-0x7457c272, 0x410adfdf, 0x4c0e0c39, 0xc3ca44f7,
-0xe7ab7516, 0x44aece04, 0xb7b6d0d9, 0xce443970,
-0xd277e08d, 0xb1ae3c1c, 0xc8da76f0, 0x0816ae04,
-0xc8b62fd8, 0x3e39886d, 0xfd093b84, 0x6dec3e14,
-0x2fb5630d, 0xeb042f54, 0x4b090ed2, 0x3c15a7e1,
-0x01214705, 0x704901f0, 0x5e094053, 0xae06f58c,
-0xf9a6145e, 0x4329114a, 0x1b55de95, 0xca6f140e,
-0xd0398605, 0x4d9b1874, 0x26368b98, 0x8a4350ac,
-0x05ad901c, 0x20dd0d18, 0x6e08441a, 0x761f052d,
-0xd88273b8, 0xf821c264, 0x87178b1a, 0x6a8d3627,
-0xf9ac0849, 0x5350b05a, 0x824629b8, 0xc2e8a564,
-0xf6f48bee, 0x891af4c2, 0x6730a6a3, 0x1dd1fca6,
-0x034421dc, 0x3124a8d0, 0x013f0643, 0x075b1d7f,
-0xdaebf023, 0x04538d76, 0xb01905cb, 0x1a334e52,
-0x6717c15c, 0x2d560baf, 0x4614d0ac, 0x18b002f5,
-0x2de86100, 0x34d6f907, 0x9da40d97, 0xc756745c,
-0x0326ad60, 0x321419e4, 0x0c709361, 0xb72c0c17,
-0x68784aee, 0xf62d5634, 0x45e35463, 0x9913df6c,
-0xa341bee1, 0x980d9768, 0xc35ed021, 0xce40d082,
-0x0642f012, 0x62ebc0cc, 0x503b970a, 0x3145fcd6,
-0x1018f281, 0xeae60875, 0x2d7e0182, 0x05299c09,
-0x340326d7, 0x7e3c190c, 0x7f8026d2, 0x858b84e0,
-0x346a5508, 0xc064c77d, 0x083c0a29, 0x2fbe3f3c,
-0xdaad011d, 0x235b7623, 0xd80e88fa, 0x57137452,
-0xdb2e50e9, 0xdb70091e, 0xef3c0743, 0xec0f1d31,
-0x247bfb01, 0x08693e74, 0x4e2a5540, 0x042bafe8,
-0xc6d2b6cf, 0x775f0828, 0x2cc408a9, 0x338a2709,
-0xb1001ea6, 0xac8bee3d, 0x53d78e02, 0x84c39dbb,
-0xf89682c7, 0x731a1e6a, 0xc7596d67, 0x6c54e885,
-0x5fc38337, 0x57021d10, 0xe272e325, 0xdc85526a,
-0x689abfab, 0x29ff8c0e, 0x1eda1434, 0xff921481,
-0x4fa35e8d, 0xa0155c3f, 0x1574915b, 0xc1171a43,
-0xc2e99637, 0x46c7131f, 0xa0fae70c, 0x1113c09d,
-0x73651ac7, 0x5c0bbbb0, 0x3810466c, 0x483e3874,
-0x041bcf75, 0x729f1885, 0x405b5ae4, 0x16d8b3aa,
-0x4663f87b, 0xdb4d2224, 0x97076178, 0x05f0147e,
-0x135646ff, 0xbee100bb, 0x912172e5, 0xe0092fb0,
-0x023abe8d, 0xcb8b5859, 0x21560c70, 0x070563a1,
-0xea701775, 0x41eaa8d5, 0x37501734, 0x4112da62,
-0x527ec76b, 0xc26a892b, 0x76d688a5, 0x18bbd40d,
-0xe7922e1b, 0x18045015, 0x21636e26, 0x042689fc,
-0xc9ab1c1b, 0x0b2dd54a, 0x8f20071c, 0x7d8ce262,
-0xdf06d6d1, 0xce784d20, 0xc3023e03, 0x6601bcce,
-0x67048c3f, 0x09eb98db, 0x060c7e06, 0xcbe40884,
-0x44ae6d97, 0x5340e0ce, 0xea0e3fdf, 0xeb0a2724,
-0x49735694, 0x76ffd5b8, 0x371df7ae, 0x12422e33,
-0x7577160e, 0x68076988, 0x200326c1, 0x508b0623,
-0x439d139a, 0x4e4b8a43, 0xe91c669d, 0xa74a4b30,
-0x28137705, 0xe8510e84, 0xa84d5b04, 0xa3f35259,
-0xe0dff18a, 0xee8416d4, 0x1b74c784, 0x7425fa80,
-0xc006bb2f, 0xffed9914, 0x6b178829, 0x47df83c7,
-0xe5752046, 0xc60339a7, 0x06d13a43, 0xa0282540,
-0xb170ab1b, 0xf6a91ff6, 0x58a3583d, 0x0b432e61,
-0x62d815bc, 0x85731c01, 0x41bd2308, 0x30f5e800,
-0x11bcb94e, 0x19b9edcf, 0x086c0112, 0xdb6800b8,
-0x010af5be, 0x20c8f477, 0xb20c783c, 0x6465cf15,
-0xfa08641b, 0x2101bd40, 0x2c8cba47, 0x017763f9,
-0xe88830da, 0x3c43542f, 0x3930b345, 0x45830feb,
-0x0462b800, 0xb3f2280e, 0xa6dffa8f, 0x0788038a,
-0xe4eb4743, 0x83dd848b, 0xda26d806, 0x18188106,
-0x2e16843c, 0x0dccc0f0, 0x902c4f46, 0x6c576ebe,
-0x4ee81e6f, 0x30461dd3, 0x8608fef0, 0xda6b954c,
-0xe64d87a7, 0xc60a0a96, 0xb112042f, 0x1ef64602,
-0x64494e85, 0x65a00fa8, 0xaff9eb35, 0xec1b8225,
-0x84ebc980, 0x4149d3d8, 0x0ff1dffc, 0x3839808a,
-0x4588d009, 0xe9834500, 0x76e87904, 0xe5ee0e84,
-0xdef52750, 0x440850fe, 0xedf256a8, 0xab400dbf,
-0xeb89bfd2, 0x4ab9990d, 0x0abb176e, 0x38f9f71e,
-0xe6038a1c, 0x1605db00, 0x67f25514, 0x5ff70066,
-0x1e0c3a30, 0x2e0c8904, 0x6f5536c1, 0x0502fac0,
-0x02c22945, 0x6c37be75, 0xbd478d4b, 0x2a0aef0b,
-0xb60b8802, 0x4aff7343, 0x77da3943, 0x7dace9f1,
-0x58df5edb, 0x0a351d6b, 0x5430649b, 0x2d8b2604,
-0x37e9317b, 0x459b1ee8, 0xee231406, 0x73e9301e,
-0x63b03069, 0x0e3f85c1, 0x8fe995d2, 0xa980c1cb,
-0xc86a2c86, 0x1a0d86ba, 0x1e76d878, 0x4ab10341,
-0xedd67f16, 0x39e855e2, 0x3ac50169, 0xe2771d43,
-0xd419e94d, 0x44600ab7, 0x390653ff, 0xae91d9d3,
-0xde73aafd, 0x4e3f7351, 0xda79fcf9, 0x43b60e5a,
-0x3dbf503b, 0x776bfbdb, 0x45af3d86, 0xcdf45cf7,
-0xaabfe92d, 0x0e5c83b1, 0xb7d16303, 0x9c1314fd,
-0x4e450470, 0x16acf17b, 0x1ec5a12a, 0x50d890c3,
-0x1858018d, 0x52db85ba, 0xb808cfe1, 0x8a307414,
-0x6d32b907, 0x84d2d2f1, 0x74342628, 0x1b5f3822,
-0x0ba5e26f, 0x36c188d2, 0xe720488d, 0xd188c888,
-0x776fd10a, 0x38204a0b, 0x0375ca08, 0xe817754b,
-0x430d6d05, 0x7a15d202, 0x5eba27e1, 0xcb891508,
-0x4201808a, 0x88244541, 0x81f62ead, 0x4f09f452,
-0x89b94c1b, 0x8bb64ade, 0x74c2b7ba, 0x41034ea6,
-0x66f02343, 0x9d34d577, 0xd34c543d, 0x4204eb94,
-0x76eec06c, 0x24fa7505, 0x48424102, 0x43f6ce4c,
-0xc93746c1, 0x1b74d63f, 0x2cdfa52c, 0x74430307,
-0xf3754906, 0x5dda34c6, 0x955760b0, 0x1a2ac34a,
-0x15f4161e, 0xf0993a02, 0x0efdc2d3, 0x20da51b5,
-0xa8ef05eb, 0x025ed8a9, 0xd738108a, 0xa05728f5,
-0xa92db300, 0xbac1b05c, 0xa01ff144, 0xf7aef2df,
-0x38d849d1, 0x836d1510, 0x3b4827da, 0xab9d19f7,
-0xb8ab1cf8, 0x89d6384a, 0xe9501bbe, 0x111174c8,
-0xe4404a17, 0xdf868a05, 0xf4758002, 0x6ec3c829,
-0x6ed03a56, 0x31a2ba06, 0x60cf7cff, 0x752169a8,
-0x8e03f116, 0x2f6c3510, 0x74f18974, 0x106e161a,
-0xabb58d7f, 0x5bf5ae38, 0x74bbc39d, 0xcd3843f3,
-0x47356dde, 0xe9ebd5b1, 0x64f39556, 0xaf46c2e4,
-0x140d4323, 0x1bf02744, 0xe3752643, 0x30a35a73,
-0x8981384c, 0xbbaa79f0, 0x8130a025, 0xc301d864,
-0xba82ff59, 0x74584c17, 0x169b0f3c, 0x09745a5e,
-0x74117ea9, 0xa3e574b9, 0x552fa7f4, 0x8b3d58ef,
-0xdb540a1d, 0xbf7ef174, 0x282b7597, 0x64c4753b,
-0x001f05c7, 0x410b6200, 0x1ef21280, 0xb6c7672c,
-0x2f10bb0f, 0x595a5b3f, 0x447e8956, 0x5306b178,
-0xeba4f690, 0x8f0a9e06, 0x4301c21b, 0xe2362041,
-0x462c9d5b, 0x203520ca, 0x61855b08, 0xa46a986c,
-0x8265f685, 0x1b6d742b, 0x13020192, 0x4eecd018,
-0x7b170c61, 0x69ef754e, 0xb10c371a, 0xf6c2b636,
-0x02210b74, 0x2c428cc4, 0x06209ff5, 0x318e27d1,
-0xd0885c8b, 0x4e4e7854, 0x60f21815, 0xf502dfb4,
-0x74da89cd, 0xa8031227, 0x89fc4edb, 0x5514ebce,
-0x307ed490, 0x7ade944e, 0x71951761, 0x4fe87dee,
-0x008360b1, 0x7808daf9, 0xefbdbf4b, 0x58f98349,
-0x8d9fb30c, 0x428aff50, 0xa39e3821, 0x0a7e6df8,
-0xc2f27518, 0x1158c484, 0xb8b2f30f, 0x53803e36,
-0xf27753d0, 0x654b110d, 0x10b84080, 0x48822fa2,
-0x42d07989, 0xc81b8206, 0xfddf3d80, 0x8a5f88c3,
-0xe03d83f7, 0x01c84c08, 0x2a92b4a3, 0xe34500fe,
-0xffd2088b, 0x63b23dff, 0xb25c37c3, 0x05c74601,
-0xea07b21d, 0x82c79032, 0x88f10977, 0xaa004182,
-0x1aee2812, 0x12e84f54, 0x4b245bd2, 0x297c4456,
-0x788ac455, 0x45fa7ca8, 0xfe5d7064, 0x7c167457,
-0x3f0b608b, 0x1176c42c, 0xd8e013e8, 0x2138368a,
-0x07111dc3, 0xdb042f7b, 0x1085e89e, 0xab41e8ac,
-0xe56f170a, 0xe6eb7e88, 0xdbaa91e8, 0xc8eb010a,
-0x105820b7, 0x016a6cce, 0x447f0108, 0x92c4bf6f,
-0x556d4149, 0x0f75fb3c, 0x60126a0a, 0xb0a79e0a,
-0xdd63e401, 0xc2c287f0, 0xc1661639, 0xc5c508ea,
-0x15464075, 0xe89b51ac, 0x888c9c91, 0xf9b592d9,
-0xd8dee889, 0x909b5822, 0x1a53681b, 0x155e8c88,
-0xf860972d, 0xbeefbfa2, 0x35de1538, 0x0538b875,
-0xebb007dd, 0x5d4108df, 0x0693e630, 0x6f157bb1,
-0x360c753b, 0x0ba28c03, 0xa7d14921, 0x14c03100,
-0x056db047, 0x2dfed8b6, 0x112daa5b, 0x7c89902c,
-0x6361ec21, 0x741c5fd7, 0x6d853ee3, 0x6c3db081,
-0xb06c0f4f, 0x4a6dc548, 0x6832cffa, 0x2f254843,
-0x69f6fdd4, 0x7c99b648, 0xef30a36b, 0xf006b707,
-0x47b70f03, 0x5706f50a, 0x68a0c608, 0x2957f850,
-0x2a961774, 0x74bf7973, 0x056c2b12, 0x03446122,
-0xeffedf68, 0x02512b76, 0x10348d32, 0x7f80de29,
-0xf5890103, 0x34ba0911, 0x74980088, 0x4e10a91d,
-0xc04c2806, 0xda1fa4d6, 0xaa386ac8, 0x7e13691b,
-0xd1c51638, 0x29817d30, 0x8035b8a9, 0x97604831,
-0x553a4762, 0xcec25e51, 0x07bb43ed, 0xb83407c6,
-0xdeeb1f06, 0x4e8dc43e, 0xe71c73c4, 0x9b83f289,
-0x6ea94b88, 0x0ee9890e, 0x308187eb, 0x003416e9,
-0x4f5c4103, 0xb2e10250, 0x02ff21fc, 0x102d3ec3,
-0xf8e2fcde, 0x8d0124fa, 0x3a0a8430, 0xae400344,
-0x62b125b0, 0x01c8894f, 0x2908a1bc, 0x2d9b9578,
-0x0b0c1995, 0x06e82f41, 0x87dc37b1, 0xa23d0843,
-0x0a857336, 0x8f85895c, 0x5b1b2e59, 0x0c894dde,
-0xdd391c13, 0xa1b4f876, 0x008b86f8, 0x3a2c461c,
-0xc206c82e, 0x01304063, 0x71a4ec00, 0x0e5916c0,
-0x58fb8cc2, 0xef9038ca, 0x4982cd77, 0x57205d78,
-0x092ca142, 0xff787adb, 0x1f69fd15, 0xedb6b702,
-0x260f705d, 0xdde3c8a1, 0x56ca0903, 0x054f5e2b,
-0x482fa1a1, 0xd8c28558, 0x37880a07, 0x52ba424c,
-0xdd5487bf, 0x3d08e21c, 0x78aa0b2a, 0x0942dae8,
-0x0d140a76, 0xf142eeb6, 0x9beb3b72, 0x030a0358,
-0x011ba6bd, 0x08030728, 0xbe222409, 0xbba602a2,
-0x9e439157, 0x85bce01d, 0x54770bfa, 0xbbfb12b4,
-0x54680809, 0xa2138037, 0xdaa7418c, 0x2c547b8d,
-0x3f1ab7c0, 0x98968012, 0x50e01683, 0x976f882d,
-0x22f44620, 0xd8d70466, 0x04143aab, 0xe30ae3a0,
-0xa503f060, 0x76164774, 0x1180bb3e, 0x0c4f5a19,
-0x045b7543, 0x0ea069a0, 0x35d70f03, 0x752bbc05,
-0x4908257e, 0x8b1c0216, 0x03e13819, 0xef596f6c,
-0x3c50a408, 0xf0eb1f83, 0x5add7548, 0x8c18cb6d,
-0x22d587b1, 0x1f024e01, 0x59dc8859, 0xa752c5b1,
-0xb0f67b25, 0x313b0e41, 0xeb653a75, 0x046324d0,
-0x18223b0f, 0xeae6ca74, 0x05bb0582, 0x76247652,
-0x5e33b38f, 0x26c1b2d0, 0x36303150, 0xb7ebde8a,
-0xf204151e, 0x5877b533, 0xd9dd0608, 0x8d041073,
-0xff19c230, 0x20b10513, 0x59fec171, 0x0f12f752,
-0x41080d91, 0xbc160c86, 0xe78a8f0a, 0x885508eb,
-0xfb8d5488, 0xffbe1d13, 0x7f547423, 0x08003d45,
-0x0b7c4420, 0x8d2ff087, 0xf717e856, 0xe9589518,
-0x047384b0, 0xde131f85, 0x9e305f8a, 0xe0ca9636,
-0xbbcce9d6, 0xa7265fbb, 0x24bb7598, 0x05b9eb03,
-0xc607eb02, 0x79b38301, 0x04e3f85e, 0x02018fba,
-0x2e305575, 0xc9a4183c, 0x2e2f181a, 0xa024120d,
-0x57c6d746, 0x48136e8b, 0x77001156, 0xcc0844eb,
-0x9be08a83, 0xb87da237, 0x66260d0c, 0x75088f20,
-0xa28462b1, 0xdc02b444, 0xeb6c3991, 0xd7575018,
-0x154254d1, 0x43be00ec, 0x053ba9eb, 0x57b074eb,
-0x1291efc5, 0xeb18a302, 0x3da00597, 0x7041b2e4,
-0x4c6dbe74, 0xac5d8a00, 0x0e718966, 0x3f54d63d,
-0x7854666b, 0x8912184f, 0x0c3e9490, 0x1c600636,
-0xffb4980e, 0x50761174, 0x05a50fc1, 0xd6d6c79c,
-0xf58ad606, 0x5f8aea2e, 0x89003b20, 0x1bf72107,
-0x5ea02d24, 0xf32ca6c8, 0xf601b0f6, 0x2b7427b0,
-0xa6ba811c, 0x68d71f74, 0x08786d87, 0xd0979e50,
-0x752e3833, 0x1c4fbc55, 0x9c828dca, 0xd9c582af,
-0xe4c7e8af, 0x0c099882, 0x47087ecd, 0x90825113,
-0x4c2a0000, 0xbadf6206, 0x5e0e6ca3, 0x06539cdd,
-0x4b12cde3, 0x41bb8556, 0xed515216, 0x96c0e1d0,
-0xeef4f20a, 0x2778fc18, 0x53561d00, 0xfb509a9d,
-0x200f56f7, 0xb28b2eb0, 0x3e048d7a, 0xd518793b,
-0x7315100f, 0x8dc65128, 0x04ed9366, 0x3b504a33,
-0x250068bb, 0xe3632d7a, 0xa8dababc, 0xc8d1c132,
-0x621f5853, 0xd7498e50, 0x392cadf5, 0x5bbb0a1a,
-0x4551e355, 0xf1158f23, 0xfb53025e, 0x2fba88b0,
-0x868b5873, 0x8b5a1486, 0x422c7843, 0x968becc1,
-0x1841f482, 0xffd20984, 0xae8c0894, 0xf968c01a,
-0x2bd3e751, 0x3ba658b5, 0x08016a0e, 0xc522126d,
-0x9e5bde08, 0x6058cbe3, 0x04f53df0, 0xde82cd5b,
-0x756a00b2, 0x69906d50, 0x911e7c80, 0xa46b38d2,
-0xc7197f87, 0x01fd0026, 0x90163236, 0x898b3ca0,
-0x421d8123, 0xf4a06e28, 0x1fd8479c, 0x05748d29,
-0x013960a3, 0x42446639, 0x19f7205a, 0x2559201a,
-0x78bc8b07, 0x3b016ad7, 0x3b0b5afb, 0x516a1047,
-0x98138b04, 0xda8065aa, 0x12bed6b9, 0x256a6f4b,
-0x39f62ed2, 0x87e275d0, 0xeb342a0c, 0x018b3017,
-0x077062de, 0x8ddec7b6, 0x1018f870, 0xaf0a2b41,
-0x960f1c77, 0x73f0390e, 0x8e8e7e4e, 0x533cd66e,
-0x10ab1214, 0xa178c3a7, 0x51498568, 0x4da35208,
-0xf7d45d15, 0x377367f1, 0xb11207be, 0xff302c08,
-0xc8aa13f3, 0x0711d961, 0xec5aa961, 0xded08908,
-0x8f6aec0d, 0x707608b0, 0xab3276f4, 0x8ec1bbc8,
-0xd993558d, 0x2dd230fe, 0x460a811a, 0x517c1d6e,
-0x6789ee92, 0xba2b6014, 0x779e8905, 0xd3bf01b0,
-0x6d150a5f, 0xe7d18940, 0xbf005d2b, 0x0e0ebb2d,
-0x698d0c77, 0x61819d1c, 0xfd83fdd4, 0x7ec68973,
-0x7e063219, 0x7a3e8e74, 0xce1215bb, 0x6857f365,
-0x97e9d837, 0x83738bef, 0x7286a2c0, 0xf0ff396c,
-0xba5501fb, 0x8a11512d, 0x3e8b7791, 0x343803cc,
-0x4eed1e23, 0x551fa310, 0x74c0316e, 0x01e92d11,
-0x51bb6410, 0xefb4a264, 0xbfa724d7, 0x3d3b6909,
-0x960075db, 0x11ed0059, 0xfb59910f, 0x0ef02a7c,
-0x8ba08476, 0xf6f234cb, 0xd03e9e8d, 0xa8f53d3c,
-0xc6fe5e07, 0xa362ec86, 0x470212fa, 0xc606a501,
-0xc8934408, 0xa3057055, 0x80cd62da, 0xc8f2313a,
-0xa1100783, 0x74a1146a, 0x1e046018, 0xac86ab12,
-0x58ac0c7d, 0x0cc6afb7, 0x08002c4d, 0x2391dc04,
-0xeffc1c5b, 0x660068ef, 0x2876e798, 0x017c18b0,
-0x5122a8d6, 0x9c08041d, 0x5fb7505e, 0x04ec0a44,
-0x57113f74, 0xa6525806, 0xd2c6a680, 0xaff1cbd0,
-0x816184fb, 0xb941ecfa, 0x89027304, 0xadd497d1,
-0x9342bf14, 0x415bbaef, 0x5e81de3b, 0x75e23ef4,
-0x1b5056bc, 0xa764a758, 0x388a7736, 0x22c9da89,
-0x1603046d, 0xeb49dd18, 0x875eacc6, 0xa9866023,
-0xf10be4a4, 0x254054ac, 0x6d8fe840, 0xe1bbb7e8,
-0x76a433d8, 0xe831b7e8, 0xc911bd76, 0x9afb049d,
-0x8fcf66cd, 0xbed6a56f, 0x2a080965, 0xba2841d3,
-0x4ec00fe8, 0x0146d329, 0xdcb836dc, 0xc0d029b0,
-0x2f589865, 0xd42763a1, 0xf0741ef0, 0x883236c8,
-0x9111ff16, 0x9c022ce0, 0xd85bdd10, 0x60c0c581,
-0x291416c8, 0x3ac0c149, 0x86f43f14, 0xf6a1629b,
-0x840f3a12, 0xf4570b0b, 0x417fdb6c, 0xd70a080e,
-0xd48b6d78, 0xafa0d01d, 0x5201368f, 0xe0ab160e,
-0x0f3f036e, 0x4ddef58e, 0xa1bb3552, 0xd3e852f3,
-0x56be80b9, 0xf8562dc1, 0x7a406430, 0xd96c645d,
-0x4072200a, 0x469c6553, 0xa0151f63, 0x3b150ede,
-0xd84c4db6, 0xb003495c, 0x0d18b4eb, 0xdb103b65,
-0x5b361727, 0xb6fd0a0e, 0x3678b191, 0x100e0bcb,
-0x040cf8c6, 0x3fb2138a, 0xf3f2d21c, 0xdb73191b,
-0x42d0711b, 0xdf0e32ab, 0x0f6c646d, 0x0e339942,
-0x700802ba, 0x6e40f30a, 0x6b00d942, 0xd839acfc,
-0x8912810c, 0xb6551bf3, 0x0f6db191, 0x30464b37,
-0x8c600e10, 0x46c65a45, 0x304d9211, 0x936efb49,
-0x050e5ad0, 0x3301f324, 0x1ecb89d6, 0x84e611bb,
-0x75073319, 0x6e8a6362, 0xf093cd9d, 0x84b6feb7,
-0x65bb53d6, 0x0a7b64eb, 0x3d2b5d76, 0xd236ef4d,
-0x34756cbc, 0x89fd572d, 0xdb632222, 0x5d82d8c8,
-0x050e23d3, 0x1ec3255d, 0x44f066a4, 0x8f000302,
-0x64dfb03d, 0x44724e44, 0xf941e9fe, 0xd63d9772,
-0x73573112, 0xe917c475, 0x1d65ee45, 0xad9d0c27,
-0x2eee1516, 0xb09a6ec0, 0x9a234102, 0x12fdefe9,
-0xf3551c10, 0xe6dcf306, 0xdec9cfa4, 0xe95a2141,
-0xaa10fedd, 0xac27ccf0, 0xf147613b, 0x47a734f8,
-0x2361f623, 0x94127597, 0x36957b47, 0x37d84ee9,
-0x36709176, 0x5d12f4dd, 0x09cd2137, 0x5b4afabe,
-0x4e6909f9, 0xa81237d8, 0x776424f2, 0xf00fcd61,
-0x12ed2511, 0xb09bfcfe, 0xe992245d, 0x974b12eb,
-0xf65cf65c, 0xfbbbfcd8, 0xd8ccccd9, 0x03236137,
-0x34445ac8, 0x139a47a3, 0x80b44df6, 0xf8f61290,
-0xdf21307d, 0xefbf5acb, 0x97317e49, 0x3af6137d,
-0x12b93659, 0x90f83646, 0xfa9d1430, 0x6850ab5a,
-0xebe01c85, 0xea21b61c, 0xc6b80641, 0xba87268c,
-0x092dde00, 0x43e5831d, 0xc112f800, 0xfb9ce823,
-0x6ada8381, 0xc96fb78b, 0xb3d89746, 0x719056e8,
-0x8bd3bdeb, 0xb344de8f, 0x08e3c11c, 0xd6c20bb3,
-0x35f5dc44, 0x08b8b348, 0x2d870fb1, 0xff72df54,
-0xfad6ff0e, 0x094de8fc, 0x88e43044, 0xec160e0a,
-0xc4b62d1b, 0x383cc35f, 0x3e434c8a, 0x3c43d603,
-0x0286eb0b, 0x1090585b, 0x726d773a, 0x3a09ef92,
-0xb186d5b0, 0x605c85df, 0x3d0c8b78, 0xc82c0072,
-0x16789724, 0x0aef9264, 0x775c373a, 0x0177e43b,
-0x85fa3c0d, 0x2189771f, 0xd5700b15, 0x5e0b5417,
-0x15fb1f2d, 0x8e02ad5b, 0x1db633b0, 0x6b205ea2,
-0x80480e02, 0x5a8d837e, 0x29f3a80f, 0xfad839f0,
-0xf754519f, 0x811a7212, 0x32335f3b, 0x7d9bbd5f,
-0xf9b04cd8, 0x232510c3, 0x358be673, 0xeaae802e,
-0x9a0d5b25, 0xff64ddb6, 0x5024b8db, 0x70e84943,
-0x89099589, 0xdbd085d6, 0x9725edbe, 0x6f33348d,
-0x2fc02504, 0xabd6b789, 0x99931110, 0xac9d989f,
-0x32c2b1d4, 0xa1bc8562, 0xfe02e110, 0x703abd83,
-0x0c15542f, 0x4857fa81, 0x93dda808, 0x90205322,
-0x0be4ccf0, 0x34a4ec10, 0x2058a948, 0xc1561ee0,
-0xe9fd8c5e, 0xfaa920ab, 0x091f42c5, 0x8c438451,
-0xc156ff6f, 0x107dc24c, 0x42130c02, 0x84f87c07,
-0xb501350a, 0x8a4d92c9, 0xeaabd800, 0x8189d30a,
-0x027dddd1, 0x271218ba, 0x00433d04, 0xb9102177,
-0xa3f7d7a5, 0xd2fee719, 0x70661a51, 0xd6684463,
-0x1237c984, 0x3596542a, 0x91dfea6b, 0x95d3751d,
-0x80c21f15, 0xdfb94374, 0x528c9787, 0x68316850,
-0xe3fc3884, 0x7c0038a1, 0xf4d9c000, 0x23b7cc08,
-0x19ac680e, 0x27bf88e2, 0xe9ac8944, 0xebf08479,
-0x3726e2a0, 0xf4402be6, 0x61e45326, 0x7ff75188,
-0x83fd7b29, 0xd08801ca, 0xb0b261e6, 0xf11a4305,
-0xe67c4362, 0xdad9df42, 0x08df735c, 0xd6e9c3c3,
-0x105e29d9, 0xc454fd05, 0x8ddf6da8, 0xb682d504,
-0xd08f457d, 0xac028208, 0xc9adb82d, 0x033b0880,
-0x7a150410, 0xad0218a9, 0x864b83ba, 0x008eefb3,
-0x538907d8, 0x0002b0e9, 0xd9c83d00, 0x37d2b17f,
-0x4dd3ba3a, 0x06241062, 0xcd51083a, 0xbf10578b,
-0xc7442360, 0x03c46182, 0x06bf0add, 0x68ee11f8,
-0x1b058c78, 0xd54bb007, 0x0e1fdb33, 0x45226409,
-0xba642a68, 0x6a08e008, 0x57003979, 0x7c0739a8,
-0x542ba462, 0x74040939, 0x190f8ac5, 0xe57845b4,
-0x284514d4, 0x4ca7579a, 0xfddbb636, 0xa3219468,
-0x40886684, 0x75f2128c, 0x06099093, 0x1db13740,
-0x68fe84f0, 0xa01db3b0, 0x6eb8513d, 0x09a8a492,
-0x0c11dc8c, 0x9a2dac54, 0xa8edffff, 0x160c1afa,
-0xbc680368, 0x4fb036df, 0x54e4e29b, 0x48482e04,
-0xaa30761d, 0x2e4c6b2e, 0x2a5b5052, 0x0209d7d8,
-0x7131b048, 0x9d98317c, 0x606ce464, 0xf3ae2e64,
-0x1e675f20, 0x7e310309, 0x48826807, 0x80c8c937,
-0x07097874, 0xcd7d82a4, 0x4c31017c, 0x649bbbac,
-0x342490ac, 0xc1098c88, 0x80a13906, 0x66172e1f,
-0xd15725bf, 0x8ce26801, 0x2f14312f, 0x21d5461e,
-0x2f1cbc18, 0x13c72b61, 0xc0e5e85b, 0x87ce68b5,
-0x68e1d6c1, 0x18b0a2e1, 0x1072b575, 0x7be01284,
-0x6bd920e5, 0xa3ca1cea, 0xf8090e10, 0x20968b1b,
-0x8021e803, 0x075f5d12, 0x27e9903f, 0x0481be88,
-0x6e90f0ee, 0x5e18a380, 0x891afbcc, 0x88f46ba8,
-0x607a4b91, 0x2e95d880, 0x4b6eab96, 0x050f4475,
-0xf2573ec3, 0x88805bb7, 0x208a0f4a, 0xb70ee8e8,
-0x903a87b2, 0x000023f2, 0x6dd95ffb, 0x33224d57,
-0x866c0349, 0x7445e41e, 0xd8c813f8, 0x0000ff68,
-0x2b030135, 0xc0d04706, 0x617107fe, 0xadde0011,
-0xff03efbe, 0xe3fc4bff, 0x8701035e, 0x5850203c,
-0x696c4345, 0x3a746e65, 0x68637241, 0xeeb7613a,
-0x3a0030bf, 0x49444e55, 0x3102320a, 0x82585f00,
-0x02394fb0, 0x5f5bdc05, 0x36362caa, 0x0532bd36,
-0xfffd916b, 0x510e37f6, 0x3c112b0c, 0x83828180,
-0x87868584, 0x00670000, 0x017f6db0, 0xffff0d73,
-0xaf726484, 0x41544146, 0x4e203a4c, 0x6572206f,
-0x6ebb6c61, 0x6d2dffe9, 0x2065646f, 0x63617473,
-0x5021906b, 0x564e0300, 0xff736573, 0x6143002b,
-0x746f6e6e, 0x14762023, 0x7fd6fd24, 0x6e25213b,
-0x64006369, 0xa26b7369, 0x70706f6c, 0xfdbfed79,
-0x277230b6, 0x6c6f636f, 0x48445473, 0x54205043,
-0xd9045446, 0x266ff12e, 0x384c5452, 0x51393331,
-0x32076c74, 0x05b6ffdb, 0x663b620f, 0x38333565,
-0x636d7300, 0xed633116, 0x2d31ec36, 0x65180931,
-0x6133626c, 0xedb177ed, 0x55746464, 0x362e0b6e,
-0x78743039, 0xeb1f6f64, 0xd465bbb6, 0x1e787630,
-0x1d64f56c, 0x33776e66, 0xed63cd6f, 0x1e333036,
-0x30303809, 0x656e9763, 0xfb6d4a2d, 0x20006f60,
-0x751b202d, 0xe6fd8b31, 0x6636d816, 0x03023089,
-0x65207872, 0x6ff6f672, 0x207261bf, 0xaa586825,
-0x70746674, 0x756f4c00, 0x11676e69, 0xfb7b2ddd,
-0x73253a40, 0x2f2f3a32, 0x613c0f12, 0x6e6b5b62,
-0x3e742ebb, 0x1298572c, 0xe678ad16, 0x0c6ead0a,
-0x03366e55, 0x6edf8e18, 0x4120f12f, 0x2522b450,
-0x0a220163, 0x656c6970, 0x56b6e673, 0x3e207af8,
-0x073f6d20, 0x0591640f, 0xc35a2a94, 0x05294628,
-0x6c3fe1ff, 0x002e771b, 0x72673a20, 0x68206d61,
-0xd0a17b89, 0x468c4e5a, 0x67696294, 0x6c042f28,
-0x49424eb9, 0x72837f0a, 0x75bb6973, 0x3a446dcd,
-0x42401e0b, 0xc200742a, 0x1687b5b6, 0x2161a712,
-0x6f8469de, 0x69fbb6ee, 0x6967616d, 0x657f733c,
-0x693ead70, 0xff6d5f74, 0x705e7422, 0x662008f1,
-0x2ebc756f, 0xbddc22c1, 0x654d0a1a, 0x2c00404e,
-0xad6b0ab6, 0x0abc0ec5, 0x9243f0d9, 0xb75ee73d,
-0x20856c20, 0x094333d0, 0xb7376f67, 0x2d646d1b,
-0x77f86147, 0x523a7961, 0x0ad63dd8, 0x203b0abe,
-0x29062628, 0x6c68d800, 0x444d9fc9, 0x5a65a112,
-0x3fd0b09b, 0x3e796d2e, 0x16856e21, 0xbc73addb,
-0x614427a4, 0xc7342872, 0x74749bdb, 0xf046e563,
-0x53d6dad6, 0x1006745c, 0x657a6934, 0xc3582371,
-0x5b0b0158, 0xc4204346, 0x38dcbb38, 0x70004932,
-0xdd985dce, 0x3b28a9b6, 0x75130a29, 0xb5bd6e77,
-0x4bbd8b76, 0x4e57706d, 0x747562a4, 0x8da386ec,
-0x641d49c5, 0x0e7373dd, 0x6d0c130c, 0x1a613e53,
-0xd8c61819, 0x656317de, 0xf7641069, 0x3b696a62,
-0x6ec73774, 0x64973a75, 0x010ab98c, 0x14f6085f,
-0x09796441, 0x25783020, 0x8e6b5a1f, 0xc94b136c,
-0x6f66b7eb, 0x84c3464b, 0x0aec9072, 0xdb7b114d,
-0x6d4a2ed6, 0x27502743, 0xf7b4603d, 0x6f4a5bd8,
-0x75572066, 0x14966c72, 0x0ae6c2b5, 0x6e2f1964,
-0xb9baab1d, 0xac90ce0b, 0xd66e6b97, 0xd676650f,
-0x8750d861, 0x8970799f, 0x645a6247, 0x733b98db,
-0x5b5b9f61, 0x85175d07, 0x70f21adf, 0x32156963,
-0x36353433, 0xeb69633d, 0x424139fe, 0x46454443,
-0x68032ed2, 0x1e563a06, 0x6d5ad7dd, 0x2f00edcb,
-0xdc14395f, 0x205b3e37, 0x33534f8a, 0xf53f7032,
-0x91306fb6, 0x342e351e, 0x435b322e, 0x9b10be18,
-0x2037abec, 0x50478119, 0x3587294c, 0x746b3695,
-0x1c654454, 0x36f1ad2e, 0x44d90c0a, 0x0e57c9c5,
-0x377c2877, 0x0d0a8520, 0x08b74fee, 0x6ed4208e,
-0x51784500, 0x46c3b673, 0xc30e3ab0, 0x23c0aa6f,
-0xd0bc36ce, 0x7269c0a4, 0x202ce571, 0x37862112,
-0x7dd6e42c, 0x2d739270, 0x85e37564, 0x7f0d8c47,
-0x58b94300, 0xc61af1f7, 0x20b4c45a, 0x0a896f89,
-0xcdad0b8d, 0x61665fd7, 0xb70d63c4, 0x4938186e,
-0x65d84d4f, 0x9b74de67, 0x607dadb5, 0x67091f78,
-0x18210b28, 0x3d46dce6, 0x23540a63, 0x5b9cdb86,
-0x04846c56, 0xf1c96fe0, 0xb992c045, 0x6c1de27b,
-0xddf612c4, 0x9133340a, 0x94621d65, 0xf645f266,
-0x6ea67bd9, 0x799d2273, 0x37e0676c, 0xd22c2d6b,
-0x9966c120, 0x67a11492, 0x12825f46, 0xbbd8c6f6,
-0x75f53d21, 0xeac119fc, 0x17a03c36, 0x70736164,
-0x2dd0cb7f, 0x0e747b6c, 0xde25296e, 0x1a50b05e,
-0x870f91d6, 0x42b61b69, 0xb4ae2073, 0x6b0e6290,
-0xb521ac0a, 0x61621f63, 0xd38041a5, 0x76e18223,
-0xa5f57853, 0xb9f656bb, 0x2f004da0, 0x6b6e67a9,
-0xe26360b4, 0xd3893c69, 0xc1c1c66e, 0x3932ffc6,
-0x19aef776, 0x5fb88fb6, 0xa62c78be, 0x36bd92bb,
-0x4578f574, 0x0c942978, 0xe06c1adb, 0x6c45ce61,
-0x8348671f, 0x2b16c22e, 0x70cc3d61, 0x06bdb0af,
-0x72ffd89a, 0x7d67c2f0, 0xf2db5c91, 0x9ed27920,
-0x854f9cee, 0x07c0e876, 0x0a8c77c7, 0x5b56ed15,
-0x7419bb70, 0x66662746, 0x03b92319, 0xf5415e1b,
-0xe6003b89, 0x00a49eb6, 0x4f4f42c4, 0x339c2d60,
-0x81c08813, 0x509c1597, 0x00ac859a, 0xdb146b00,
-0x64381c62, 0x632c17f5, 0x88d1aedf, 0x010a3511,
-0x062db9d0, 0x1420af4b, 0xde88531f, 0x1de9b122,
-0x537978be, 0x657571b8, 0x19cb5eb5, 0x447cf981,
-0x6ee3bb06, 0x6c24196b, 0x623436e5, 0x5241424b,
-0xe1e37419, 0x7838307d, 0x52c3043a, 0x073a52d9,
-0xbb86b614, 0x54687916, 0x3c08a761, 0x10d8040f,
-0xdcf4cdd2, 0xf5b7003f, 0xf9736f4a, 0x0861c19b,
-0xc9162143, 0x168dbd67, 0x3aa4688c, 0x5e9976a3,
-0x6a2b9e09, 0xe02a2c30, 0xb80b0b18, 0x9964778a,
-0x606e4a3a, 0x58230ec1, 0x42215758, 0x7589016b,
-0x3f3a2d33, 0x206a71d1, 0xd7816158, 0x81b1736d,
-0x58ee48cb, 0x8c265440, 0x6f42edb0, 0x75292e6f,
-0x73822e6f, 0x55703e7c, 0x3300a0ae, 0xa2a9b741,
-0x031ac0a7, 0xc700e691, 0x3702fde8, 0x07914000,
-0x36cf9fbf, 0x076720d8, 0x93179b93, 0xc026db1f,
-0x02100056, 0x17fb837b, 0x037faed8, 0xec228884,
-0xaa812910, 0xd42e0788, 0x8139fcfd, 0x81388922,
-0xf0860fb2, 0x6bfdbb13, 0x1307ef9a, 0xc2121111,
-0x1543cc12, 0xbed41360, 0x07d96c7b, 0x27de4033,
-0x07ea1340, 0xab0613d1, 0x9b6efef4, 0x1712596f,
-0x14eafda1, 0x0789080f, 0x5712ab07, 0xfc6452f6,
-0x7f891c81, 0x0889b601, 0xd39dc265, 0x0b0d033c,
-0x50a5ee04, 0x0b40ac5b, 0xd74cc83f, 0x031d57a8,
-0x2d580f7a, 0x054fdfb2, 0x962d6704, 0x0056c2bd,
-0x1b033cd0, 0x00f511ca, 0xc15292bf, 0x65601bfd,
-0x82639f2b, 0x0b966353, 0xc81605af, 0xb1778f76,
-0x07390302, 0xf09f5f45, 0xa8547b2a, 0x07403755,
-0x85800000, 0x0002406d, 0xffffff00, 0xffffffff,
+0x44070c03, 0xeb3be850, 0x5dfdbc2e, 0x050ced81,
+0x98ad8906, 0x168b00a5, 0xdbffbca9, 0x7400bfb7,
+0x90b58d21, 0xbd8d073d, 0x39054d90, 0x390472f4,
+0x890d76fc, 0xeeff1dbf, 0x3248b9e6, 0xfc89cf29,
+0xe3e8a4f3, 0x362d8b51, 0x6cf66c29, 0xe8686f73,
+0x3f450caf, 0xb70f1220, 0xfddb6d0a, 0x5c0424db,
+0x8d502624, 0x50608085, 0x7c548ffa, 0xfedb7edf,
+0xec01d38e, 0x936158cb, 0x66a102a9, 0xe61f6607,
+0x648b9d0c, 0xf73428df, 0xf79cd424, 0xbe852696,
+0xca9dcb9d, 0x6ffd8b6d, 0x57565507, 0x10247c8b,
+0x61983d2b, 0xe0cda810, 0x68af7eee, 0xe8550e48,
+0x5b217cba, 0xbb758df7, 0x42a30e40, 0xbe778904,
+0xdeb4b923, 0x29edb6fd, 0x732ea3f1, 0xf8ea2015,
+0xb8000881, 0xffdb7710, 0xd88e1cef, 0xd08ec08e,
+0xe88ee08e, 0xc35d5e5f, 0x89e64035, 0xddfb4435,
+0x3d057e7c, 0x584c1d48, 0x250b50a3, 0xfeeb0554,
+0xbb59b85e, 0x0300e968, 0x68535f1d, 0xe4514328,
+0x3ddc3efd, 0x890bb1e8, 0xa5282ca5, 0x6ca52f20,
+0xd737a5de, 0xe4cf6129, 0x8100768d, 0x858fbcfc,
+0xa8dd35ee, 0xed0c6020, 0x02341b22, 0x6edec646,
+0x17072db7, 0x7e8bd0ff, 0x3c8e8b8b, 0x8b8b4647,
+0x3ca18b15, 0xef0a342e, 0x8be2ff04, 0x68d6da4c,
+0x6e3f5189, 0x5902dffc, 0x08618904, 0x890c6989,
+0x14796071, 0xdbc3006f, 0x1b7342f6, 0x8b08431f,
+0x095a374a, 0xfafd3d62, 0x0c6a086f, 0x8b10728b,
+0x051c147a, 0x0b89ffb8, 0x43ada567, 0xbea29c28,
+0xe10c5401, 0xce62d992, 0xb8bb188d, 0xfbc61f30,
+0x21a225a1, 0x2e9d5d58, 0xf0f0b928, 0x2b07351e,
+0x38815080, 0xc3c34800, 0x82858901, 0x75956ffa,
+0x68e486c4, 0x284f2907, 0x9a352f0c, 0x535053fb,
+0x2c1d9da9, 0xcb024389, 0x03752fb7, 0x88101f0a,
+0x0c020443, 0x0f076388, 0xf6e35b7f, 0x90c3585b,
+0xc6535600, 0xb8ab1525, 0x67a6046c, 0xc66577ff,
+0x70b0d629, 0xd329c389, 0xb801006a, 0x847132e8,
+0xe42dddbf, 0x05685004, 0x6e09e5e8, 0x6f0b3b80,
+0x0dc2bd6f, 0x057703c6, 0xb01097c0, 0x06131800,
+0xb1032e6d, 0x0a230b03, 0xa6d81457, 0x1881d6b7,
+0x6a100479, 0x50160d02, 0xe4679b06, 0xb8501cfb,
+0xe8e851ef, 0xe3c28993, 0x537046df, 0x0a23f666,
+0x0f037401, 0xc5b8c6b6, 0xa39ec1b6, 0x12038849,
+0xcf233d92, 0xfc1e45f2, 0xd24defef, 0x978dec9d,
+0x04bb782c, 0xc8fc2303, 0xfc33cc96, 0x26c03229,
+0xe77b5ed6, 0x05262b0c, 0x0b642694, 0x0631617c,
+0xb901f083, 0xcfb22f01, 0x0c1573c8, 0x5608d20c,
+0x59b26791, 0x151729af, 0x9e4b6f0c, 0x3426a815,
+0x9616c766, 0xc7b708b1, 0xd8170a6a, 0xe60c2422,
+0x1733f919, 0xe61c7417, 0x171a5bfa, 0x0e333518,
+0x367d8800, 0x50d8dde9, 0x39d06a3d, 0x836630eb,
+0xbbe5b4e7, 0x19755741, 0x17111607, 0x6faffbe4,
+0xe2c112ca, 0x01104306, 0x100febc2, 0x77e3f016,
+0xd0891419, 0x1e5755a1, 0x6fdebb3c, 0xa995ef7c,
+0x54513b07, 0x46b87d7d, 0xf48ba46c, 0xbdea71f5,
+0x7f1e9081, 0x06df835b, 0x04665024, 0xb3e82268,
+0x6c1f8407, 0x7b81c063, 0x07740e12, 0xd87956e7,
+0xf639eb7b, 0x8b2b0d7c, 0xdbeefdc8, 0x8d457cd6,
+0xb9fc1a37, 0xa5f31305, 0x14c58343, 0x8fd9f6c6,
+0xdb850b71, 0x96bc9d74, 0x3c4cd889, 0xb106c361,
+0x9f5a5fd6, 0x4bda1bfe, 0xb20df02f, 0xfffe84e8,
+0x3360a3fe, 0xfbf3e886, 0x0aa0bb73, 0x950964a3,
+0x136c6820, 0xfbefff2e, 0xc4684ffe, 0x75c08510,
+0x0c05c773, 0x2005db02, 0x63b042df, 0x097005e5,
+0xc1490508, 0xf77b9b73, 0x74a30ae0, 0x15899907,
+0x7c1f0678, 0x75832105, 0x8009db63, 0x84091029,
+0x6c9ba133, 0x3164b06c, 0x548c2a88, 0xbdbb3490,
+0x28bf0611, 0x8660773d, 0x5ee9055d, 0xa089a983,
+0x0b18145a, 0x19a04508, 0x1c180ca4, 0x88977b6b,
+0x79b9358d, 0x0c011740, 0xedf0d8a6, 0x0a870f1e,
+0xbdb98105, 0x4f7730ff, 0x587df08d, 0x2b0a064a,
+0xafba1299, 0x7dfd8e91, 0x77a4b7eb, 0xc8993b08,
+0x078b0676, 0x61b181c7, 0x2ef3c5cd, 0xe430f309,
+0x29b1b164, 0x6736191e, 0x67de00a2, 0x09ff9dd3,
+0x818b920f, 0x6822918b, 0x72dec738, 0x3803d689,
+0x10cbb113, 0x1bf06f02, 0xd639142d, 0xd8776a72,
+0x376476c3, 0x2dd8fd8e, 0x2f390c11, 0x08722c77,
+0x22773f39, 0x9ddb1b3b, 0x2b1c19db, 0x814f1b0f,
+0xec39194b, 0xeb9189f3, 0x89892128, 0x19108ec1,
+0x78815ec7, 0x08b63809, 0xc18347ed, 0xcca15d71,
+0xeebb1201, 0xc3267370, 0x2bd813b8, 0x42ee3305,
+0x7a9f61d3, 0x97d0850c, 0x230ac632, 0x084a75db,
+0x08a60acc, 0xc1fc607c, 0xff0cca3f, 0x727d9c35,
+0xec2e0000, 0x12dddd91, 0x8c2f6814, 0xeb5d5513,
+0x075203fe, 0xa36f6df6, 0x6efd2835, 0x3935590c,
+0x7420fd86, 0x97cca12c, 0xedcc8f80, 0xf15a9816,
+0x3ae81b9f, 0x8e077837, 0x446a166f, 0x8068d557,
+0x10f4ffb9, 0xc361ff05, 0xe80aebc1, 0xf4c81ee7,
+0xaa8450be, 0x3172189d, 0xb8b114ba, 0x16afacd0,
+0x2ea118a7, 0xb7f6c674, 0xc13ae9c2, 0xfa890ae7,
+0xcbceb809, 0x362da702, 0x55d78923, 0x7aa0dbaa,
+0x1ea19da6, 0x144ce88b, 0xe4db93ee, 0xe81c735e,
+0xa7460b85, 0x836206fc, 0x187b0c1d, 0x8856c35b,
+0x26661447, 0x35bbfbd0, 0x96e2811c, 0x061a8c8d,
+0xc0fc2e99, 0xf289336e, 0xa4227423, 0x0bff817e,
+0x74c98504, 0x2102c714, 0xfb455246, 0xc281044a,
+0xe0c05e00, 0x49669fef, 0x24e8ec75, 0x57711b00,
+0x75c66c32, 0xadc5e898, 0xf58b78a0, 0x1c1f369e,
+0x77d4bed5, 0x6c37fe74, 0x29f1893f, 0xbb01c2d1,
+0xd729c789, 0x80398166, 0xa85e7402, 0x3f4fb6fd,
+0x98187564, 0x044703e0, 0xd4bdf361, 0x4fb71d6d,
+0xebd8e604, 0xd23efbc5, 0x43c1d9b1, 0xc358828d,
+0xe300e381, 0x68ed8f08, 0xde0d0d8b, 0x2955ce29,
+0xb1bd1ad0, 0xc8393ffd, 0xd8392977, 0xfb812577,
+0x1d9c0a13, 0x61e9c889, 0x2719a1a1, 0x1d48ae56,
+0xb312211d, 0x04351c21, 0x2240ccab, 0xf48950b6,
+0xec56e13b, 0x4a4d81ef, 0x34053b52, 0x71393277,
+0x760d8b6e, 0xff522a75, 0xfaf05745, 0xd186d904,
+0x096705c7, 0x83838904, 0xa84f0b60, 0x23631bc8,
+0xc454c8c2, 0x86d7245d, 0xa3975c05, 0x5cef2e8c,
+0xc736ed88, 0x987fed46, 0xb81ec8a1, 0x811d9601,
+0x5b084087, 0x3a01b8c5, 0xb63d9bc6, 0x4c4b8c42,
+0xbbf0a12d, 0x8b7eec54, 0xe9815c36, 0x9654bf4a,
+0x78f23d4c, 0xf529fd35, 0x478979aa, 0xf21e11dd,
+0xf7813386, 0x3800b80b, 0x2dd9ccdd, 0x54f8fb0f,
+0xd6dd9b37, 0xa113fd0c, 0x18e44e8c, 0x30019d03,
+0xf38d0da3, 0x025d9bbe, 0xefd82066, 0xe507be6d,
+0xa9000189, 0x46c070a3, 0x74a2bacb, 0x85e59e56,
+0x8817ab5b, 0x0242e798, 0x2dacef48, 0x0112ee76,
+0x05d6c8e5, 0x436bf7b0, 0xb82e75fa, 0x81120054,
+0xc1ea8112, 0xefd9ac6f, 0x89af928b, 0x01db6810,
+0x060850aa, 0xd74fd087, 0x3575a9b5, 0x57204e6c,
+0x19285a24, 0xff8b74cd, 0x77df3d3a, 0x1a048d11,
+0xed152b90, 0xa8f6f587, 0xeb081d89, 0xe8052523,
+0xd622fbc0, 0xd048083a, 0x283a08ff, 0x3fed86d2,
+0x89dd29c5, 0x0c7f83ee, 0xff9c15be, 0xba395577,
+0xc4748150, 0xeed85be9, 0x0ba1c239, 0x01bfb18d,
+0xfc334c8f, 0xe856ee60, 0x01121bcd, 0xf45e8dc6,
+0x8dce33f0, 0x37395b6d, 0x0435b319, 0x4dfe1f10,
+0x02c3df9e, 0x9a01c132, 0x06548d12, 0x178054e0,
+0x818b56eb, 0x30ac018b, 0x03e833fb, 0x12e88906,
+0x7b6bd906, 0x081436c2, 0xa0107ff3, 0xd8172508,
+0xdb3414a8, 0x14475942, 0x6ddb3704, 0x47301c05,
+0x9174290c, 0x5b7c73ac, 0x03990d66, 0x750803dc,
+0x3fc4da97, 0x8303014c, 0x04e2fce1, 0xcc297155,
+0xc6c08db4, 0xabc35154, 0xf57e0c6c, 0xdddc5c24,
+0x2ce8d024, 0x5dec8906, 0xbd4ea1e7, 0x6140e194,
+0x94249c10, 0x77036308, 0x335437d8, 0xec40ec07,
+0x180d6f0d, 0x745836f7, 0x898f8d48, 0xa97c5b22,
+0x83d67778, 0x060018c2, 0x2f85aea5, 0x2c7630b0,
+0x12c7c2b4, 0x00adb6df, 0xc07c7964, 0xfec1c6d3,
+0x6f6e1602, 0xf1393ec1, 0x551b107d, 0x0f41108c,
+0xb00df07c, 0x52671b75, 0x98145f53, 0x62c631f9,
+0x240cc1b0, 0x264f2e63, 0xf43c58d1, 0xaa10a117,
+0x45f81eb8, 0xd02dd8f8, 0x01e80566, 0xc783c416,
+0x4b8dd6eb, 0x2d4640c4, 0x36241dce, 0x74d285bc,
+0x02c50610, 0xa1d03994, 0xd6284523, 0x8ba3bf49,
+0x05b72c06, 0x4a21041b, 0x6ae30f08, 0xe570f7b9,
+0x150db459, 0x52c9008b, 0xc3d84f86, 0xa7d10abe,
+0x93e8da74, 0x3982b9c4, 0xfe0b73d9, 0xf6f18304,
+0x42c11937, 0xf572da39, 0x5e5bc10a, 0x1bbe1cb4,
+0x3086746e, 0x982f408c, 0x07a10a74, 0x9b831de9,
+0x7599e509, 0x1325b620, 0xd86b822d, 0x80fa21be,
+0x1bf16ac2, 0xee6217fd, 0x23a6840f, 0x0f0264a9,
+0x29f0e783, 0x301989c7, 0x20448b1c, 0x326c80b9,
+0x6bfef0d0, 0x738d1205, 0x11838d60, 0xbefe18a6,
+0x816e2f0d, 0x81a58eef, 0x042d05c7, 0xfb049605,
+0x1bc6eb31, 0x0ad0e714, 0x07011883, 0x9b783fb7,
+0x32e42d12, 0x68056c8d, 0xd478f0e5, 0xe4a35828,
+0xafdb1b28, 0x046a1c6f, 0xad8c4a68, 0xc60558d1,
+0xd0ce58ac, 0x07c695d5, 0x0e431807, 0x91844605,
+0x0c0e0891, 0xfb16ac30, 0x9c05778c, 0x2b6612e2,
+0xb1060abd, 0x107beeb1, 0x142b1625, 0x6edd9405,
+0x05ffdd2b, 0x571c5318, 0x1e0d071d, 0x7690eeb1,
+0x1f97ccfb, 0x0f200328, 0x6dba775d, 0x22022a07,
+0x2e13bca1, 0x02d82603, 0x306a6536, 0xea320d11,
+0x54066c9e, 0x3643057c, 0xb6c6405c, 0x43ceec48,
+0x46078e42, 0xc6f94805, 0x4a12f906, 0x1250054e,
+0xdc2d3752, 0x6a055606, 0x35010158, 0x77054328,
+0xc7e3f0c9, 0x68eb2404, 0xbadf164f, 0x07742257,
+0x0646ffb0, 0x46c60201, 0x46fc2c08, 0x6014830c,
+0x4693b6cf, 0x570e2c0a, 0xd7e71246, 0x467bac1d,
+0xdc140320, 0x16032246, 0xd8c8f622, 0x1a281858,
+0x001e1c05, 0x38956200, 0xe6245361, 0x7b502646,
+0x60603824, 0x83a72a46, 0x8f0c0fe3, 0x5e7dbbb1,
+0xb42c6a28, 0x46c9fd37, 0x80c78e09, 0x08c36c8c,
+0xdf1fc106, 0xbf703a68, 0xe80f377a, 0x6a95fbdb,
+0x938bedf6, 0x2c6aa517, 0xfff91a15, 0xb1063cff,
+0x1cb320c6, 0x7adbf57d, 0xa9e81f6b, 0xdb4a1cf6,
+0x1d19e3c1, 0x060831dd, 0x3c55c7ed, 0x914823de,
+0x1434164c, 0x436762ea, 0x51ed9960, 0x89628eb8,
+0xfdf40d13, 0x7e0ff86c, 0xcba2708f, 0x95eb81d3,
+0x6deb68be, 0x6d063ffa, 0xcf29f789, 0x8389078b,
+0x04260b48, 0xe0bbad0a, 0x4e83ec8e, 0x4c83250c,
+0x60156006, 0x94d3ee83, 0xeac1180a, 0x35d05719,
+0xcd8d2285, 0x1bd04e76, 0xed84067f, 0xa9bad0e3,
+0x0620d0ee, 0x82c0010e, 0x4e810cb5, 0x53dfecb3,
+0xaf5274f6, 0x98ba3f74, 0x9598152b, 0x3bfdcc18,
+0x808b5f16, 0xe802899c, 0xb042c8ce, 0x7650d090,
+0x46687714, 0x8e519c2f, 0x3be86a18, 0x57b5c557,
+0x23740e2c, 0x88052378, 0x34e8d0d0, 0xe7c75cb7,
+0xb060e46c, 0xe8a6eb73, 0xb257ea56, 0x85526cf8,
+0x0b8d147a, 0x9fe662cc, 0x323a1bed, 0xe8d0de38,
+0x00c18960, 0x83024b0c, 0x27dd0de0, 0x01d30db5,
+0x063979f2, 0x5312e283, 0x810e2d80, 0x85086a04,
+0x0f78364d, 0xa24635e8, 0x77f9cc05, 0xda1d1dee,
+0xaee8206b, 0x1409b322, 0x74085e5b, 0x8b6d672d,
+0xdd24ec20, 0xe01bc777, 0x76a83881, 0x4d028b1f,
+0x6904428b, 0x35b62060, 0x72080762, 0x37ed1040,
+0x06a0fe28, 0x138b1beb, 0x362d4314, 0x82438fb0,
+0x93310640, 0x35bb51b0, 0xc109365f, 0x92c81315,
+0xff5a2c7a, 0xd001d144, 0x8370498b, 0xc60e506d,
+0x9466ce25, 0xdc09bddb, 0x18bf7c24, 0x9e908068,
+0x7c04516b, 0x0eb3639b, 0x774c094d, 0x5515b879,
+0xcecd9187, 0x27000a0b, 0xee2e7022, 0x3dce8c47,
+0xbeb7be51, 0x6f7d1486, 0x9f83aded, 0x900a7702,
+0xa0853493, 0x0fc07b72, 0x75f81bae, 0x8d6f9f17,
+0xadd1247b, 0x247e9e45, 0x75161c00, 0x6e0b0e1c,
+0xcc1b6deb, 0x7e144270, 0x17743b64, 0x310775e9,
+0x02219f02, 0x3c91a916, 0x062e4baa, 0xdb99ae68,
+0x76010f48, 0x580f0069, 0x506a4988, 0xb4834c5f,
+0xd190b90f, 0xff53e06f, 0x0003c713, 0x07dff724,
+0x3023d0de, 0x468b2c4e, 0x9768e15c, 0x5dbf64d8,
+0x5750bdba, 0xfbfce027, 0x88608a68, 0x1c896c46,
+0x4b8b18de, 0x2a4820b4, 0x568bf4b0, 0x865b6768,
+0xee52a317, 0xe20be76a, 0xd8373d55, 0x8129c360,
+0xbcc09454, 0x062d09e8, 0x018816c4, 0x8555fef9,
+0x1df6d78b, 0x478d021e, 0xb42d5007, 0x3c68a4b9,
+0x47305dfb, 0x7e02ff83, 0xec584bdd, 0xcfbb7657,
+0x0c0863b6, 0xbded6662, 0xf68a9bba, 0xbbb95ac4,
+0xba052017, 0xb85209a0, 0xb56a05a5, 0x75296ef6,
+0xff5008a8, 0x97695c76, 0xdc3efaeb, 0xe0686807,
+0x864fafa5, 0x8f019b14, 0x161f8fdd, 0x7404a858,
+0x9110e117, 0xaff88a24, 0xf8b83461, 0x00c720f4,
+0x3f521f43, 0x46d26f7f, 0x061db948, 0x501c9b4c,
+0x85541ef5, 0x1b4a1309, 0x82e6d62f, 0x2c761b04,
+0xd1423eb2, 0x78db1681, 0xcf4ec764, 0xbe8dffff,
+0x0be5d30e, 0x80b0596c, 0xb0eefa89, 0x89edee88,
+0x04c683ce, 0x68973878, 0x81ed68b4, 0xd3f10ec5,
+0x88e0bc6e, 0x19ab59f8, 0xe0e2f7c0, 0x152fb402,
+0x1c8ad23e, 0x8888cb2e, 0x76f6add8, 0x02f96db7,
+0x83138a32, 0x4e088cc8, 0x6c42cd79, 0x47bbbb0d,
+0x5a10beed, 0xb1d98cbd, 0xdddbe80f, 0x0c4ea1bd,
+0x49ece3d1, 0x0b89c309, 0x112cc888, 0x85bf7a7b,
+0xb0e37ff6, 0x10512ef7, 0x1f7f84b0, 0x13b96767,
+0x0eb804bb, 0x06b90084, 0x441d9d2b, 0x230807ef,
+0xe8360c09, 0xef37da61, 0xb01fc90a, 0x1aed6eac,
+0x3715573c, 0x97d429ee, 0x821b4fa7, 0x4c97d83c,
+0x6b0b2e9a, 0x082c42f1, 0x10682b68, 0xb8470974,
+0x1323ae04, 0x20b9eb3c, 0xfec35c77, 0x5f8bc6ff,
+0x8d0e0440, 0x41ee0b14, 0x7e05f983, 0x5a0cb0f3,
+0x0ac645ab, 0x0c578f86, 0xf427b0eb, 0x400c036c,
+0x9dc860ef, 0x10ec3f1e, 0x35ef30f6, 0x4c0bb866,
+0x9ee857ef, 0x0ba11845, 0x15de04c2, 0xba31663c,
+0x5fd4ea33, 0x24d81492, 0xd30af8ed, 0x862c620b,
+0x06a7fdc4, 0x3b826c22, 0xdc682c96, 0xed5031d1,
+0xe6ef9068, 0xe268b612, 0xdd021f11, 0x5bc77c9d,
+0x0b13e868, 0x68383753, 0xb4fe8dea, 0x4ff911f9,
+0xfb580ec3, 0x7c0d773b, 0x78d76cde, 0x760c554d,
+0xe110caf3, 0x47050ff7, 0x02e2c13f, 0x209a0366,
+0x91fc71ef, 0x081e406d, 0xe8ef1017, 0x9d28ea5a,
+0x45234cdd, 0x3ec412c6, 0xbf61d10d, 0x252d3119,
+0xffff800c, 0x05bbef12, 0x0edead57, 0x2d2c709d,
+0x1a2df039, 0xd372d91f, 0xc3f6ed47, 0xdf864bf8,
+0x40147d46, 0xeb08a38a, 0x3300bb0c, 0x16280b9e,
+0x282810fe, 0x1b86d8cc, 0xc90b20cf, 0x3188dc18,
+0x127aa867, 0x6c615c01, 0x3c8330c2, 0x42010269,
+0xb11b6d87, 0x5ae8d395, 0x9bef10ae, 0x8268f05a,
+0x8b502c2c, 0x8df03f82, 0xc14cbf0e, 0x922510ef,
+0x68753ea8, 0x0da50bea, 0x810811ef, 0x763beeff,
+0x3c2d7d7d, 0x6dac5197, 0x6034d7f6, 0x5e6e0c17,
+0x98e1fd7f, 0x97dd98e9, 0x472e7ae8, 0x3a98647f,
+0x3220003d, 0xae52ee38, 0x58fcbbdd, 0xec54d329,
+0x345ecc82, 0xfc4de11e, 0x4e7ae860, 0x29f88990,
+0xd7f02dfa, 0x7753861a, 0x2f605e03, 0x5806d861,
+0x18e6188a, 0x3264769b, 0x0d9b6315, 0x03321947,
+0x75fb1ade, 0xea075f6d, 0xa1660aa3, 0x7c92e810,
+0xbb3dc14b, 0x9851e2ef, 0x6924b486, 0x86818263,
+0xbe0c1761, 0x87e18e53, 0x9bd02e31, 0x26740204,
+0x81538b80, 0x0c37eef6, 0xf7f26926, 0x1dd021d2,
+0xf0090275, 0x2ece9918, 0xb18def1c, 0xc4360c01,
+0x30906da1, 0xba1c047d, 0x81a92674, 0x10b0b669,
+0x6f6f841c, 0x1c8325e4, 0xb05367b7, 0x869dcd67,
+0x8fbe19d0, 0xd4b53547, 0x0f18ce0b, 0x7396debe,
+0xeff68b05, 0xd1ef05e0, 0x486948b8, 0x05fa816f,
+0xf5776a6e, 0x77075aac, 0xeb0ce206, 0x70780d2f,
+0x7422a6f6, 0x2e25eb18, 0x6cfc7301, 0x3d2ad810,
+0x540e2c2a, 0xd8fffff8, 0x1df57ab6, 0x0350a4f4,
+0x3a3b48c5, 0x8d42705d, 0xffb8fd3c, 0x47b40681,
+0x768810ec, 0xd431005b, 0x3abb00aa, 0x9ba3e483,
+0x5d54cad8, 0xed023d2b, 0x2ad17ec6, 0xed0a96e6,
+0x410c75a1, 0x02df660b, 0x699ce808, 0x2afba5e0,
+0x74fcfd18, 0xf0556822, 0xdb1e0750, 0x70169edc,
+0x49c0913c, 0x66a1e82b, 0xedd7236e, 0x041a620c,
+0xe96e9c36, 0x741d8b04, 0xa5051ed6, 0xe6180544,
+0x61836ff0, 0x41bdf4f4, 0x1c5bffa8, 0x13b842b0,
+0x7512e320, 0xddbaf8ed, 0x29f84f03, 0xa1892ee8,
+0xa975c909, 0x3ee0a45e, 0x98fe7445, 0xe87deebd,
+0x68b518a3, 0x310a6435, 0x64f915a2, 0x6c877779,
+0x3d589763, 0x766b2efc, 0xffbf3dfc, 0x12e0bf02,
+0x7ea95874, 0x02fe8354, 0x10a14f7f, 0x9f7740c7,
+0x1d14bf78, 0xa50c1d8b, 0xff08e4a1, 0x71760450,
+0x23e7126c, 0x05417883, 0x8dfa3abe, 0x41fe5b11,
+0x68016a16, 0xd46a18d4, 0x79ddf126, 0x33de384c,
+0xeb7653d3, 0x469eb01c, 0x651a5c6e, 0xb1033974,
+0x0ff636dd, 0xfd10598f, 0xe9087219, 0xa0eb0d81,
+0x94049767, 0x8a8c0800, 0x47a1fe4d, 0x14db7ce1,
+0x975e2248, 0x350fa02f, 0xe81b74fc, 0xd10a19ac,
+0x621b12b7, 0xd5f7a26f, 0xe812ba17, 0x31b003bb,
+0x6b8eac16, 0x710c4ddc, 0x36fdeec1, 0xd9e8a33d,
+0x00c9f005, 0x9b6404be, 0xff3d8b10, 0xc1dc0c6d,
+0x541073ae, 0xe9c23009, 0x9859f610, 0x55658535,
+0x1cace884, 0x35a394da, 0x338d3b61, 0xcfd8fbe9,
+0x894157b8, 0x02e1c106, 0xa3d340a1, 0xa036a5dc,
+0xcbe2fe0f, 0xb60fec15, 0x4081ad78, 0x61223603,
+0xc22f0b0a, 0x031364d7, 0x16981285, 0x6b1d9d82,
+0x0d751208, 0x75c219b5, 0x15c5b7a9, 0x71151731,
+0x86bd168c, 0x8ffa59af, 0x1ea12371, 0x1dc3343a,
+0x60908d51, 0x84ab6a08, 0x9f95f082, 0x80cca30b,
+0x5884709f, 0x5089ba82, 0x1c5889c2, 0x08308c21,
+0x0c3e20ee, 0xfe10f0fc, 0x99be0dbe, 0x4f0111e9,
+0x430c1b2e, 0x15428233, 0xb08e1478, 0x55142384,
+0xeccce964, 0xe3c423b0, 0xec33745c, 0x74f4302a,
+0x7a8b6d84, 0x1a74763b, 0xf7cf5a19, 0x7db3fb05,
+0x90e03846, 0xd8860245, 0x0978c43b, 0x803c896e,
+0x3563c7ec, 0x69785208, 0x62ebb3be, 0xcd74231e,
+0x1e340c8e, 0x17eb3647, 0x408cde10, 0x7d83df04,
+0x4f92c20e, 0x7945ff67, 0x4434097f, 0x05b410ec,
+0xd8048d41, 0x9659a1c1, 0x6aa1a17a, 0x0390d6db,
+0x0c897f11, 0xb7f85408, 0x35c637ed, 0x2dbb6301,
+0x12dc3e80, 0x68743a04, 0x0dfb6ef1, 0x1e3c8043,
+0x3a05060b, 0x80bff375, 0xedca5a33, 0x0570ffe4,
+0x0194d808, 0xbd12c4de, 0xe814bf37, 0xb2274863,
+0x8205bb3f, 0x722408c7, 0x00b2e9df, 0xfdc0da31,
+0x036aa6e4, 0x8cb57568, 0x0c6dfa1e, 0x352d34db,
+0xd8a58892, 0x47386f03, 0x06a493b8, 0x2f388085,
+0xd70b1e1a, 0x331d4774, 0xe4cfe852, 0x9ce6b701,
+0x3403ce8b, 0x4020921d, 0x7beed8e1, 0x240a5429,
+0x318a5010, 0x3760f615, 0xe0cf9e29, 0x1f2d7546,
+0x959af03e, 0x687ef2a3, 0x44c83679, 0x04fd18ed,
+0x36a66806, 0x3e401480, 0xc3dd0afd, 0x25740457,
+0x2d905650, 0xa5f18568, 0x9e29f202, 0x001f2015,
+0x86e1e900, 0xe885f425, 0xfc971a13, 0x07759c97,
+0x6a143c24, 0xab02d0fe, 0x480288c1, 0x3e227c80,
+0x34180b7c, 0x3d80382f, 0x29749945, 0x0d631186,
+0xc2b80825, 0xb8775f7e, 0x860f3d46, 0x0bee52f9,
+0x6033c781, 0x8605f5ab, 0x97fabdbc, 0x31785bbb,
+0xf6218b33, 0x8a0c4405, 0x466b46c6, 0x0fd4129a,
+0x8c520a07, 0x26240df8, 0x6abc5c79, 0xa9ba6b6e,
+0x94808dce, 0x30dc5264, 0xee8b9c1a, 0x2c35ef6e,
+0xdf96e806, 0x62dbe0bc, 0x64100d9f, 0x593f43af,
+0xdd821d25, 0xbb3595d4, 0xdb85ffd4, 0xcf7ef608,
+0xd953401a, 0x040de028, 0xb14a5868, 0x28dcc180,
+0xfe47502c, 0x087725c1, 0xcb270001, 0xc695be3c,
+0x89932080, 0x40bc855a, 0x8bb24d85, 0x8b20e84a,
+0x996a0c42, 0x0d8b637a, 0xbb73bad9, 0x6816f895,
+0x9184d8a2, 0x09481d20, 0xb0af6a5b, 0x113248eb,
+0x0738b890, 0x876c64fa, 0x18a3042a, 0x1875022f,
+0xac1b81ca, 0xb91b2b45, 0x567dec3b, 0xa10e20f0,
+0xa1307c34, 0x636c1604, 0x4334a3f6, 0x6f723815,
+0x22b6bf86, 0x0fff243b, 0x543bf025, 0xc1d1bd8a,
+0x9014b0f8, 0x8203bb01, 0xb72fb261, 0xec830f75,
+0x8a3629d6, 0x1e1837f7, 0xa01a7584, 0x74ed8504,
+0x141d8b3a, 0xf6d88241, 0xe776f339, 0x63336bf3,
+0x2d4b1b4d, 0xad14f357, 0x19012129, 0xd763ebee,
+0xdf01de29, 0x04411d36, 0x62105a01, 0x1d5b34ca,
+0x28a09d4c, 0x38246eab, 0x07d419c4, 0x4ec29730,
+0x03416705, 0x6010428f, 0x2df48d13, 0xccb8300c,
+0x7d084d2d, 0x0531bdfd, 0x53e968e8, 0x8c591c3c,
+0xa7b3850f, 0x4cad5f2e, 0xd461e075, 0x614b5650,
+0xf08631f8, 0xbb05bb48, 0x0f1bf3ff, 0x93c22307,
+0x2601da41, 0xb4bc02de, 0xc28f89fb, 0x39d021c8,
+0x720cc405, 0xfa5bc015, 0x730b4fec, 0xc01a6609,
+0xa436c821, 0x14250562, 0x05b974bc, 0x03ad0e8e,
+0x7403df5c, 0x1fb86012, 0x34a5c728, 0x0b5e0508,
+0x73fbd00f, 0xd8bd1baa, 0x8dda8391, 0x62c2fb53,
+0xf12e348d, 0x0baa2e60, 0x9839302c, 0xa5a68587,
+0x3b351fd7, 0x0e767508, 0xd5b894ab, 0x335b19ba,
+0x5fc8cacc, 0x51aec02f, 0x50ce28a1, 0xf1077704,
+0x3b6a176f, 0x064bebf2, 0xeb287403, 0x7d148b44,
+0x180de160, 0xff307c80, 0xeb0f37e1, 0xcdd9bd31,
+0x04241281, 0xc3b11eeb, 0x1bde051d, 0xa3660637,
+0x205456d3, 0xbf761eed, 0xeb89e7a3, 0x2c568284,
+0x1f74b97c, 0xcda9173b, 0x3274c806, 0x68100351,
+0xafc46082, 0x40514c9c, 0x80305d1a, 0xc81c0d4b,
+0x1b111007, 0xa4e349dd, 0xc558ff54, 0xd7772343,
+0x0b0bb4dd, 0x6d05b005, 0x418dff5a, 0x1075345d,
+0x721a15ee, 0x39087728, 0x63909b1b, 0x291e721e,
+0xac241914, 0xe91c4efb, 0x010f7888, 0xd819c71e,
+0x39459d82, 0xb87309b4, 0x4417361a, 0x5c4368c9,
+0x8a5c1dcd, 0xd810f46d, 0xa0c2078b, 0x3dd4d0c2,
+0x3869cb86, 0xf6301840, 0x409a363d, 0x291ecd42,
+0x2b77012a, 0x81d2cb16, 0x010da850, 0x702f4767,
+0xd000d1b1, 0x627b0c9a, 0x253a8c52, 0x3a68b18b,
+0xa88b6ddc, 0xac151325, 0xeb548a52, 0xac8ebc59,
+0xbe40292d, 0x47ea02a0, 0x084a1b60, 0x8b413eb0,
+0x6fbea48e, 0xefb0573b, 0xd3392f55, 0x392972b1,
+0xe107bd6f, 0x442572c1, 0x07a11674, 0x968b0517,
+0x7efec41b, 0x05903b2c, 0x1e890673, 0x125fc661,
+0x1020a97e, 0x7ff839c5, 0x8b5a74a2, 0xb1975ef6,
+0x86e63435, 0x6cdd2fac, 0x06c03f5a, 0x19c129b1,
+0x76cec3d3, 0xb3591d68, 0xdab03a55, 0x3d110d44,
+0x82e63997, 0x759d8f21, 0x3458e865, 0xf02d3546,
+0xf7e70025, 0xa8157847, 0xd311c101, 0x11540d01,
+0xb3f11c1d, 0x0f1ab308, 0x5c09d0ac, 0xed60d8b1,
+0x2901ff2f, 0x721e40a3, 0x721d0d0f, 0xe8265038,
+0x9d207878, 0xeb2df535, 0xa9080a72, 0xb608ceb3,
+0x3473de20, 0x22a38306, 0xe90b63d4, 0x1f7269a6,
+0x3228865a, 0x1949e867, 0xa78a76ec, 0x30edc047,
+0x142b7ee8, 0x0c5b7eef, 0xd0892815, 0x34688d2a,
+0xa958e1bf, 0x00fa0e83, 0xbb83d693, 0x020297a7,
+0x838b373f, 0xb30600ac, 0xf6135ab4, 0xf0e87807,
+0x4955580a, 0xc7788fd8, 0x1eab0357, 0x8d20c3d1,
+0x21bd3a55, 0x3966b198, 0xb5ab6e35, 0x221ed73d,
+0xa50f1a2f, 0x309d0884, 0x3cff93f8, 0x70d9916e,
+0x89a31bb6, 0x7cdef608, 0x22004044, 0x22f163a1,
+0xfaf8231f, 0xe042505f, 0x146ea615, 0x1e92815d,
+0xbf8d4bac, 0x4378b635, 0x04e316aa, 0x53505033,
+0x91c184e8, 0x8530d088, 0x024d0ac0, 0x721edc2d,
+0xc356e6bc, 0x63c9786b, 0x3f2ae816, 0x1b473502,
+0x85b68cef, 0x57c0189b, 0x41985d99, 0xad1afd5d,
+0xf05fe879, 0x9eb341a3, 0x021085ed, 0xc05e20c8,
+0x07a283c0, 0xeab8bae8, 0x3bfc428d, 0x339456f0,
+0x62e8059e, 0xa0c27cc8, 0xb804a4d4, 0x48f5fd38,
+0x681858c0, 0x3be36db5, 0xab55b800, 0x6cba7d82,
+0x4186f74e, 0xf41b4c4d, 0x8ed1a15b, 0x2c82b386,
+0x44a1480c, 0xf30a4176, 0x3dbbd78d, 0x51e9e4a5,
+0x78e9ea90, 0x45e10701, 0x52f16803, 0x3073486a,
+0x3aebcc50, 0x363bade0, 0x07247640, 0x035cfa52,
+0xb87b2f15, 0x9ab46858, 0xe9204064, 0xc3bddaee,
+0x3b48f84e, 0x760a540d, 0x3b406634, 0xe865331d,
+0xd873f000, 0x36f90a02, 0x1c05daf8, 0x3fe86051,
+0x81308c24, 0x361ff703, 0x81d268be, 0x90920e15,
+0xf0561bf0, 0x8969120d, 0x4ad78c4c, 0x2c451656,
+0xaff053aa, 0x7510bfe0, 0x87878b56, 0xc14ff053,
+0x89c13797, 0x878f03d3, 0xef6c5d05, 0x3b0f789f,
+0xe61ca118, 0x93c0865b, 0x267256c3, 0x437d0477,
+0x8f208290, 0x12771c01, 0x47520672, 0x18fdddea,
+0xce990a77, 0x19014608, 0x2db7887c, 0xea9977f5,
+0x25011f75, 0x4cddddd0, 0x18684803, 0x3a4fe8a9,
+0xb789403a, 0x445b25dd, 0x76480339, 0x7a0d0016,
+0xb8e748d8, 0xdad929be, 0x409c1808, 0xe02d2c3b,
+0x0696df03, 0x458d596c, 0x854dbaff, 0x60849cc5,
+0x00f05f5d, 0x00d91195, 0x20801d03, 0xe2205eac,
+0x0d3103f5, 0xd8f7e852, 0x260ac20d, 0x95991a04,
+0xf0882b14, 0xca098103, 0xba25dac6, 0x297c77d6,
+0x211b7777, 0x305817b9, 0xd7011bfc, 0x47f80f07,
+0x0b16d039, 0xc7e91778, 0xe424348b, 0x153bf80e,
+0x090c73ed, 0x3bc21899, 0xbdb62c3d, 0x3b0eee47,
+0x8b2e0715, 0x63fb0d0f, 0x8c15df91, 0x548d0f3d,
+0x5423ff2a, 0x46c3789c, 0x72d7397c, 0x5ad0870a,
+0x43157320, 0x2ba47b3c, 0xff4a1d9c, 0xd089f7ff,
+0x4908683f, 0xb9301442, 0x5827ef89, 0xde89c278,
+0x0833fb5e, 0x3a4f08ab, 0x341116eb, 0x1095ec55,
+0xd75d3d81, 0x7f0d7fe8, 0x75464c45, 0x250a3549,
+0xfaf50052, 0x00896b42, 0xa16638b1, 0x2d638670,
+0x70ba2a7c, 0x74542977, 0x4b8320cc, 0x88346dd1,
+0x75433408, 0xd61fbf14, 0x3f5780e2, 0x0a740609,
+0x6382474f, 0x7a39e975, 0x6341cb68, 0xa46f99c0,
+0x0bd0e938, 0x7e027a57, 0xc33c415d, 0xd0af068a,
+0xe5fa4e3e, 0xf039a466, 0x2a24507a, 0xcfbaaf0a,
+0x25c4b82c, 0x8504e652, 0x86677d81, 0x4ed62118,
+0x30202108, 0x02c4ec7b, 0xf88952e6, 0x5f0bc04b,
+0x3aa7e230, 0xe703d107, 0x61c6294b, 0x184301a4,
+0xcc2e0141, 0x01f12188, 0x43259e00, 0x7708f4e2,
+0x4f687dc1, 0x9896073b, 0xd2b883c0, 0xf7d29071,
+0xfc1dee61, 0x89047318, 0x90032005, 0x7b8436b4,
+0xf3cac358, 0x6c0513d1, 0x05f83e12, 0x763ccd1e,
+0x50408b07, 0xbf03ffbd, 0x2e6ac519, 0x879c7c09,
+0xee048c3e, 0x53048548, 0x37290070, 0xc06e03d2,
+0xb8a2e5de, 0x2bd0152b, 0x981cd378, 0xf2e85110,
+0x1ee6bff1, 0x75ffd2dc, 0xf21c5832, 0x9236f137,
+0xad203333, 0xdccaa309, 0x3b99622e, 0xf3b92bc2,
+0xd8ec3b16, 0xbe237d10, 0x89afea01, 0x226c2756,
+0x6114dd7c, 0xd196c21e, 0x8d0f4bc5, 0x838ffae9,
+0x8d4f899d, 0x7a837590, 0xd8750440, 0xa817c5e0,
+0x888b5052, 0x8b11594e, 0xf95c3fc1, 0x51bd0e77,
+0xf4dde857, 0xb61c7399, 0x63b900ec, 0x51b78c5c,
+0xeca38061, 0xe3feb8b8, 0x8d62bb81, 0x0504170c,
+0x50488be2, 0xad81f901, 0x040def56, 0xd640708b,
+0x43b1146e, 0x52f86b70, 0x203b5156, 0xb7f9f678,
+0x825c0325, 0xe7ca848b, 0xc3b73cce, 0x580cc607,
+0x14f4171c, 0xf3b2bee4, 0x8c0f9db7, 0x93641774,
+0xc7e425f0, 0xac19a805, 0x2b6c8309, 0xb80974a3,
+0xf84609b8, 0xf029eec1, 0xeea0850f, 0xdba4e30b,
+0x36007d1f, 0x131b0313, 0xee540160, 0x261facf9,
+0x21350ef1, 0xfffb81ce, 0xe041d5f0, 0xbf053f6e,
+0xb93dbe20, 0x9a57f62c, 0x10f91766, 0x379be817,
+0x622e80b2, 0x46e12a31, 0x09b0e215, 0xd001b1ee,
+0x3ca30aa3, 0xd07ba1cc, 0x6a469164, 0x3d5207e0,
+0x78458bc0, 0x14f8e1e8, 0x3005fc69, 0xbf56f7c1,
+0x245ba11c, 0x85e0315b, 0x9d5c83e3, 0x012f2c00,
+0xa01bbfdc, 0x8d5fdac3, 0xd8392285, 0x9eb25576,
+0x91995bab, 0xae575079, 0xa5d98907, 0x3aff06c1,
+0xe25b85e8, 0xbf8df01e, 0x087b033b, 0x140343f6,
+0x03b60f25, 0x030f7f7d, 0x80939e16, 0x0a54021c,
+0x7fb1868d, 0xab7727b1, 0x4d742f8d, 0x1b0c07eb,
+0xc256e030, 0x68673ca1, 0xa4d9802a, 0xa8be56ed,
+0x4163ac0b, 0xe8d5c992, 0x0785017d, 0xd3badcb7,
+0xd2858745, 0x9c5165ae, 0xa8f49f15, 0x35406333,
+0x239f4216, 0x292d7cb8, 0x89900c48, 0x221f245c,
+0x36dc21d9, 0x082a4e75, 0x090cd5be, 0x3208011a,
+0x484f7b10, 0x791b8041, 0x96be00a3, 0x30b262ef,
+0x396efadf, 0x0637c96b, 0xa8b33db1, 0x4d15b109,
+0xe2a563b2, 0x61883572, 0xa41b2b72, 0x8bf3f63e,
+0x33d1310d, 0x75c10919, 0x96f81c53, 0x783b1b18,
+0x07355b77, 0xf142f773, 0x071d6db6, 0xc181d90d,
+0x3b1b1d1f, 0x42c889ec, 0x64193a29, 0x5f63e181,
+0x01884fa9, 0x292dc5d9, 0x6385eb3b, 0xa139de37,
+0x03093420, 0xe7c62953, 0x1276efbe, 0xffd020d4,
+0x20a3cc15, 0x80e24189, 0xc4f041c5, 0x7d9abc10,
+0x909243d5, 0x86b41046, 0xeb2d1023, 0xf373f205,
+0xf412b628, 0xc1f60b04, 0x680860b6, 0x21d0c060,
+0x1afde61f, 0x0a0b6350, 0x5c859d10, 0x98205db7,
+0xf70edb72, 0xb147c00b, 0x4d0605dd, 0xd2f70c0a,
+0x9ae6f611, 0x3881336a, 0x1dd28402, 0x7b04013d,
+0xea81064f, 0x3fda3407, 0x09c2e8b5, 0xe8197567,
+0x991bcf44, 0xc8d89bdc, 0xbf0f7564, 0x03066815,
+0xe15ffd0b, 0xb805491b, 0x1389c755, 0xc10be9f7,
+0xc37dad82, 0xf8220cfb, 0x8dc3291f, 0xad8302be,
+0x6cddadb6, 0x092a07e2, 0xe802a7c3, 0x1b6f57db,
+0x030f8941, 0x0903ca29, 0xc05bd178, 0x18e2b6e6,
+0x800225db, 0xda15e1d7, 0xc83902db, 0xc2294309,
+0xb637141d, 0x5855e37d, 0xab050a79, 0xa1697f77,
+0x70da8704, 0x80fd67a8, 0xe0ff543d, 0x3c74fa31,
+0xf00273e8, 0xcc3be833, 0x0c741bf8, 0x68d04b1b,
+0x03abe304, 0xf058eb95, 0xf40a8917, 0xfdba050b,
+0x83156292, 0xcdff52d1, 0x54b6a53f, 0xce209132,
+0xc54d3611, 0x348e6f52, 0x992deb58, 0xa92f5024,
+0xdb1172a5, 0x8e141df2, 0x1d84417d, 0x9d30c573,
+0x1a0fbdf5, 0x1c7203d8, 0x8511d492, 0xe82ef524,
+0xc22a017d, 0xc1b6d3f4, 0x3980bdac, 0x28972d1e,
+0xe377118a, 0xdf57b82d, 0x38df888a, 0x4341cec2,
+0x207eef19, 0x740e13cf, 0x08018ae6, 0x8ac0be0f,
+0xb9b16d08, 0xd2071513, 0x60ce5bdc, 0x200ed49c,
+0xbf3c0389, 0xcbab1d20, 0x3053d68a, 0x50f4c189,
+0x3984d705, 0x76651218, 0x127012e3, 0x7ffd3cfd,
+0x3fb01617, 0x0122d5b4, 0x2e3a80d9, 0xa51b1b74,
+0xc1207fb7, 0xce0908e6, 0x7e032147, 0xc12717ac,
+0xda08fa3f, 0x1a0410c8, 0xe829c502, 0x421b2714,
+0x00bad843, 0x61abab5d, 0x920a33e1, 0x6858e8b7,
+0x3c30f85b, 0xd0147709, 0xa111b692, 0x0e2ad142,
+0x761391d6, 0x03e2b5ec, 0x0bed2ee4, 0xe912ca89,
+0xfc6eb7cc, 0x12c349bf, 0x60e402eb, 0xc0d964e4,
+0xa80416a8, 0xaa5b96e1, 0x1ace5e02, 0xf6e872bc,
+0x042d4d84, 0xe8c70180, 0x1ff7bb12, 0x17365076,
+0xd1b0e0e8, 0xb1e864e6, 0xb09bda08, 0x60e6dff5,
+0x5bd9ff81, 0xa06d164b, 0x1d89d91b, 0x0afbd7f0,
+0xa1042d6f, 0xe2e80d3e, 0x102332ff, 0x8d9c436e,
+0xbb8a184b, 0x1253e8a8, 0x00fbf7db, 0x98cd2342,
+0x7415fb81, 0xd0acfb83, 0x750dfe30, 0x890ab302,
+0x286d83d8, 0x7b8024d5, 0xb2c0950f, 0x54fe0c12,
+0xa8ee9c3c, 0x89b58d0d, 0xf4eb29fb, 0xded8170d,
+0x81f0f60f, 0x76fff082, 0x90e0bf05, 0x7b66164a,
+0xe011a9e2, 0x910cd79d, 0x059c63ba, 0x0cbe06c5,
+0x22d6b116, 0xbadd1f44, 0xc90f473c, 0xa1d8c9c8,
+0x7494781c, 0x37d04e28, 0xc1825184, 0xebee6db1,
+0x831982b1, 0x04648809, 0x387bb1f0, 0xe0f057b5,
+0x730739d0, 0xb477b108, 0x2c384348, 0xf74b7204,
+0xbd9ea70d, 0x810afe00, 0x1deb1764, 0x54b66cba,
+0xa9d829ec, 0x206c0b16, 0x1ecd4a1e, 0x10724836,
+0xbe85e326, 0x8950b741, 0x4104bcc5, 0x58c9c283,
+0xceb61827, 0x1b76298f, 0x1013c598, 0x90ebda03,
+0x78311508, 0xaf5546e8, 0x6789d068, 0x1fe1812e,
+0xd9e820f0, 0xe85574e8, 0xed85c8c7, 0xfe1b8a40,
+0x90024d0a, 0x080cb000, 0x945ec252, 0x75af47d5,
+0xdc00aa4f, 0xc0763900, 0xfc3d4820, 0x1c22ac0a,
+0x6f1c2ee8, 0x4425d8d3, 0xee00de2f, 0xb2210cd1,
+0x0c86a21d, 0xce016cc4, 0x0cb706c6, 0x07aa1974,
+0x0d1e0111, 0x704605a9, 0xf9a5426d, 0x9b105c07,
+0x8abe17a9, 0x7614353b, 0x4613064c, 0x741d7762,
+0x6c9c1405, 0x2eeb6c0b, 0x6e813a07, 0x29109b88,
+0xcd14b0e8, 0xed57615d, 0x47720c3d, 0x8916eb35,
+0xb1bdf7eb, 0x0a0510b1, 0x3117043b, 0xd1bb2b2b,
+0x0c4f00fb, 0x7c392505, 0x31476c65, 0x561918ac,
+0xe1297c8b, 0xf5de01ed, 0x09b5de18, 0x0bb5ffff,
+0xa3184422, 0xaf6f190e, 0xf0c15c25, 0x2dea1d5e,
+0xdac588f0, 0x6851e02b, 0x118061e2, 0xa33c3522,
+0xa89a8076, 0xa1c5d421, 0xf81702f1, 0x83d9c28c,
+0xf0e2ceea, 0xfd1083b8, 0x72528026, 0x59892b19,
+0x08c023b3, 0x0442ae89, 0xa0dd3f10, 0x5d3e6c94,
+0xb2c2217c, 0x44b60725, 0x3b244108, 0x761d9a51,
+0x084c1889, 0xa2c79210, 0xb777e9ad, 0x31034727,
+0x0d01fc40, 0x9a83a51c, 0x58a868e7, 0x762f8cac,
+0xb56e39eb, 0x7d5dbc04, 0x0d03782a, 0xc746daff,
+0xfbfc422f, 0x01812cf8, 0x8d0d3bd1, 0x3260c8c8,
+0x08730d0d, 0x985162b8, 0x1cb6fe8a, 0xd981e431,
+0x4fc09e21, 0x010e12d4, 0x1c9308db, 0x0160dd7d,
+0x281a2050, 0x1aea5303, 0x2304ec19, 0x085c200c,
+0x03ea4560, 0xe548bbe5, 0xbf604c82, 0x5bb9e822,
+0xdbb42110, 0x930026fc, 0x6d042a37, 0xb8471a0b,
+0x38bb8467, 0x35e0181e, 0xff419e21, 0xf0c6b0f0,
+0x19f51d7e, 0x6035ff69, 0xf32a49aa, 0x1c4dbe29,
+0xec35e823, 0x12516862, 0x02dc96e0, 0x257e8c45,
+0xef9016ee, 0x0bc722f7, 0xc11e5c68, 0x5f3cf61e,
+0xab646a15, 0x0e377834, 0x0b4b7ef9, 0x8c1e6f68,
+0x5fbec374, 0x680b53c0, 0x536d1e7b, 0x02f148ee,
+0x3ee80aa3, 0x3dccb86b, 0x12bd50c2, 0x57f00559,
+0xdd3380bf, 0xe3653c27, 0xbecc0530, 0x3b889c0d,
+0x77ccc131, 0xc01297ac, 0x9e683fc5, 0xc203121e,
+0x34292907, 0x17fffff8, 0xb2d14898, 0xe53ac580,
+0xd378a338, 0x08060581, 0x24326375, 0x6a951b0f,
+0x0a952972, 0x40c37b20, 0x0eb0751b, 0x3c067b24,
+0xfedc523f, 0x8d0b6138, 0x92920e43, 0xd528852b,
+0x217503be, 0xba19061d, 0x9702a1c0, 0x8f8db606,
+0x0520e83e, 0xd52bf45b, 0x183110c4, 0x6c1bac50,
+0x4f01db3c, 0x8b54d337, 0xa30ca545, 0x4759551c,
+0x54b1fdd8, 0x84682268, 0xfdaabb8a, 0x8d5be915,
+0x5514d827, 0x0c25c538, 0xc5b087ad, 0xcb0523c3,
+0x5b122f39, 0xe2c5f609, 0x4707a1bd, 0x23b8261e,
+0x36d2f12c, 0x15461a10, 0xdbfe830a, 0xab4120f3,
+0x062b8305, 0xc3ea4060, 0x27ea27ab, 0xeba2fb4e,
+0xbc424365, 0x061e3c80, 0x05ed8168, 0xf47e055b,
+0xb52d0604, 0x0745d7db, 0x06017e08, 0x7cc6a912,
+0x715d76a8, 0x04150406, 0xf101006c, 0x03237a09,
+0xe8fa3d68, 0x5ece5949, 0x04e39788, 0x2a136068,
+0x2d8e0135, 0x788d101c, 0xd9897e22, 0x8f75b386,
+0x0495043a, 0x49102434, 0xb36f17f8, 0x6ade2601,
+0x1706681c, 0x82441b0f, 0xb442d792, 0xfa36bde1,
+0x33cb002b, 0xa956503c, 0x020ddf41, 0x0d9f10ed,
+0x14bb087f, 0x22ebbe7e, 0x096103b1, 0x474a9a59,
+0x521d580c, 0x54b33c80, 0x53c72df5, 0x8d2420d3,
+0x4506c6f3, 0x7eb6017c, 0x7d0379f6, 0x03006c03,
+0xaa7e43c6, 0xc86c350a, 0x43c7fa24, 0xf8031804,
+0x21067580, 0x53e82488, 0x434dfe55, 0x1c2d7109,
+0xf6a16f68, 0x43e8e027, 0x3b5b1a09, 0x56e24542,
+0x2a442da3, 0x9236555c, 0x518b100e, 0x9b026fd4,
+0xa1a96e88, 0x2f34b211, 0x0a1969e8, 0x8db90377,
+0x4229147e, 0xf867ff2c, 0x5b8b0776, 0x83024708,
+0xdf8614eb, 0xcd8ad75f, 0x82477f35, 0x18c92c58,
+0x44306bda, 0x0602d206, 0x7dee3f17, 0x87aca041,
+0x1a6e661c, 0x28f1defb, 0x5440a366, 0x3c6a5653,
+0x726c5067, 0x11b718bc, 0xe814182d, 0x3c9d7d57,
+0x05087552, 0x6e68750c, 0x560ba244, 0xf60c8b03,
+0x11631849, 0xe854450d, 0x6d158927, 0xf4787f15,
+0x10503b0d, 0x47433475, 0x7e58c1d1, 0xb308aec0,
+0xc2d8c01e, 0x8e5b3dc8, 0x182dea24, 0xb3acab51,
+0xbd0b55ad, 0x450440e1, 0x9806404e, 0x93eb8c05,
+0x1c22ab05, 0x51d60375, 0xfd58e0ec, 0x1cc0337e,
+0x7e812e00, 0xd0c7708c, 0x15352519, 0x02c6a6a8,
+0x0d1a1816, 0xb0e2ac44, 0x0585af67, 0x8649622e,
+0x3ee55aa9, 0x9e84bd2e, 0x8bfd184b, 0xdc62decf,
+0xca0000d5, 0x500646b4, 0x2536fff5, 0x68ddbb47,
+0x1e6863e4, 0x9894e81b, 0x99da0b57, 0x1e401f85,
+0x23c52030, 0x1d8b67bb, 0x07082205, 0xff120224,
+0x3b0b8105, 0x8be93488, 0x36a3a046, 0xb702d7cd,
+0x42007c14, 0x9c093b65, 0x0750dd93, 0x60349736,
+0xab5508ac, 0x6c5a5f8c, 0x9d16e890, 0x3dbb0307,
+0x7609375a, 0x5df5115b, 0x3d3407c7, 0x3f6bc51a,
+0x1e665079, 0xa85bf48a, 0x7e0825b6, 0x120636a0,
+0x1e1f4816, 0x5e006ab6, 0x7dbb8b68, 0xab9a210a,
+0x66727857, 0x9f1639ac, 0xf6e2dbd8, 0x14fa4108,
+0x4bba8f2c, 0x3b1db787, 0x83c1a166, 0x09a303d0,
+0x0388c16d, 0xfd8ec160, 0x1d11d02b, 0x023885ec,
+0xbd40e9bc, 0xb71bdd0d, 0x0ec15923, 0x1718417a,
+0x08f6588d, 0x6125d114, 0x1fc486c2, 0x001c1443,
+0x358817bb, 0x1d74051a, 0x060e7f04, 0xd9ad4cd8,
+0x9e477bf7, 0xc64c2f6e, 0x7406f8fe, 0x0194e92d,
+0x8db11e2a, 0x45862051, 0xe552b63f, 0x230b0dfb,
+0xeb47b6ef, 0x27c6deb6, 0x2867268d, 0x70bad4eb,
+0x056c2aa1, 0xbac3b7f4, 0x2b0edb87, 0xa900e9a8,
+0xc00c2546, 0x3ede251b, 0x7783ad55, 0xfdda395b,
+0x73742e04, 0x68103755, 0x1a588f0f, 0x700dd1f2,
+0x297591b0, 0x077a8052, 0x22013170, 0x8ca48ac2,
+0x775ba1e0, 0xaaa323cf, 0x6dd28aff, 0x2e7b4020,
+0xf16939f0, 0xabe11bb1, 0x6bffcb81, 0x3b69107e,
+0x8f198c6e, 0xc08d0f36, 0x0805854b, 0x9a227bb1,
+0x1703081e, 0x7020687e, 0x81f9e4c4, 0x95212212,
+0x46108f14, 0x008dc091, 0xef11affc, 0xe920ee21,
+0xf6f3db08, 0x42849f6e, 0x75d0393b, 0xa1d3064b,
+0x5ad15882, 0x5e02c1b8, 0x202f3c77, 0x73d6856a,
+0x4f28c1cf, 0x80615806, 0x42da1ac1, 0xc04405fe,
+0xd1829cae, 0x111066c4, 0xf80aa90c, 0xc046de1d,
+0x37a1f6bf, 0x7464ecde, 0x0ecdc6ef, 0x206a4520,
+0xc638e8b1, 0x3ffb4e21, 0x1aeb3f83, 0xf7006a24,
+0xd07b084b, 0x120e16d4, 0x3b807694, 0x2f0c329b,
+0x3c04d83c, 0x680984de, 0xd21f2525, 0x02862585,
+0xf723f184, 0x3701b004, 0x2802b46e, 0xd8013c3c,
+0xaa800270, 0x78c4b583, 0x29ce6e02, 0x871e5b08,
+0x2011b0f4, 0xa8026fb9, 0x2c1b10ce, 0xac152a02,
+0x1bfb640d, 0xe45c15ab, 0x0250b705, 0x463740db,
+0xaa0c4308, 0x01c842c2, 0x009b6d13, 0x0d0290eb,
+0x562167f9, 0x2f10cf8a, 0x37f14d3c, 0x5ca685c6,
+0x0fab3a3d, 0x628dff75, 0x838a66c0, 0xaa2baf73,
+0xc98af12d, 0x3ad17c85, 0xc14f87c0, 0x4353a142,
+0xf3f7f9e8, 0xff6f7c6d, 0xe3008068, 0x15ccea6c,
+0x83b313e3, 0xe964b945, 0x97723546, 0x8c6fb6c5,
+0x5814248a, 0x235835e8, 0x608b7893, 0x1c7bad22,
+0x63125457, 0x22c5b30d, 0x571920c5, 0x0ba0e4c4,
+0x39aee83b, 0x36d8aa85, 0xd9664288, 0xa2a3588b,
+0xa97ea0c1, 0xe83d6ebf, 0xd8f3c906, 0x181f6910,
+0xc17874a3, 0x105cb416, 0x82a3f36b, 0x278bb120,
+0x29c2f007, 0xce05dfe0, 0xba89c17e, 0x7ff869ff,
+0xa09b117e, 0xc9f49451, 0x25057e44, 0x0005ca6c,
+0x18c538d1, 0x3e2842f1, 0x000021e0, 0xa7096aad,
+0xef8efbe4, 0x7eaa33eb, 0x04ec828a, 0x090ecc55,
+0xf021984a, 0xf000883f, 0x2ecbc87b, 0xdb82ec81,
+0x136c8ed4, 0xa297c8a0, 0x19fb04ac, 0xc4df3b7b,
+0x08aead0a, 0xc613aea2, 0xe43b950c, 0x7608b0af,
+0xcf2286dd, 0x2d024072, 0x3d04013c, 0x3f829544,
+0xd8e8063e, 0x538fd83e, 0x2066bd93, 0x880fe827,
+0x8b108318, 0x40031538, 0xdeea12e8, 0x443004a3,
+0x3be06467, 0x20853684, 0x8474a467, 0x8147d822,
+0x16ca51a3, 0xdd8c8cdf, 0x168aa0fc, 0x9c8db338,
+0xba019024, 0x1d67dc25, 0x34a8680d, 0xc6169c27,
+0xda861420, 0x8c499d23, 0xea7425a0, 0xd54104e8,
+0x1ecf0932, 0xbf567332, 0x50284f60, 0x256d8cec,
+0x21513753, 0xf0afedf1, 0xf9582cd0, 0xb16a436a,
+0xf777e8ff, 0x63faa3b8, 0x6a46565f, 0x3e03e824,
+0xf4d7e8c3, 0xd46ff120, 0xdf01c789, 0xc2e805c6,
+0x2c7edba8, 0x3a8961b1, 0x0949b503, 0xd78103ce,
+0xb29a8622, 0x76183f72, 0xe82b7bfb, 0x29fb35a1,
+0xd47f2bc3, 0x01681f15, 0xa245f298, 0x86e81d0f,
+0x050b49df, 0x31483d3a, 0xd60a7402, 0xe8446b96,
+0x488512c0, 0x4c2138a7, 0x96337508, 0xb6101b1f,
+0xa061154e, 0x167f338b, 0x05bb1919, 0x16c2ec2d,
+0x4660683d, 0x43f0264e, 0x43919e51, 0x3a9d61d2,
+0x1dbbaa1f, 0x8a4106d5, 0xec555c24, 0x26081d41,
+0xe2a43850, 0x90943519, 0x0acfed43, 0x4421e241,
+0x02b31acf, 0x5874bbc9, 0xea011017, 0x01e8a605,
+0x0088abe4, 0xf68bd709, 0x661086ca, 0xac1e9df8,
+0x74ac0fd8, 0x86f81245, 0xab00001e, 0x6032603b,
+0xa88e2018, 0xb156dd1b, 0x242cc10d, 0xbe0f53b9,
+0xf6032144, 0x8fe81e67, 0xb6fffff5, 0xb0ea5f18,
+0x8001fc78, 0x7e13a105, 0x427080a9, 0x933db16d,
+0x3ec329a0, 0xf80a41d8, 0xd31b4ac4, 0xb72110c4,
+0x743a33e3, 0x40b31136, 0x02838b36, 0xb7ef9805,
+0x00833803, 0x34586807, 0x8c0ac415, 0xef441d11,
+0xb81d35ea, 0xa1cf1d11, 0xd050340a, 0x03d52602,
+0x4dca934c, 0x03803846, 0x3cb71d99, 0x2bc1f0de,
+0xe7bc59d0, 0x68496a11, 0x16b95be0, 0x243106e4,
+0x389d4904, 0xbec10930, 0x45ce9f02, 0x688ff87d,
+0x1a8e1944, 0x808e0e58, 0x6aa3d613, 0x23f78973,
+0x081b1dfc, 0x35ff0432, 0xf459e82b, 0x213909c8,
+0xc608e235, 0x62b5dc00, 0xddcf8e4c, 0xbb8e0f0b,
+0x4dda237f, 0xb78de822, 0xba0c0304, 0x38e38e39,
+0xd1755ebb, 0x021fe2f7, 0xfe832c26, 0x760b3d7a,
+0x15fc3024, 0x2cccc481, 0xf0b26af0, 0x0c240d1c,
+0x53c07ae0, 0x9b904325, 0x2d5b6d49, 0x88c58aa4,
+0x82c01107, 0x83f67117, 0x124b14e8, 0x14e2553d,
+0xe74e925d, 0x1616413b, 0x23e124ba, 0x21147850,
+0x13c15833, 0x0cf31ae5, 0xb0d49615, 0x11270cd2,
+0xc3e0af7f, 0xd4e8d120, 0xc0d8efb6, 0xc8750b15,
+0x1fb68ba5, 0x9e290742, 0x206aee91, 0x3a80f3e8,
+0xf141729a, 0x245a263c, 0xbfebaef8, 0x2e3b259f,
+0x4ae9cf76, 0x1385ba02, 0x760d1e8d, 0xfcb7d1c1,
+0xb7b5de09, 0xc1c3cf42, 0x0d099ce3, 0xc7bdc309,
+0x110a9609, 0xe9d61d81, 0x0e2551df, 0x8d47cc21,
+0x428a0e6a, 0xb7edc52d, 0x3c45bd0e, 0x2f81770a,
+0x14770e52, 0x028b6ea1, 0x04c13238, 0x89c4fd02,
+0x551c3fb1, 0x8ee65ce8, 0xdb460966, 0x66c74df6,
+0x3f0645f7, 0x284c2c1a, 0x02205140, 0x03c94174,
+0xfa7d1087, 0x84188a03, 0xe90cc528, 0xbf09f777,
+0x458b3322, 0x05dc3d2c, 0xff0e8f32, 0xa837dffb,
+0xef6e7c5d, 0x7410bb14, 0x8dbea13c, 0xd11df7fa,
+0x8d592250, 0xa10e0174, 0x29c189a8, 0x80aeedf9,
+0x6307098d, 0x170eeba4, 0x68581ad8, 0x370a8436,
+0x8afc0efd, 0x47afbc08, 0x1eb52605, 0x6037f82c,
+0x097d8063, 0xce5d7511, 0xf5358b54, 0xcb2c7452,
+0x045c22c6, 0x15c2d686, 0x860b1ac9, 0xec6e8134,
+0x8687b8ee, 0x7e839bfe, 0x892674a4, 0xf61c08d3,
+0x74ebfde3, 0x475d6257, 0xb7eceaf5, 0x9f59c817,
+0x601cce79, 0x4555566a, 0x9a54033a, 0x8e559e13,
+0x066ebc8f, 0x6177582c, 0x6e892cf6, 0x2deefe1f,
+0xd1620de2, 0x4c664dc2, 0xd88627c3, 0x2675e0b1,
+0x1a183056, 0xdb921161, 0x81b90bb6, 0x3f018d7f,
+0x00b389ec, 0xef22b9b3, 0x360ddd0e, 0x02edfb38,
+0x56905d3a, 0x336fdbff, 0x494f19a8, 0xc5835616,
+0xd8cfbf20, 0x1982c046, 0x21bf9279, 0x60c5b741,
+0x0faf31a0, 0xdd18f157, 0x3e2d5766, 0x80e96eec,
+0x6ab015fd, 0xfec43848, 0xfb30a146, 0xdf864fd1,
+0x0d3a00b1, 0xbfded4c0, 0x8a187355, 0xb82c0715,
+0x837a97fa, 0x4108742a, 0xd1384436, 0xf980f372,
+0xb6cf52ef, 0x752445b0, 0xa201431a, 0x54d55709,
+0x06d1541b, 0xd97dba04, 0x851c6f67, 0x0346bc33,
+0x048d1a50, 0x5c102585, 0x13040678, 0x96400119,
+0x5657f61f, 0x86c17f53, 0x5e1db3cd, 0x0819679a,
+0x6efbd343, 0xe4991d3a, 0xd3434190, 0xf3feb00c,
+0x89fb1116, 0x3c8df8f8, 0xa4360285, 0xe24ffe8a,
+0x468ac83d, 0x763c3c02, 0x2e3cb002, 0x7cf56b39,
+0x02d3a857, 0x4722a0c9, 0x62da186a, 0x5caeba23,
+0x78ae704a, 0xad0a7cdc, 0x60570416, 0x1b6957a4,
+0xe0b696a3, 0x53977432, 0x243d8717, 0x44dde460,
+0x08ec09c5, 0x35c83c49, 0x013d8801, 0x5202369f,
+0x1822c15c, 0x7bb9086f, 0xdc27ddb0, 0xe95d04c3,
+0x75015986, 0x5c9f3126, 0x17f003c8, 0x04ee8387,
+0xd0b74407, 0x304df089, 0x6ed23d77, 0x7663f357,
+0x93a0e022, 0x2ca190d6, 0xa8926018, 0x501f6c02,
+0xac400b78, 0x3335c920, 0x15cc3bc7, 0xa34056ff,
+0xf4adb004, 0x351dde96, 0x81b7ba8f, 0x916e34ec,
+0x84e31b82, 0xad52f355, 0x460d54c2, 0x6fa99a1b,
+0x9caedd40, 0x10038aab, 0x4306b80a, 0xd4bf87e9,
+0x800f84ba, 0x0d75cbba, 0x1d89df89, 0x87db2316,
+0x1370e9df, 0x7517343d, 0x22350869, 0x7b633576,
+0x381be025, 0xc83868df, 0x8cfd9d80, 0x34a416e7,
+0x4bec3533, 0x032c73ff, 0x7b802575, 0x117b0301,
+0x3d000002, 0xb53ec1d9, 0x3da9e89c, 0x488501f6,
+0x12f54776, 0xe9e80975, 0xc04d01e6, 0x365f61df,
+0x00000081, 0x35251551, 0xd97b0e75, 0x024c2e2f,
+0xbbe960a3, 0xac5a752a, 0x09903438, 0x60323536,
+0x6effb583, 0xc3263387, 0x1d1cf4ae, 0xa32ebf0c,
+0x3ec3bfa0, 0xa3af006c, 0x01580fe0, 0xffb7f080,
+0x2573ff6d, 0x8d2e7508, 0x6b200273, 0x39f50101,
+0x66960eee, 0x373754b1, 0x87e24dd5, 0xaa556c0b,
+0x03862002, 0x019e4870, 0xe872eefb, 0x353d1ae9,
+0x0c932409, 0x9100f972, 0xb90efe30, 0xaa00dcec,
+0x2b46363f, 0x50ac2f75, 0x0b06e801, 0xb95d53e0,
+0x6a77e031, 0x6a50b2ff, 0x834ceb7d, 0x189b1b25,
+0x854794f2, 0x6e33c080, 0x76059628, 0x8a80b128,
+0x67906db4, 0x0e153bb5, 0xc36b061f, 0x7b1a91df,
+0x3456eb21, 0x1e137581, 0xa708a7d8, 0xeb271e28,
+0xfdb69f3c, 0x2a33721d, 0x2375962b, 0xbd98347f,
+0x52572320, 0xd7631934, 0x03d54b8e, 0x64829b02,
+0xd13d89fd, 0xdba43b81, 0xacc52c05, 0x22eb064f,
+0x487612d0, 0x4a423019, 0x412daace, 0x0d4ac085,
+0x033c5b65, 0x18323399, 0xa7d10437, 0xfd20a091,
+0x11874ed0, 0x23a7811a, 0x8e5494a9, 0x24106409,
+0xd7a10e09, 0xe804c65c, 0x86eb1c17, 0xb9057e07,
+0x885f3807, 0xd36bc0be, 0x3f66e8e3, 0x1c71c7ba,
+0x06fc01c0, 0xf799d1f6, 0x8a3629f9, 0x9104d420,
+0x178ad49b, 0xbfc0c941, 0xd04dfb50, 0x83c8f541,
+0x76015478, 0xb4102b19, 0xc6c53247, 0x715471f7,
+0x8f7fffbb, 0xd519c7ca, 0x68703922, 0x05722a77,
+0x77645839, 0x8b20bd23, 0xc1186efc, 0x35305842,
+0x13644103, 0xa5e86851, 0x72724be0, 0x51227706,
+0x8107e81e, 0xca8c5a81, 0x6da82770, 0xff270761,
+0xa7c41152, 0x0a416cc2, 0x5028a516, 0xb13f2971,
+0x09530d74, 0x136c2840, 0x6446e830, 0x1388c911,
+0x0d059187, 0xbb0c38a3, 0x84fd51a9, 0x00bdcd83,
+0xc5393001, 0x460b1f73, 0x0e2461d0, 0x11eb01e0,
+0xddeffdd6, 0x7239ad7f, 0xbd117760, 0x0a775c5a,
+0x5c582bcd, 0xa860701b, 0x52ac780f, 0xfee6e89d,
+0x58aa1853, 0x144331d1, 0xfd631d45, 0x3074de82,
+0x797bb172, 0x0168cf12, 0x7689f59a, 0xc10fe2d4,
+0x58a39dff, 0x82449d98, 0x59c5b828, 0x5a2c7d74,
+0xb58d20ff, 0x23e1be88, 0x89b6fbff, 0x50d829e8,
+0xeb78224c, 0xe8060174, 0xb216d698, 0x6f437a07,
+0xdd75f339, 0xc5f218d8, 0x8b9d9a2b, 0x33eaca6c,
+0x8c0a3c2c, 0x36e838fe, 0x85dc224c, 0x48483039,
+0xb21ce989, 0xeb80fecd, 0xa1df11ce, 0xad6378f8,
+0x7070721c, 0x1abd2912, 0x01a2b05a, 0x3c0668df,
+0xfe2b3f00, 0xfe94e803, 0xb8977987, 0x68911200,
+0x620b6259, 0x851bea3f, 0xff03e01d, 0x9f644c40,
+0x8aaee8bd, 0x832c8554, 0x80b01c7a, 0x02471edf,
+0xc7784288, 0x46f47442, 0xc3ef7808, 0x90c4a8c5,
+0x1f260a66, 0x780e9f42, 0x95b4aa2d, 0xe0371282,
+0x0ced8c20, 0xde30497a, 0x5f741734, 0x3751de82,
+0x3c61380e, 0xdf0010b9, 0x2ac9ba2a, 0x413c3c38,
+0x76c13928, 0x801e25db, 0x4c412a24, 0xf0456051,
+0xd4ed0aa6, 0x1f1cd283, 0xb763202b, 0xda11d86d,
+0x38408c3d, 0x512ae8d1, 0x800d051d, 0xd0e70974,
+0x77058351, 0xd0293445, 0xf70a1850, 0x37f6e223,
+0x116dbee8, 0x29d54fa8, 0xcfaa7007, 0x04dfb144,
+0xf8832754, 0x2d2274fe, 0xf63a2901, 0x9021682f,
+0xabaec510, 0xaa60d498, 0x6248d891, 0xa05c1067,
+0xcb40644c, 0x8bc43175, 0x91ea408a, 0xda8c513a,
+0x83a18865, 0x688e7ad8, 0xe1945935, 0xed7b1e58,
+0x3a3f439d, 0x93e83fb9, 0x5ed0c2fd, 0xe1d588cd,
+0xb20e4326, 0x323479af, 0xdf87c060, 0x2d747060,
+0x1886a868, 0x1a86ba0d, 0x442c2f16, 0x7aba4885,
+0x6aa9dd97, 0x3c78ab20, 0x423520b3, 0xa0efc8f5,
+0xa854020f, 0x9e64c586, 0xc52ebe10, 0xa1827036,
+0x5e448c8b, 0xcc770f99, 0x0ca10438, 0xeb048773,
+0x8d872040, 0x25902510, 0x0f7cfa73, 0xeb060232,
+0x6bbaac1a, 0xb8a4ee0c, 0x910c7ea4, 0x0ea2920a,
+0x5028d8ef, 0xe7dc8c3f, 0xd8347b44, 0x742bcafe,
+0x722d0405, 0x1b6f08f4, 0xf00c903c, 0x442436a8,
+0xa0cd2024, 0x513a6433, 0x1454cd78, 0x01bd2e88,
+0x203546ea, 0xf278cfbf, 0xc526930b, 0xed77c80f,
+0x7cebd819, 0x289740bf, 0x2b083466, 0xd114157c,
+0xe2a75005, 0x230ee40b, 0x54ab7fe0, 0xe021ac09,
+0x502d6e03, 0xc15149a2, 0x3d17e0eb, 0xa36b95e8,
+0x3effc620, 0x94744902, 0x72381d39, 0xb83589d9,
+0x6a91f797, 0xa3083ec0, 0x9f3097b4, 0x767a4e94,
+0x1718a649, 0x909aba98, 0x1e1e3a20, 0x7cdf8b9c,
+0x4bdd6c1a, 0xba6331c0, 0xfa81d10c, 0x12730524,
+0x56fa8da5, 0x47753239, 0xaf4b0b8b, 0xa47b18dd,
+0xb938eb5c, 0x7ed27ad3, 0xaa5f6f2d, 0x3c2d4645,
+0x051e75c8, 0xb002c86c, 0x75d44fb9, 0x1c503a17,
+0x00c80916, 0xdf7b7ff1, 0xeb08420d, 0x4a39416b,
+0x36d37f10, 0x2aacf442, 0x9caa7255, 0xee906953,
+0x7a46074d, 0x08e9c118, 0x71043070, 0x212864fb,
+0x74945439, 0xa2564b1b, 0xcd1459b4, 0x015f63b1,
+0x0b26cb81, 0x4d1bc159, 0x2c825c18, 0x13002b76,
+0xd6c00b10, 0xa9441e60, 0x11808d1c, 0x78db70dc,
+0x4640851b, 0x1d1c52db, 0x1dcf1bb7, 0x1a58081a,
+0x00197003, 0x1da8dd2b, 0xc60eed1b, 0xdbf6f8e0,
+0x5b7f7423, 0xbc548723, 0x42c6441c, 0x8b19031a,
+0x8618c158, 0x3efae7df, 0xb1622ef4, 0xfe81f3e6,
+0x9187e8fe, 0xa8ef6083, 0x7507c32d, 0x6f4e4913,
+0xe878ce2e, 0x0b0d2396, 0x890f9a51, 0xc0180a59,
+0xb3a94850, 0xe9341729, 0xdfc6f31d, 0xb0118741,
+0x32bc013d, 0xc0e0340f, 0xe8d73df8, 0x6bd30406,
+0x0466bace, 0xba08380a, 0x2a6ae89b, 0x18262057,
+0xdb6054d6, 0x209f7144, 0xf5055022, 0x7bb811bc,
+0x64032cc0, 0x28c00ce8, 0xebb12ef2, 0xd75a920c,
+0xdc5a88aa, 0x6d4b88f8, 0xe5d0d117, 0x9d5b0289,
+0xba59a68b, 0x06426363, 0x57302062, 0x8381f0ed,
+0x3026f2c1, 0xd6771d07, 0x8f148afd, 0x391d146a,
+0xb1183c80, 0x644b875c, 0x1667be0c, 0x4e247f11,
+0x191f56ba, 0xe283e228, 0xa81174fc, 0xe80eded6,
+0xcc0d7401, 0x338bd089, 0xbe86f0f5, 0xfe24c6c1,
+0x05cc7e24, 0x3d6a5317, 0x3a1b740b, 0x50190216,
+0x5d6e1a04, 0x4488685b, 0xb1173639, 0x4f2b1f19,
+0x3d3c6486, 0x284f448a, 0xccdbe10c, 0x4327eb18,
+0xc7849ef0, 0x86904770, 0x4709fc6f, 0x06b0ff81,
+0x82708d42, 0x002c0e4f, 0xeb402df3, 0xa7d506b4,
+0x6b435c43, 0x1d4d7782, 0x8316be66, 0x39c405c8,
+0x1cc26c21, 0x201874b5, 0xec83ac26, 0x3fdd6c80,
+0xa00d1805, 0xb09bbc21, 0x1f053f02, 0x1c401677,
+0x82a0353b, 0xea053014, 0x0e410c23, 0x1c5717f8,
+0x4167cd66, 0x47d3462a, 0x00dc18a6, 0x0d073e35,
+0xf25bebfc, 0x60dc50be, 0xbf06e0a2, 0x578d4175,
+0x8396d80c, 0x3a529f29, 0xa1045498, 0x47e02a9a,
+0x104cf54f, 0x2d59f484, 0x27678907, 0x1beb0329,
+0xd609f04c, 0xd9c30b40, 0x48bf783e, 0x024828c9,
+0x6036f584, 0xa774b185, 0x2bd2e510, 0x5607266c,
+0xc914276a, 0xc581e45e, 0x20fe17d4, 0xecc5428b,
+0x2e9a16c0, 0x36dbe376, 0xea0c3d62, 0xa5f00605,
+0x1f8e6c04, 0x21daf7c2, 0xd0093fc2, 0x861e4fa4,
+0xbe5c3af4, 0xcc580030, 0x0e616c06, 0x54540688,
+0x20d4bb6b, 0x7d0eba55, 0xa928d384, 0x0d3a6603,
+0x1fee289f, 0xc16a8ecd, 0x7f091905, 0xd80c9ec7,
+0x6ab925b1, 0xebc82534, 0xcdd20323, 0xe90c27fe,
+0x14244a88, 0x1ad8efa3, 0xe2dc4e27, 0x3f0c0264,
+0x77605d76, 0xce80bdae, 0x0b2fbe1e, 0xb72e5250,
+0x74326019, 0x58342f0a, 0x817b1ddb, 0x9e74f809,
+0x318d4061, 0x1c2d5052, 0x4601b019, 0xa377075c,
+0x1861c503, 0x888fa772, 0xbbc0e940, 0x03650319,
+0xb323e25a, 0x01817d73, 0xb19ecf18, 0xc3140537,
+0xe2721d10, 0x9044b885, 0x5ed0cd80, 0xba418024,
+0x036832bf, 0x7e0a2c90, 0x85821c14, 0x5aa715be,
+0x6d75ed8c, 0x0c063724, 0x52fb1a3b, 0x20aa15b5,
+0x830a857b, 0x8f151003, 0x2a05c27d, 0x7f3b81d5,
+0x37038b61, 0x8ba97d8a, 0x7510463a, 0x462b2dd2,
+0xdb6fb820, 0x7007764e, 0xa3661693, 0x6dcfc058,
+0x89024d41, 0x80560c15, 0xbc420ed6, 0x50311474,
+0xbf68a918, 0x5389c0f1, 0x148c176e, 0x4cf12b1c,
+0x017adbd5, 0x2c1470cd, 0x7211c8c6, 0xff9001f6,
+0xc8c9040c, 0x1b183245, 0xef833904, 0x20d41d76,
+0x0b43ff01, 0x081cb143, 0x1c0743a5, 0x285d6c20,
+0x763fa702, 0xcb209f10, 0x2625ec16, 0x223e10c4,
+0x044a691c, 0xf608092e, 0x1dba4655, 0x4618dad4,
+0x06060904, 0xc613a87b, 0x841e08b2, 0x131b08bd,
+0x1c708432, 0x32201953, 0x93921127, 0x6c2168d4,
+0xe28fd530, 0xea24b48b, 0xeab724bc, 0x8608d4bb,
+0x0802e810, 0x661bf125, 0xcc14fa85, 0x0788068a,
+0xa051e947, 0x101115eb, 0xd68a1dbe, 0xd30c2d9d,
+0x4613b156, 0xb0f6f61e, 0x090ab0b1, 0x2e40f676,
+0xcc180175, 0x7305fe9e, 0x848b4575, 0x06832b24,
+0x1bdd7b0f, 0x3b80186c, 0x735f6578, 0x14ac8a07,
+0xeb039b63, 0x1a03700f, 0xfa607070, 0x752943ee,
+0x023ae9da, 0x6c7b8c69, 0x28e01a84, 0x23bd1c51,
+0xf6110975, 0x5ac3dbd8, 0x756c0d46, 0xeb461708,
+0x7bfe0c13, 0x7568fd9b, 0x170cb90e, 0x04b1030a,
+0x3c20c891, 0x4eca7578, 0xf97e17d9, 0x91137e1c,
+0xef1211eb, 0x875a1636, 0x7cade2cd, 0xc60e7472,
+0x76f52c45, 0x453000fb, 0x5843d088, 0x85450988,
+0xc379a7c9, 0xfb4f040f, 0x808acfd8, 0x7fbdab2e,
+0xd0096fff, 0x04e9831a, 0x5ce9e879, 0x0f649f01,
+0xfd52a485, 0x71d64620, 0xeb705e17, 0x20bf7715,
+0x79311681, 0x452d7309, 0xb81f70f7, 0xeb894f11,
+0x210ab903, 0x25036e05, 0x8a1c05c8, 0xb7b77003,
+0x55886d5b, 0x6667b870, 0x256cf700, 0x2644b777,
+0x038b79f7, 0x3202fac1, 0xa0b808ff, 0xbe75355d,
+0x39ff558d, 0xc4f86fda, 0x18c31212, 0x026d0abe,
+0x80430b88, 0x4ab7c23d, 0xe9f17712, 0x75404caf,
+0x55fd8c46, 0x9f2c7133, 0x76d88b03, 0xa1e17722,
+0xb6db0fc2, 0xf23f68a1, 0x40a03a1d, 0xc5631255,
+0xbfb784a9, 0x77240b00, 0x64eb4de2, 0x3d75214a,
+0xba854f4d, 0x06538da7, 0x92e52088, 0xb1926004,
+0x4368e30f, 0x563b8641, 0xcc6ba5c2, 0x63224172,
+0xe6f13075, 0xeb5d1fde, 0x07068a06, 0x73eb9094,
+0x3936f125, 0xd12a3f85, 0x46db7224, 0xf80661f6,
+0x671885e7, 0x07c6032e, 0x2d80c1dc, 0x842bf8f6,
+0xd46c270e, 0x17b80424, 0x13aa9ec0, 0xc4e82c31,
+0x585eb4fc, 0x1b304447, 0x0a19aab8, 0x732b4146,
+0xde206dcb, 0x1b5c569e, 0xcdb200b0, 0xfa378a30,
+0x1693be97, 0xae844647, 0x74d28426, 0xd1d03822,
+0xef97c188, 0x03c6137f, 0x8820488d, 0xf6d188c8,
+0xca4a0bc2, 0xfa66a038, 0x4b034f52, 0x02cdd075,
+0xbb15260f, 0xed5f5eb5, 0x2b6360ee, 0x028acbfe,
+0x41018842, 0x5b6df6ed, 0xa92c3fda, 0xde89e6c6,
+0x8ffa834a, 0x15bdd46e, 0x038820ce, 0xbdf02343,
+0x82975e5b, 0x543de9a6, 0x742ed34c, 0x9af6b006,
+0xfa344282, 0xea484b24, 0x5e1722be, 0xd6484c5f,
+0x005b036b, 0x4e2c2719, 0xd2ec3d2c, 0x4912741f,
+0x7ec60575, 0x75110aeb, 0xc16fb6ee, 0x56a16382,
+0x1a2ac388, 0xc558db18, 0xa527d7c2, 0x5fc37ef0,
+0xbf068055, 0x20103884, 0x246d683f, 0x40fb7928,
+0x3008200f, 0x5c30233b, 0xfbb121c2, 0xdf00807f,
+0xd1f7aef2, 0x19048d49, 0x5c480a35, 0x6fb83040,
+0x45daf773, 0x806dec68, 0x53c88939, 0xb1bf11f2,
+0x20058e12, 0xf461050b, 0x2c684929, 0x1047c888,
+0xdc11371f, 0x8925b800, 0x8a136cf2, 0x3dedfb08,
+0x740a3af6, 0xebf6db08, 0xd84d0605, 0x404309eb,
+0x10e0833b, 0xd889dbfb, 0xaccf59d1, 0x72d1da23,
+0x0c62da89, 0xd8d8d837, 0xe72b1164, 0xb36b5b93,
+0x322fb7e8, 0x8b0ff985, 0x0335f41d, 0x0d502dc8,
+0x708640fa, 0xb57778d1, 0x4dc4c5ad, 0x05c711c1,
+0x3dd0231f, 0x1eeb0484, 0x089d8c21, 0x0133e0ab,
+0x67047198, 0xaf622a13, 0x7b8d26a3, 0xb0e876c9,
+0x3019531e, 0x48445734, 0x892f2c76, 0xc2f0ba06,
+0x61570461, 0xf0ae0c13, 0xbc287b02, 0x5b0c1a0b,
+0x2c9b0424, 0x08243746, 0x30c152d6, 0xa1689426,
+0xc6db4570, 0x02139811, 0x98c56e01, 0x43e55f84,
+0xef754e41, 0x1a40542f, 0x90a36e0a, 0xb4210fe2,
+0x8b80c857, 0x78a595b8, 0xa1a6f175, 0x6e7c2069,
+0x1829e55c, 0xa3b0f1e7, 0xbacd891d, 0x88eb3a74,
+0xffa74034, 0xce890694, 0x187ce939, 0x4b85554e,
+0x24a88c5d, 0xd2d2f6a8, 0x68a458ee, 0x84e87dc2,
+0x631fa657, 0x6649302b, 0x8a20172b, 0x41420142,
+0x38bfbc68, 0x0bebd089, 0x19b4b216, 0x3f140d14,
+0xaf8acf0c, 0x77010fe8, 0xc03d8372, 0x07e2168f,
+0x02ad0cb9, 0x3d8053eb, 0xa08160ff, 0x53756703,
+0x06dc45d4, 0x331157ab, 0x26409700, 0xc82c8f78,
+0x8416a301, 0x7d662ac1, 0xd97b0a8d, 0xb00c5120,
+0x5d025414, 0x8db2baae, 0x305f4076, 0x76e14480,
+0x041ae845, 0x105524aa, 0x51600c28, 0xbbe80924,
+0xedb63801, 0x2db8230d, 0x79e807b8, 0x682141a7,
+0x7dbbc1fe, 0xe80957df, 0xeb0bfeff, 0x08ff8414,
+0x12b73e80, 0xa80d0a4e, 0xbb75d889, 0x185b4062,
+0xcbe4bb60, 0x0dc822bf, 0x9549d0e0, 0xb441b1ff,
+0x9d0699a5, 0x0dfc5710, 0x7c964280, 0x08eac166,
+0xda17c589, 0x0ad958f8, 0x1e1a5338, 0x31741838,
+0xc03b6c62, 0x068847c7, 0x0ac7ad18, 0x4c830942,
+0xb5bcae0e, 0x3b1b4216, 0x88e88932, 0x60620b55,
+0x620000c5, 0xd2072362, 0x03177d05, 0x2765850a,
+0x08300873, 0xc2382d5b, 0xe9d815b6, 0xbb5b2dfe,
+0x4ae2012d, 0x82248d26, 0x1b089b08, 0x2d454773,
+0x16d95a11, 0xee2d175b, 0x6fb03b23, 0xffcf0b47,
+0x681037ff, 0xc9520105, 0x8848fddc, 0x69f64c83,
+0xe90c2ead, 0x553d1bcd, 0x0a43efbf, 0xd0b153d2,
+0xe88fe00d, 0x032bc189, 0xee798366, 0xba08b1d8,
+0x796c270f, 0x462aa2e9, 0x41e47345, 0xc6025104,
+0xe3b83687, 0xba090d2d, 0x7b80c029, 0x1515f403,
+0x4de93bb9, 0xc2220406, 0xbaec152b, 0x34114a08,
+0x067f0417, 0x5472d00c, 0xda86140e, 0xb728e06e,
+0xaf28eb43, 0xff340a08, 0xb82d756e, 0xb8260606,
+0xdc1f8035, 0x3a0846df, 0xc63c0c84, 0xeb0ee929,
+0xf8225c0c, 0x16eb8e65, 0xa23a5156, 0x23c17fcd,
+0xf1e92225, 0x070300c7, 0x34050984, 0x9cfca96d,
+0x32094d05, 0xb0029c2c, 0x5f50b14d, 0xfad54f1c,
+0x422c1023, 0x545b07ec, 0x0ae4af4b, 0x4a5e548b,
+0x04c0a174, 0xbc288a99, 0xb3705810, 0x0b2c75a5,
+0x07dc263e, 0xc1a36150, 0x12807343, 0x06ec59b5,
+0x8b818500, 0xd972cd70, 0x0c852ad8, 0xa1161c13,
+0xa01df758, 0x2c453518, 0x163f2e39, 0x30f195b2,
+0xa6290001, 0xb01c600e, 0xfb85c445, 0x7d952391,
+0xcc79195b, 0x7267ffff, 0x26b16e32, 0x35355fbe,
+0xa37d77fb, 0x3e879be2, 0x8d4e757e, 0x6bae244e,
+0x022a6c2c, 0xd1598b1b, 0x23560703, 0x05069a16,
+0x3bff24f9, 0xdd0a17e1, 0x24880807, 0xc11a5139,
+0xae4108e2, 0x41b52bad, 0x0b208a19, 0xdd630934,
+0x0abe809e, 0x0f790dfc, 0x2329eb05, 0x53ddd6c0,
+0x501f7502, 0xcd031003, 0xd7c35c07, 0x09080374,
+0x04cd0b2a, 0x9017a41e, 0x27492d10, 0x07653057,
+0x37fffa85, 0xb3c137c2, 0x8690496a, 0x1209f5b0,
+0x83079680, 0x349880d8, 0x1a7bab16, 0x02726c45,
+0x04611007, 0xde980049, 0x041830ed, 0x0ec36b62,
+0x149fa2a7, 0x6b6b0f9b, 0x000001c0, 0x1014058b,
+0xbbb79c3e, 0x0e6ea7a7, 0x02b00f03, 0x7f04513d,
+0xd00e800a, 0xe913574f, 0x210ff672, 0x3704d9a2,
+0xca6bc564, 0x5460d9cc, 0xb6101822, 0xe4118ecf,
+0x4de9104e, 0xc3010268, 0x336c82b6, 0x33375642,
+0x6c548714, 0xeadee94d, 0x4d66e906, 0xa939152d,
+0x30581606, 0xeb40c16e, 0x08da24a1, 0x77c78d7d,
+0xd70eb506, 0xf1ff12c1, 0xfc8b1c54, 0xd49005f3,
+0xd9682b47, 0x1210f117, 0xb231004d, 0x7e160c01,
+0xa5e1564d, 0x2d3d14f1, 0xebc21f74, 0x7f06c7df,
+0x0d003d09, 0x3d1beb0b, 0xdd4a5b3d, 0x12ebe182,
+0x0510b82e, 0x28b5c002, 0x0305e876, 0x76898ef8,
+0xaf7fb0e1, 0xf6ece856, 0xeb5695e8, 0xb070fd44,
+0xc9957e08, 0x2d5dffff, 0x49d984c9, 0x000d3d87,
+0x1c061078, 0x62da1256, 0x710a950e, 0x576460c0,
+0x63f82eba, 0x5681c080, 0x4a85ad04, 0xf8d535da,
+0xf7ff6a3c, 0xbe8eb735, 0x0266dd60, 0x3b778bf8,
+0x362aca05, 0x1a743e11, 0x78d88364, 0x1ba31c5d,
+0x62b60aab, 0x3082ee10, 0xa1188a83, 0xadb11e83,
+0x731154e8, 0x49b74413, 0x00080891, 0xa0ac7602,
+0xf4c01460, 0x0376adcd, 0x613b073d, 0x89660e36,
+0xc10fe83c, 0x669eb822, 0x1b507854, 0x9a6b1ea3,
+0x90891218, 0x0e1ce394, 0x0608c402, 0x6574aa98,
+0x246cf09d, 0xf5ff9c05, 0x6078904e, 0x5f5b243d,
+0x4af6fa8a, 0x034535d2, 0xcc2d2cb2, 0x4849d042,
+0x2800a032, 0x0ec3f788, 0x75abba81, 0x80828d31,
+0x86bc44fb, 0xdcad8247, 0x7e099882, 0x0c3aa984,
+0x90820fff, 0x80b30684, 0x681b8bd7, 0x08f0d84a,
+0xccdbc650, 0xa7403e18, 0x7661910a, 0x0e1a242c,
+0xf9fd935a, 0x09260204, 0x04f306e8, 0xb905bb29,
+0xf451ff2a, 0x0980e6f5, 0xac607600, 0x72216229,
+0xd438dd83, 0x58a91b1c, 0xa33b3da2, 0x87623973,
+0x7439457d, 0xe0a78b2b, 0x26cdba4b, 0x53f3f35d,
+0x08949801, 0xfca47456, 0x425c001c, 0x14b01847,
+0xf5986174, 0x4021f2fc, 0x5efa7953, 0xd1165302,
+0x559d362d, 0xf58686a0, 0x58458f18, 0x968b7cdf,
+0x83081282, 0x1df06131, 0xda434094, 0xb8683c05,
+0xcb24e478, 0x1525c84e, 0x33199f0c, 0x1a4a6306,
+0x76f4ff16, 0xb2ec2d79, 0x986a0001, 0x077a600e,
+0x7cb77986, 0x24e9140b, 0x0ca41bb0, 0x8c13c716,
+0x8e42361d, 0x3c1b8903, 0x8a10ae8b, 0xb620898d,
+0xe91a7960, 0x9b1899ca, 0x6b607e08, 0x3b985725,
+0xea240924, 0x6a762905, 0x40280b18, 0x45c96162,
+0x9016b143, 0x119a029f, 0x6b1a9450, 0x8d3b1551,
+0x222b40c2, 0x261863ff, 0x942f011a, 0xc40148f7,
+0x24c41162, 0xbe2fc098, 0x478b686b, 0x018b840c,
+0xfdb81d45, 0xf01e6f95, 0x47b0ee83, 0xde9ead10,
+0x7630c071, 0xf0390ebb, 0xa3064173, 0x6aa9142b,
+0xcf121398, 0x3901f85d, 0x518d5610, 0x81555208,
+0xdd587df1, 0x0e73af44, 0x5bf0bbbe, 0x3a42c05e,
+0xf335c421, 0x08aa5196, 0x782a7823, 0xea23a02a,
+0x7ac7c352, 0x5304d5fb, 0x3102a494, 0x09eac011,
+0x4f00ba70, 0x20bf5b08, 0x26c508bb, 0xb7f2d95b,
+0xbe231c23, 0x460b8de9, 0xc789de0a, 0x5fec43aa,
+0x15bf05de, 0x0f1d1108, 0x6a66d1be, 0xc34e5ec6,
+0xd3fb811c, 0xbc183142, 0xebcd377e, 0xc81ba0b1,
+0x56e846d9, 0x6d100e0e, 0x450c8b68, 0x40f09481,
+0x387d534b, 0xc71e8d53, 0x0adc109a, 0xc7bc85c8,
+0x10559149, 0xd0014446, 0xb450aef4, 0xb72876a4,
+0x412ece46, 0xbea8fce0, 0x928a05db, 0x3911908d,
+0x11c7bb25, 0xfcc38128, 0xa1f1dbfd, 0x532185ba,
+0x88020324, 0x62eb42a2, 0x0306e701, 0x1161a144,
+0x34e1df4d, 0x6a84160f, 0x10077b80, 0xd0596aa1,
+0xa11423c8, 0x75d51874, 0x7768fd11, 0x2cd6ef9e,
+0x1486b144, 0xe644145e, 0xe81876e7, 0x00151984,
+0xab1b9104, 0x3a8d5a75, 0x9e186b87, 0xe412da0a,
+0x7e41480a, 0xdc54f444, 0x432d757a, 0xd8624775,
+0x0e08d485, 0xc10646df, 0x3474aadd, 0xecb91f04,
+0x37778f52, 0x0608a4e4, 0xfa81040b, 0x5281ed1c,
+0x562a73c1, 0xb0a76d53, 0xeefdc482, 0xf0b04997,
+0x18075b7c, 0x86073d84, 0xd2d67c2e, 0x4e7f76db,
+0x092d218e, 0x673982fa, 0x9a637c15, 0x012be823,
+0x7c60d076, 0x0d4b1f6c, 0x03ed99d7, 0x40b05297,
+0x6312586a, 0xbb0211f6, 0x1d03f389, 0x05bb89c0,
+0x974a510b, 0x94a16401, 0x1686eeb8, 0x25e89807,
+0x5ef911bc, 0x2dd9afbe, 0xe1048b6e, 0xd713b2a6,
+0x90543909, 0xe82aeea0, 0xa0e8be13, 0x3f16dd0c,
+0x1c0e48d6, 0x99d8e405, 0x945550d4, 0xb2f02551,
+0xf016beb8, 0xdcefbbbf, 0x345091d8, 0x11127358,
+0x084c19f0, 0xc0833d83, 0xd85b3860, 0x1416a781,
+0x598a1429, 0x3b7148c1, 0x66dd88ad, 0x2f021afc,
+0x231012f8, 0x02d8f3db, 0xc48f0800, 0x14110800,
+0x8d19c408, 0xb3567fd1, 0xb77fbcb1, 0x66a8d6c8,
+0x08810dcb, 0xa3f7898f, 0x9201a811, 0x039cd25f,
+0x56d9ea15, 0x015005d1, 0x2d8c8c08, 0xe92c5b63,
+0x0708a511, 0x36d8f6ad, 0x0d7328f2, 0x0d16ff0d,
+0x2304297f, 0xf2a5d8b7, 0x080dc184, 0xf20baa8c,
+0x116d8add, 0x84ef08c0, 0x2a3c36c5, 0x0f36ecf2,
+0x0801e40d, 0xa15fcd8c, 0xe055b6c6, 0x284d1108,
+0x731edb13, 0xc3a73023, 0x04577f30, 0x6dce0d20,
+0x201e647b, 0x1404207f, 0xd801ee0d, 0x08dc8db7,
+0x1115d48c, 0x24d73bed, 0xdb60f3db, 0x08120d22,
+0x2301f88c, 0xeb1a1111, 0x0825236e, 0xae280219,
+0xfb64710d, 0x084784da, 0x2d0d32c4, 0x5b91a235,
+0x33168c08, 0xb7d8cb15, 0x2e70088c, 0x750d7736,
+0xa8eb064a, 0x73180866, 0xb5735b1b, 0x7612c6db,
+0x3d08390d, 0xa80aa54d, 0xf8352c8f, 0xdce85202,
+0xc3c9c8ed, 0x103b07c6, 0x202aee56, 0x73720c87,
+0x0e419019, 0xad08c872, 0x3c9c01f7, 0xe6e49064,
+0x72d5ef01, 0x2b8720c8, 0xa47b48c4, 0x0db30ccd,
+0xe904b830, 0x23201ea5, 0xf02e0f27, 0x0c8c7094,
+0x6e86c872, 0x20c8f875, 0x0d678363, 0x1c8359f9,
+0x4bfac836, 0xf23af83a, 0x1e639390, 0x232cf125,
+0x1c8321f1, 0xc7101b76, 0xf20e4e0a, 0xf9f213e4,
+0xe8f3fd00, 0x43c9c879, 0x0fd7f41a, 0x0e4190f5,
+0xb52cc639, 0xf2721c83, 0xdca4f64e, 0xe4e43993,
+0x82f76521, 0x8e4e4690, 0x0d74eb3d, 0xb666f871,
+0x4191c9c8, 0x4af96858, 0xc832393b, 0xfabe3c94,
+0x0b6c0a2e, 0xc219609c, 0x1d0a2395, 0x83639307,
+0xfb1e2318, 0x8288c5b2, 0xdc000240, 0x5520c512,
+0xdfa804e3, 0x44743aee, 0x59e81959, 0xff0e3183,
+0x802dfad6, 0xe8fceead, 0xc589097e, 0x07f841b6,
+0xfa5d044b, 0xeb077458, 0xdd118820, 0x38eb2ba0,
+0xd4322357, 0x5b8b6828, 0xc4087412, 0x14761d7b,
+0x1e6c6790, 0x0d043d38, 0x8a17164a, 0xc88da0ed,
+0xa30be672, 0xdb0eb108, 0x4885f455, 0x8182d77a,
+0x57eda2fc, 0x027209ef, 0x88aee430, 0x97c4550a,
+0xa624d91c, 0x159a093c, 0xbf24c808, 0x325c930a,
+0x5c0a3d90, 0x2c8fd881, 0x4c8a3c20, 0xc8401c24,
+0x0b1c9724, 0x90c9401b, 0x3a772c85, 0x0e40260c,
+0x0581e079, 0x9272120d, 0x81caa54b, 0x0c7e3454,
+0x502468dc, 0x6bc84943, 0x58dbd49c, 0x632fa3c6,
+0x20410d47, 0xe8b64c82, 0xa88e3b69, 0xa9142c15,
+0x46fcd82f, 0x9e03b744, 0x203cfa81, 0xfa89d4b9,
+0x6fcd6030, 0x9250dfe4, 0xca180648, 0x42d82a83,
+0xed164468, 0x36d50bc1, 0x29260e02, 0x05f5b8d3,
+0xf7e642aa, 0x820fd839, 0x3ff8ad89, 0x5f3b8109,
+0x755f3233, 0x2009766a, 0xba88cf5b, 0xdeb16174,
+0x0ca87dc2, 0xdbff1558, 0x7c074213, 0x75c984f8,
+0x087b804a, 0x22dbf163, 0x022953dc, 0xe3ef7f94,
+0x9a2b58fe, 0x756db9d1, 0x047b8123, 0xf7c860ff,
+0x12765fed, 0xcb23dca3, 0x25bc10ac, 0x7525a3e0,
+0x9bb41c83, 0x8387a245, 0x3e02d678, 0x7441cfd0,
+0xe4d4e805, 0x2a055b08, 0x83303276, 0x02bce23d,
+0x22b166c6, 0x53620d29, 0xeb06a04d, 0x1362681b,
+0xe22c1f61, 0xd8f1b057, 0x61e4c301, 0x2c01df88,
+0xb5fd7b10, 0xb261e601, 0x8a9b15b0, 0x43e6086e,
+0xc942e6b5, 0xa1322575, 0x254210b7, 0xc0018e2a,
+0x4d056982, 0xc51bc3c3, 0x0445ee02, 0x7d39c1e8,
+0x8b87a5de, 0x83460870, 0x3edb6275, 0xd002d5a0,
+0xc2028208, 0x035c16d6, 0x033c0889, 0xda150410,
+0xa2020c54, 0xb0774b83, 0x3d448c15, 0xc5020407,
+0x824486ce, 0xdb3bd241, 0x3eff6602, 0x624dd3ba,
+0xa0602810, 0xed452128, 0xbfdd5706, 0xdfedfc60,
+0x03c4e284, 0xb0071239, 0x61090e1f, 0x6499e009,
+0xea680c16, 0x174c1400, 0x00a76a08, 0x2a0ae013,
+0x23052507, 0x092a015d, 0xa7c77404, 0x0b4cca78,
+0x78689d0a, 0x061448ad, 0x2241f0c7, 0x06c076c0,
+0x84a30180, 0xb0880513, 0x40c9926e, 0x0609908c,
+0xe4c05340, 0xa6af9419, 0x2aa4ec64, 0xa440a06a,
+0x9bb114ec, 0x028c09a8, 0xc9de9d9d, 0xb0405973,
+0xe322686e, 0xd53454bb, 0x16bc6843, 0x0761da57,
+0xc9323a29, 0x3b4f324c, 0x50dd566c, 0x482a0209,
+0x649d1254, 0x318381ac, 0x2a326460, 0xae986758,
+0x3103091e, 0x5be7cf24, 0x6c3171a9, 0xba74e3f3,
+0x78dd1548, 0x09c90709, 0xe79e4601, 0x680731c1,
+0x88c18077, 0x49ba1360, 0x1c80098c, 0x090af96d,
+0x3422f6a9, 0x8700068c, 0x1833141c, 0x137ea09d,
+0x5b331c1e, 0xc3680166, 0x8bbbba31, 0x31332068,
+0x6808d05a, 0xf00130de, 0xe8f168c3, 0x2036ae29,
+0xe770409c, 0x28f60991, 0xce819ee8, 0x045f2d20,
+0xf54ef16c, 0x7c290320, 0x87d5560d, 0x849ce8af,
+0xf10118f7, 0xef1a23b2, 0x82f01b84, 0x920f5dd5,
+0x1b8c73f9, 0xa8eb588d, 0xe8c33e9a, 0x114b5b03,
+0x24367dbf, 0x4b779d88, 0xdb475475, 0xda3a4d2d,
+0x9eb377fc, 0x0ed8e820, 0x9d7d887b, 0x004ef299,
+0x02841000, 0x603776c2, 0x44c46670, 0x00008a07,
+0x7e46409e, 0x687445e4, 0x013500ff, 0xffb03801,
+0xdc057585, 0xde001161, 0x03efbead, 0xa5ffff5d,
+0x035e00ee, 0x203c3401, 0x43455850, 0x6e65696c,
+0x72413a74, 0x5bff6863, 0x303adff7, 0x4e553a00,
+0x320a4944, 0x0d373102, 0x2b0c0301, 0x85e0803c,
+0x834406fd, 0x87868584, 0x0336035f, 0xee1ec580,
+0x0e6b0532, 0x3d812c09, 0x5fdf6c11, 0x03b2ab64,
+0x062b5f73, 0xca2c2747, 0xa463db62, 0xfff06e46,
+0x415441ff, 0x4e203a4c, 0x6572206f, 0x6d2d6c61,
+0x2065646f, 0x6b633073, 0x96ebbff7, 0x00412197,
+0x2b564e03, 0x6e614300, 0x23746f6e, 0x365733b7,
+0x24147620, 0x72502521, 0x6fdbfed6, 0x6f636f17,
+0x4444736c, 0x20504348, 0x04544654, 0xadffb716,
+0x63696eff, 0x73696400, 0x6f6cc06b, 0x00797070,
+0x0a202d20, 0xb9bf6c75, 0xfa6c8d6f, 0x31006665,
+0x72030230, 0x72652078, 0x6fdbfd9f, 0x2520723f,
+0x72325868, 0x31386c74, 0x33073932, 0xbec36239,
+0x663f6ffd, 0x38333565, 0x636d7300, 0x2d313116,
+0x85ed0931, 0x65186ed7, 0x02237d6c, 0x40746464,
+0xb177edbb, 0x362e0b6e, 0x78743039, 0xe0656864,
+0x6c7f7630, 0x1e78b5a1, 0x1d640170, 0x33776e66,
+0x35bd3036, 0x1e33b58f, 0x30303809, 0x656e9b63,
+0x8dd8fb2d, 0x54f16f82, 0x6e55074c, 0xf6b27573,
+0x955b6f12, 0x41203974, 0x25229b50, 0xb6de0163,
+0x9f22db77, 0x20676857, 0x787d6e69, 0x62613c0c,
+0xeb7ffb6e, 0x74083e21, 0x00707466, 0x002f2f3a,
+0x698c6f4c, 0xbde2ab20, 0x207325ec, 0x0e3a400b,
+0xab580827, 0x266f4270, 0x9b7523eb, 0x72465edb,
+0x3a506973, 0x8764440b, 0xf0ad6d0a, 0x6c6998bf,
+0x207a7365, 0x666d203e, 0xff280f07, 0x37c0db61,
+0x20002e90, 0x61726765, 0x4268206d, 0xa40ad0a1,
+0xaf712f7e, 0xf77b4334, 0x22676962, 0x2949424e,
+0xb6059005, 0x4a22d0f6, 0x5e61a74f, 0x5dcd69fa,
+0x69bedf76, 0x5867616d, 0x7065733c, 0x5fed7bac,
+0x7469ee84, 0xf170435f, 0x6f662008, 0xb99bd175,
+0x1a2eb5d6, 0x9541530f, 0x458f1011, 0x4d0a7bb8,
+0x00409c65, 0x200ad72c, 0xd8302628, 0x290675c1,
+0x521de512, 0xbb070b6b, 0x0b79618c, 0x77346147,
+0x6bb70c0d, 0x2145c285, 0x6c20a975, 0xcdedb9f4,
+0x65db205e, 0x966d1b09, 0xadb16b5b, 0xaf73a025,
+0x6135f397, 0xb6f1c310, 0x35748e72, 0xbb5a4656,
+0x7716bb11, 0x6d5f3d6e, 0xad5b1670, 0x61dee851,
+0x38747562, 0x0e739073, 0xb5b0b86b, 0x6b2d0674,
+0xa2657a46, 0xdb6d3364, 0x33503182, 0x2a292528,
+0x6085d2ec, 0x4346dc1f, 0x1e3238c9, 0xe925f68e,
+0x49901b00, 0x6f864634, 0x73da1b0d, 0x63060a88,
+0xf9766965, 0x1f0c1bba, 0x8cb462e3, 0x733a756e,
+0xadda9564, 0x09b2b51d, 0x50304455, 0xadd9c629,
+0x6d755827, 0x41ea0a4f, 0xec10bf1c, 0x20077f64,
+0x6c257830, 0xad0fc228, 0x2dd65415, 0x726f66f4,
+0xa3259690, 0x220ad161, 0x7374a111, 0x6e6b3117,
+0x7665f5f0, 0xadb6393c, 0x7079b0d0, 0x588b4a23,
+0xe1277927, 0x52f6b7b1, 0x666f5f89, 0x72756c20,
+0x73614e6c, 0x6e14da05, 0x3f6e4419, 0x5ae70eb1,
+0x2cc4b9c3, 0xdb275a62, 0x6173dcc6, 0x075b5bb3,
+0x6370175d, 0x90d6fc2f, 0x33320669, 0x19363534,
+0x1a424139, 0x43f75b4b, 0xe6464544, 0x8e68032e,
+0xba3cb43a, 0xcb58d687, 0x5f2f0001, 0x6fb82839,
+0x6f205b7c, 0x3233534f, 0x6dfb7ea4, 0x278161df,
+0x2e342e35, 0x18435b32, 0x8d360000, 0x202ec42f,
+0x50478618, 0xc26a294c, 0x74a54d61, 0x1c652425,
+0x2b570b2e, 0x44bd8dbd, 0xcc5605af, 0xc28770e8,
+0x0d098720, 0x74fb20d2, 0x81f9e08b, 0x8a784500,
+0x6d0e3a73, 0xc2046c3b, 0x23bfac6f, 0xc36ceea3,
+0x72690d1b, 0x202cea71, 0xe0d52112, 0x7642c378,
+0x2d73a570, 0xd5307564, 0x7ed8c478, 0x64864300,
+0x61af1a32, 0x20b3c3ac, 0x9a896f88, 0xd0b8d0a1,
+0x616649d6, 0xd76b4d91, 0x2486eb70, 0x65d74d4f,
+0x6074f167, 0xdadb59b4, 0x67091f78, 0x42210b28,
+0x8a6dc117, 0x4bd30a63, 0x16dbd764, 0x707285a4,
+0x42741c97, 0x5d62326e, 0x478d5a73, 0xde24ca0a,
+0x1c533b18, 0xc63d213f, 0xc30b8075, 0x3019c25a,
+0x826ca573, 0xd4738281, 0xe0663004, 0xdc12580a,
+0x1d32cb61, 0x1d906916, 0x2ed83333, 0x16d612c5,
+0x222f3093, 0x5e2d2695, 0x82927e65, 0x3d75cdae,
+0xd76f7a43, 0x6a9c67cf, 0x38787583, 0xbb6f7589,
+0x507342b6, 0xb42e1f4b, 0xb5216230, 0x6b0e1b63,
+0x61621f0a, 0xc520435c, 0x5407b42e, 0xdc696e67,
+0x8d0b78db, 0x3e77c184, 0x042f32b9, 0x220058c3,
+0x8ca88376, 0x2453a775, 0xb764b8b0, 0xd1f0b752,
+0xb7e17638, 0xac783a5f, 0x050ce9a5, 0x78c53772,
+0x7a486b78, 0x0c6f74d9, 0x736f000a, 0xf03866d2,
+0x49c2283a, 0xb0622007, 0x786ed229, 0xb279780d,
+0xdee72578, 0x65757186, 0x24df49d1, 0x66d88442,
+0x73638a2b, 0x58111e79, 0x64158572, 0xd88c2042,
+0x008960d6, 0x832c4531, 0x0d13dc67, 0x618fb611,
+0x1270d658, 0x05074785, 0x2072eaaf, 0xc2b0df26,
+0x2056678e, 0xd0873679, 0x9a1ee74f, 0x77130770,
+0xa48a7670, 0x0db56ed1, 0xd8467449, 0x3a196666,
+0xc2b07b92, 0x9e795741, 0x619a0000, 0x4227c9eb,
+0x2ddd4f4f, 0x20ce3300, 0x46370f02, 0x6ee1003c,
+0x0339b96b, 0x36816c49, 0x6ecb6234, 0x42bb7dee,
+0x30195241, 0x043a7838, 0x736f1320, 0x035eb80b,
+0x18598410, 0x0ce19d64, 0x7027350a, 0xf70aba81,
+0x00b08465, 0x5823d623, 0x7586003f, 0xf92839a9,
+0x063a5225, 0xb614073c, 0xc0c17961, 0xaf61b00f,
+0x10239d08, 0xbd62e832, 0x445e4057, 0xb5887555,
+0x61609016, 0x7472cf6e, 0x615f1a9c, 0x0c6db375,
+0xe06c5cd6, 0x574049cc, 0x5b5cff26, 0x2e6fedd8,
+0x470a7529, 0x5c60b846, 0x46a93830, 0xb86867ed,
+0xb46c3b42, 0x2e76b73c, 0xb6e03d60, 0x3a002da3,
+0x0319b0a7, 0x7dca95c0, 0x002c9995, 0x29400037,
+0x0e76ce41, 0xcf9f04b5, 0xad809307, 0x179bb06c,
+0xdb001f93, 0x104db575, 0x8b108702, 0x228c9003,
+0x02ff7f9f, 0x812910ec, 0x39078cba, 0x388d3281,
+0x85ddf381, 0x860fc2ba, 0x07cb13ec, 0x12111113,
+0x7fbb2dd2, 0x43dc124d, 0xe4136015, 0xee403307,
+0x8f77ddf7, 0xfa134027, 0x0613d107, 0x593f04ab,
+0x0da11712, 0xb1e6db07, 0x0f14ea6d, 0xab070718,
+0x5fffff22, 0xbb28412c, 0x017f8db2, 0x445b75c2,
+0x9a6ed31d, 0xa22e03f0, 0x7850aa26, 0x66464381,
+0x600d2dba, 0xbf0f7e03, 0x4ffd9601, 0x103f0405,
+0x63538263, 0x916a0b96, 0x05afd8fd, 0x0302b16b,
+0xec870000, 0x4dc2b615, 0x033f6800, 0xb7aa0e50,
+0xec0ab200, 0x52cfdb2b, 0x07d02bc5, 0x78427f45,
+0x59049d95, 0x6d0b4037, 0xc0000000, 0x00012000,
+0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
@@ -2053,10 +2047,7 @@ unsigned etherboot_rtl8139[] = {
0xffffffff, 0x72ffffff, 0x31386c74, 0x7a2e3933,
0x206d6f72, 0x2e342e35, 0x47282032, 0x20294c50,
0x65687465, 0x6f6f6272, 0x726f2e74, 0xffff0067,
-
-};
-unsigned etherboot_eepro100[] = {
-0xeb40aa55, 0xbfe9a865, 0x68744500, 0x6f627265,
+0xeb40aa55, 0xbfe9ab65, 0x68744500, 0x6f627265,
0x0000746f, 0x00540000, 0x0034001c, 0x52494350,
0x12298086, 0x00180000, 0x00000200, 0x00010040,
0x00008000, 0x506e5024, 0x00000201, 0x00008b00,
@@ -2075,7 +2066,7 @@ unsigned etherboot_eepro100[] = {
0x55506650, 0x468be589, 0x02468910, 0x8912468b,
0x685d0446, 0x5066104d, 0x0f2e0e50, 0x000206b6,
0x5009e0c1, 0xe6e8146a, 0x8f2e5800, 0x2e064a06,
-0x0648068f, 0xc72e6658, 0x00038406, 0x66000000,
+0x0648068f, 0xc72e6658, 0x00038006, 0x66000000,
0x00020168, 0x50686600, 0xe8000178, 0xc4830010,
0x89175b12, 0x3ce85bdc, 0x0002ca01, 0x6650006a,
0xc0200f50, 0x586601a8, 0x832d7458, 0x0000247c,
@@ -2090,18 +2081,18 @@ unsigned etherboot_eepro100[] = {
0x1f07a10f, 0x8cc03166, 0x66d88ec8, 0x6604e0c1,
0x00038005, 0x0ba36600, 0x1f586604, 0x500179e9,
0xbb061e60, 0xc38e0040, 0x131e8b26, 0x06e3c100,
-0x146beb81, 0x2606ebc1, 0x00131e89, 0x8c06e3c1,
-0x89d88ed0, 0x4c8b36e6, 0x78c98518, 0x33878d15,
+0x14b9eb81, 0x2606ebc1, 0x00131e89, 0x8c06e3c1,
+0x89d88ed0, 0x4c8b36e6, 0x78c98518, 0x81878d15,
0xbfc08e13, 0xc1831000, 0x8ecf291a, 0xfcfc89d0,
-0x6066a4f3, 0x1f0ec38e, 0x61dfb966, 0x89660000,
+0x6066a4f3, 0x1f0ec38e, 0x5dafb966, 0x89660000,
0xcf8966ce, 0xf3fd4166, 0x66fca467, 0x66506661,
-0xd889c031, 0x04e0c166, 0x84a32666, 0xc7266603,
-0xb0038006, 0x66000146, 0x87e58958, 0x5e89165e,
+0xd889c031, 0x04e0c166, 0x80a32666, 0xc7266603,
+0x90038406, 0x6600014b, 0x87e58958, 0x5e89165e,
0x611f0714, 0xb80650cb, 0xc08e0040, 0x0013a126,
-0x0506e0c1, 0xe8c114aa, 0x13a32606, 0xc3580700,
-0x0000e860, 0x815d0000, 0x0002b6ed, 0x89b9fd00,
-0x8d00005b, 0x06530db4, 0xbc8d0000, 0x0056060d,
-0xfca4f300, 0x5607b58d, 0xbd8d0000, 0x00000650,
+0x0506e0c1, 0xe8c114f8, 0x13a32606, 0xc3580700,
+0x0000e860, 0x815d0000, 0x0002b6ed, 0x5fb9fd00,
+0x8d000057, 0x06530db4, 0xbc8d0000, 0x005fac0d,
+0xfca4f300, 0x5fadb58d, 0xbd8d0000, 0x00000650,
0xffffffbd, 0xa405ebff, 0x0775db01, 0xee831e8b,
0x72db11fc, 0x40c031f2, 0x0775db01, 0xee831e8b,
0x11db11fc, 0x75db01c0, 0x831e8b07, 0xdb11fcee,
@@ -2157,7 +2148,7 @@ unsigned etherboot_eepro100[] = {
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x02000000, 0x0002bd01, 0x00000000, 0x90909090,
-0x000097cc, 0xffedffff, 0xf8835858, 0xcb017500,
+0x00009cac, 0xffedffff, 0xf8835858, 0xcb017500,
0x0804c483, 0xcd027502, 0xfb18cd19, 0xfbfa9090,
0x15cdf958, 0xbbf6edfd, 0x0eb4069c, 0x0001bb66,
0x0c10cd00, 0x16cdc031, 0x4bffe430, 0xb407b973,
@@ -2190,1438 +2181,1438 @@ unsigned etherboot_eepro100[] = {
0xdda17d03, 0xec837eee, 0x08010f08, 0x02a80f66,
0x435c66a0, 0x7eddb777, 0x600e6616, 0x8938128d,
0x44070c03, 0xae3be850, 0x5dfdbedb, 0x050ced81,
-0xd8ad8906, 0x168b0597, 0x6fffbca9, 0x7400fedf,
-0x30b58d21, 0xbd8d0733, 0x39054330, 0x390472f4,
+0x98ad8906, 0x168b059c, 0x6fffbca9, 0x7400fedf,
+0x10b58d21, 0xbd8d0738, 0x39054810, 0x390472f4,
0x890d76fc, 0x76fdb9e6, 0x3248bbfc, 0xfc89cf29,
0xe3e8a4f3, 0x362d8b51, 0xb3db6c29, 0xe868bdcd,
-0x3f450c4f, 0xb70f1220, 0x6db7240a, 0x5c046ff7,
+0x3f450caf, 0xb70f1220, 0x6db7240a, 0x5c046ff7,
0x8d502624, 0x50608085, 0x7c548ffa, 0xfb7fd38e,
0xec01fb6d, 0x936158cb, 0x66a102a9, 0xe61f6607,
0x648b9d0c, 0xa37dd424, 0xf79cdcd0, 0xbe852696,
0xca9dcb9d, 0xbff62db5, 0x57565507, 0x10247c8b,
-0x61983d2b, 0x8339a810, 0x68affbbb, 0xe8550e88,
-0x5b217cba, 0xdbac6fbf, 0x0482a30e, 0x23be7789,
-0xf129b4b9, 0x6db7eef7, 0x15732ea3, 0x81f8ea20,
-0x10b80008, 0xfedc361c, 0x8ed88e7f, 0x8ed08ec0,
-0x5fe88ee0, 0x35c35d5e, 0x35b832e0, 0xf9bbf7e4,
-0xe83d05fc, 0xa358ec1d, 0xf4250bf0, 0xbdfdd605,
-0x68bb5970, 0x1d0300e9, 0x2868535f, 0xf7e45143,
-0xe87bbbbb, 0xa5890bb1, 0xa58d23cc, 0x6ca52fc0,
-0xde977b29, 0xe4cf615c, 0x8100768d, 0xa88fbcfc,
-0x74d7ba15, 0xed0c6020, 0x02341b22, 0xbb7b1919,
-0x17072db7, 0x7e8bd0ff, 0xf23b8b8b, 0x8b8b191c,
-0xdca18b15, 0x28d0bb04, 0x8be2ffbc, 0x68d6da4c,
-0xfd025189, 0x597ff1b8, 0x08618904, 0x890c6989,
-0x14796071, 0x6dc3006f, 0x1bcd0bdb, 0x8b08431f,
-0x095a374a, 0xebf4f662, 0x0c6a08bf, 0x8b10728b,
-0x051c147a, 0x4389ffb8, 0xb6959c2d, 0xbea29c28,
-0x840c5401, 0xce8b664b, 0xb8bb188d, 0xef181f30,
-0x21a29687, 0x2e9d5d58, 0xc3c2e428, 0x2b07357b,
-0x38815080, 0x0f0d2300, 0x82858907, 0x68956ffa,
-0x921b11d7, 0x284f2907, 0xd4bd530c, 0x5350ee68,
-0x2c1d9da9, 0x2f024389, 0x03d4bedf, 0x88101f0a,
-0x0c020443, 0x0f076388, 0xc231585b, 0x90c3db8d,
-0xc6535600, 0x6cd6a10c, 0xbddaddfa, 0x70bb0010,
-0x29c62904, 0xb801006a, 0xe6dfc2e8, 0x2d062e66,
-0x056850e4, 0x6c0986e8, 0x38de176f, 0x18c03b80,
-0xa03903c6, 0xb0050f9a, 0x7f5d6500, 0x0921188d,
-0x055a0603, 0x5bd30aa1, 0x145db6eb, 0x047f1887,
-0x13026a10, 0x6c7dd7b6, 0x1c065016, 0x4eefb850,
-0xe859602d, 0x793d2dbf, 0x66c2892c, 0x010a20f6,
-0xb10f0374, 0xb6c730ed, 0x8843bbc6, 0xce961203,
-0x3f7cb3c8, 0xefeffc1e, 0x95f7b072, 0x2e2c3f8e,
-0x250304bd, 0x282f6cf3, 0x32c8fc23, 0xb0b937b5,
-0x2d0c26c0, 0x30be0526, 0xa1e805fb, 0x83063126,
-0x19b901f0, 0x01b0b939, 0x0c0c152f, 0xecb0ccb9,
-0x29535671, 0x19e4b817, 0x47151539, 0x196d2f57,
-0x66287b7e, 0x8dca13c7, 0x0a6a1887, 0xbbeeef4a,
-0x2474db57, 0x2a24bb22, 0x3eeb8156, 0x2b186f0d,
-0xdcd805f0, 0x01181820, 0x35fb3975, 0x14881dfc,
-0x74d28566, 0x16186617, 0x0506e0a9, 0x6e0bad62,
-0x017220d2, 0xbd16f9d0, 0x20debec5, 0x24e475c0,
-0x10321d12, 0x1b07deeb, 0x0e6dfd73, 0x6cba8800,
-0x07b15d56, 0x22c5cdb1, 0x55404d3f, 0x636e8f9c,
-0x3b2c2c83, 0x06334440, 0xc36c619e, 0x31657df7,
-0x7f1e39ed, 0x1406500c, 0x3dafd986, 0xb0034673,
-0x65e805e1, 0x03fdb74b, 0x02d081db, 0xf63a75fb,
-0x34b22404, 0xb5deef91, 0x23e4405a, 0xb9fc0adf,
-0xa5f34e05, 0xae868343, 0x14c5dffb, 0x850c7d60,
-0x21a574db, 0x1b9db206, 0xdb5ae70d, 0x5f87d889,
-0x0e070939, 0xb07c08fc, 0xe81c8f5d, 0x140101ed,
-0xfffe98e8, 0x0b1addcf, 0x0faaa3ea, 0x960ab4e8,
-0x8576fcdb, 0xa30e8b20, 0xff3c1304, 0xf04e10c4,
-0x7041b736, 0x05d33284, 0xed9f702a, 0x990a07be,
-0xa10814a3, 0x05c70d04, 0x7b640808, 0x09249daf,
-0x1009003c, 0x1e66dcf6, 0x0f181589, 0x0911051c,
-0xd8dd60ec, 0x09101920, 0x28a32324, 0x9b06fb22,
-0x303c2c6c, 0x3159a12c, 0xdc9a2584, 0x867cf86d,
-0x14890ff9, 0x1afff6fc, 0x080589b6, 0xeb2b0c4e,
-0xc183470c, 0x1ff83914, 0xd3d8fbf6, 0x66b9e7d9,
-0x918beb75, 0x31fa837f, 0xdfe1bc36, 0x52779281,
-0x772dff3d, 0x8400bd4b, 0xdafef631, 0x941ed7ef,
-0x391ba92b, 0x72ce23d6, 0xc4b6770c, 0xc53c0dfb,
-0xa98b0676, 0x0729c30d, 0x362f6b0e, 0x09353fc7,
-0xcb4b19d2, 0x623dc591, 0x777cff4b, 0xfbfdf0bf,
-0x03c38944, 0xd6893999, 0x3b27b113, 0x2e720cab,
-0x5bb60677, 0x08a30de3, 0x413b2676, 0x0d724367,
-0xcd02bb44, 0xcf3b775d, 0x192111e1, 0x62c583d6,
-0x333589b3, 0xf087d8f7, 0x2784611b, 0xa3cc1c86,
-0xbee5e918, 0xacceb5ec, 0x792c1434, 0x1481c798,
-0xc99074ba, 0xb3eb1809, 0x4f13b84b, 0x90ec1987,
-0xb2ef052b, 0xffd6be36, 0x9b1478df, 0x3f811beb,
-0x45524621, 0x03662e75, 0x89620457, 0x11db8b86,
-0x09044f21, 0x5a953b3d, 0xd3aa6b1c, 0x0bb7f189,
-0xdffa16eb, 0xe7c1fa17, 0x66c7290a, 0xbb80fa81,
-0x44c38eca, 0x75bbf8ee, 0x0369d389, 0xe2812515,
-0x8c8db8ff, 0xd8b86e1a, 0xfc8906fa, 0x893942d6,
-0xd4bdbef2, 0x2096a6d1, 0x12ebc946, 0xc7044a5c,
-0xef6ee502, 0xc2816cfe, 0x49667c00, 0xe946ec75,
-0xb877df70, 0x42e48816, 0x09bdf2ac, 0xcc1bb0a1,
-0x0408675e, 0xdc69b8b9, 0x07ddda35, 0xe82c89c9,
-0x2404fd33, 0xe0cdbdf7, 0x5723b523, 0xbf770553,
-0xeef7f7d3, 0xe88151c2, 0xf989261c, 0xc1390d2b,
-0x16be0aeb, 0x760b90ba, 0x83247291, 0x2d6f2dda,
-0xcad7e3e6, 0xe2c117d2, 0xbe6428c2, 0x1ecb07b6,
-0x1ea7d7f3, 0x7216c0e4, 0x742a8d5f, 0x6c6fa125,
-0x9082c6e7, 0x032f0d5b, 0x2c1ca397, 0x82770ed6,
-0xa6fc9ee9, 0x779d248a, 0x7c1ba477, 0xd175612e,
-0x8d1a6851, 0x5b4ddc10, 0x305d936f, 0x088cfe47,
-0x341e05e8, 0xb49bbdb6, 0xb239e810, 0x084657b9,
-0xcf7afc37, 0xa71983bc, 0xe8f291e8, 0x7051fed9,
-0xc9626285, 0x23c27b23, 0x781d2844, 0x8dd029dc,
-0xc1b7050d, 0x00e3813d, 0x0d8be41b, 0xa36d8715,
-0xecde86ff, 0xc839ce29, 0xd8390c77, 0x12fb6477,
-0xf847fa4c, 0x0476000a, 0x56086e58, 0xe851d129,
-0xef7be497, 0x2f4d5afd, 0x1e443529, 0x7899599b,
-0x438b1847, 0x0753c829, 0xcdb274dd, 0x6904764f,
-0xda34d039, 0xa97b0574, 0xafb1cfd8, 0x0540ff08,
-0x573fe852, 0x30af49a3, 0x06d52c08, 0x0d8bdb70,
-0xa849602c, 0x2bd835b5, 0x5a847a50, 0x607e5045,
-0x8c67d701, 0xb95c0934, 0x165f28e8, 0x2e116c23,
-0x0868a4a0, 0x5ad7c620, 0x99cc262d, 0xbe59563d,
-0x53d8adaf, 0x2185a412, 0xf530262d, 0x52dfbc23,
-0xbe7974ed, 0x89241054, 0x89d729f7, 0xb06bf8fa,
-0x540e0715, 0xab898389, 0x750f7b82, 0xf7839fc7,
-0x2d89b80b, 0xf4b4550f, 0x2cf474db, 0x21fb8386,
-0x2c8a1554, 0x737b6ec7, 0xeac1fe5e, 0x96031304,
-0x6e688b89, 0x438df783, 0x352b0257, 0x3e060c59,
-0x59bd8a71, 0xaa9d8fd9, 0x6de358a5, 0xfd0f1d3a,
-0x95b8061c, 0xbb7318de, 0x53e2f192, 0x6ad1a102,
-0x060479db, 0x007e1d0b, 0x77eddf9d, 0x74b5153b,
-0xea81d602, 0x52828ba0, 0x03b60284, 0xcb3c585b,
-0x81046a16, 0x282219c5, 0xcfac51d0, 0x11048ddb,
-0x5a207b7a, 0x47c8defa, 0x00cd87cd, 0x2b9a1915,
-0x46346d5a, 0x4f408934, 0x16a72bc7, 0xdf2cb69a,
-0xd328fe91, 0x9eee3187, 0x01bf660d, 0xe8560d8f,
-0xd74995c1, 0xff0cf60e, 0x01180475, 0xa9170bc6,
-0xbb776b73, 0x5502c314, 0x2103f45e, 0x1701c133,
-0x8ddcc10c, 0x2da1181b, 0xd5c8e006, 0x17d843a4,
-0xf66d4a48, 0x06032f67, 0xcf12f889, 0x85c0a95b,
-0xfb4309c1, 0x46c91045, 0x9b8c56da, 0x6203c199,
-0xb813181c, 0xd2b78377, 0xc9031c42, 0x76113d03,
-0x2b432438, 0x814b3c49, 0x162c0733, 0x6189e7db,
-0x2d84d2d6, 0x1db7e86d, 0xb150526e, 0xf7e85708,
-0x0c75375c, 0xdaf8e09b, 0x2d17e991, 0x4629a731,
-0x1607b6f8, 0xbebbeb42, 0xdf03ec0d, 0x4d5b05c8,
-0x2c0ac910, 0x8303014c, 0xc4da97d1, 0x049bfce1,
-0xcc291055, 0x96eb5154, 0x845bb498, 0x54f59a7c,
-0xc142fbd0, 0x89065dc4, 0x94e85dec, 0x0edc0292,
-0x9c8b4c7f, 0x3579a424, 0xbcc4f764, 0x4bb535f0,
-0x8d6c60b9, 0x65740899, 0x5c8502b6, 0x05e6979d,
-0x91d0b60c, 0x8306ba25, 0x0f83d3c2, 0xa370b6e2,
-0x194f75cd, 0x04c2ef8b, 0x6c7f8506, 0x958e886b,
-0x02fec1c6, 0xbfd1dd1f, 0x4217bdbb, 0x411b108c,
-0xf07cf139, 0x76535250, 0xd2b8477b, 0x817016b0,
-0x752a64e3, 0x22c60c27, 0x5b4cf8fd, 0xc775f089,
-0x89266f45, 0x42f60c4f, 0xd16cd974, 0x735000e8,
-0xa86abf8b, 0x7c106a20, 0x5fd002e4, 0xdf8cf636,
-0x20e9e8d0, 0x03c08354, 0xdc911301, 0xb3f56ae9,
-0x9a36d182, 0x153490db, 0xbeff2cc5, 0x5f1ac1c9,
-0x0e765bb7, 0x16bfc8b3, 0x18a47b10, 0x8ba3f0ec,
-0x45bb2500, 0x6841bba9, 0x08ff0908, 0x985b5580,
-0x10cf60a1, 0xf3392b7b, 0xb1c15782, 0x4ae20abe,
-0x3fa37e0c, 0x3917e261, 0xc109ebd9, 0x01421604,
-0xdb8b0fc1, 0x5bf5be06, 0xc85ec10b, 0x1a36e0a1,
-0xba24850a, 0xd3306531, 0xa36c309c, 0x084749e5,
-0xef4b7d9c, 0x026ebf02, 0xf0e7830f, 0x273d89e5,
-0x257eb964, 0x75808603, 0x8d0f97e0, 0xdc36fd83,
-0x189d0ef0, 0x8d328e2d, 0x960505b8, 0x3a187667,
-0xd00b1ae1, 0xf7851e04, 0x82894098, 0xa2cbad1e,
-0x096f5830, 0xa4f0e583, 0xed8d6401, 0x5188efd7,
-0x3568046a, 0x5a7bac8d, 0x9df5c605, 0x58caeaeb,
-0x1d0707c6, 0x0805d343, 0x2323608d, 0x83a10c0e,
-0x7a4c4b62, 0x2b1c2888, 0xd63622a6, 0x107b0add,
-0x14281622, 0xa56ddb05, 0x05ff515b, 0x541c5018,
-0xd60d071d, 0x1ea3059d, 0x03283ccc, 0x0c5d0f20,
-0x2a072db6, 0x13822202, 0x94d8862e, 0x6a260375,
-0xb27f1130, 0x1466dabd, 0x7fe43210, 0xaba09905,
-0x5f36437b, 0xae437540, 0xf637c836, 0x48054680,
-0x054e4a12, 0x37c83534, 0x56521250, 0xfa3158a5,
-0x3d012c77, 0x60738d3c, 0xc7054328, 0xdffef104,
-0x3a68c32d, 0x59612b19, 0x01064625, 0x0846c602,
-0xe9dd242c, 0xae4694c8, 0xd81e1486, 0x0a46edb3,
-0x465a0e2c, 0x2046ed12, 0xeb0775d6, 0x46e21403,
-0x22160322, 0x30952818, 0x051a3632, 0xac651e1c,
-0x46ec2712, 0x2646e924, 0x8f6fac65, 0x2a460704,
-0x0fe3833a, 0x6a285e0c, 0xb62ee31e, 0x6870b42c,
-0x68094628, 0x6c8c80c7, 0xbf0c1183, 0x68df891c,
-0x78ef1363, 0xe824d234, 0x5a375882, 0xbb58df6a,
-0x71d43aed, 0x18142c89, 0x613b07f9, 0xdcb90860,
-0xd709bac1, 0xf0242ddd, 0xf7fde8d1, 0x001ac225,
-0xc6dda705, 0xeb6b47c0, 0xbaf062d9, 0x688ec25f,
-0xe9e804e3, 0xf91d21f6, 0x6c182244, 0x235bac02,
-0x1b7df836, 0x565615fb, 0x0b745339, 0xbe87dd9a,
-0xb0959af4, 0x97047401, 0xe80e68be, 0xdd66241a,
-0xf73df8da, 0x6ecfc529, 0xaf144ef0, 0x48cdb503,
-0xf4e1810b, 0x8d0a250f, 0x02090a94, 0xcde0cd9a,
-0x4e83f8e3, 0xa338de0b, 0x7fd48a17, 0xbad0361e,
-0x177544a9, 0x01f3c18e, 0x4c835fd0, 0x83306027,
-0x0629d080, 0x5981fc1d, 0x42b46284, 0xd4a0e743,
-0xa4d2ae91, 0x9eb1c082, 0xda1c1afb, 0xeb29c811,
-0x0bacb85a, 0xe3d0837d, 0x0b899392, 0x31b168c0,
-0xd61dba70, 0x178c325c, 0xeb7c4bba, 0xe8671857,
-0xdac358c7, 0x235d1621, 0x05527722, 0xfc34222c,
-0x36c4e82d, 0x306de3c7, 0x1cefd0fb, 0x7b41688a,
-0x02105417, 0x66d08211, 0x0af31910, 0xc0a0de18,
-0xdad4a91a, 0x36fbe083, 0xb10cd46c, 0x1204bef6,
-0xf6a9e283, 0x100fe06d, 0x040e140a, 0x7c0233bc,
-0xb5089480, 0x3430184d, 0xaf46464f, 0x59a138ef,
-0xd8bf2d0b, 0xc6d824aa, 0x97d75a06, 0x244114ab,
-0xef8ec554, 0x3881c032, 0x7620e22a, 0x43028b46,
-0xee0adb15, 0x5c04428b, 0x7a080779, 0xd130605a,
-0x23dc04f5, 0x1615c16b, 0x71d14ada, 0x22e26f04,
-0x31341bbf, 0xc38bc6b6, 0x5b245d67, 0x07017136,
-0x438b0d7d, 0xd40640b2, 0x27d02dae, 0x5b7fe1e9,
-0x37760913, 0x72afdb7c, 0xeb0a0310, 0x682d90ba,
-0x1c9c9220, 0xd8e6df53, 0x4ea604ec, 0x78504d85,
-0x73061558, 0x0b33b364, 0x2454000a, 0x13688d6b,
-0x52ee6138, 0x638e5728, 0xdf77e9f1, 0xbe02f8c0,
-0x07771a81, 0xe085348b, 0xee147b27, 0xedb6ca36,
-0x77181940, 0x1b741e54, 0x703ad848, 0x07760aed,
-0x19ff2cb8, 0xd0e8e514, 0x02ba8cf5, 0x1bbb6f86,
-0x3e1db75a, 0xb817897a, 0x3a397440, 0x06c9cdeb,
-0xa71e707e, 0xa1247b8d, 0xe4b90024, 0x7553b1d9,
-0x4e2633ac, 0x70c60cb2, 0x352994ed, 0xc3928e0c,
-0xa016d4c8, 0x32866303, 0x0cc4a8fa, 0x037ba053,
-0x32b4346d, 0x4b17a344, 0x85e6d315, 0x0b1ef856,
-0xd01d244c, 0x0bc78553, 0x23c9816e, 0xbe10c3e7,
-0x858e74bd, 0xda89ee12, 0x2a1640ef, 0xfea5f66e,
-0x23231af4, 0xed10c2be, 0x85a99e4e, 0x0e78e03b,
-0xdc74bba9, 0x45c3725a, 0x30b0fa93, 0xbd4880fb,
-0xc0e4d551, 0x56e6ec3e, 0x09566753, 0xec0864c1,
-0x41019225, 0x31266463, 0x58a839e4, 0xb1c1ea01,
-0x392d3085, 0x77b30ec5, 0xbdd04b7f, 0xb8f21014,
-0xea654802, 0x10c1ef66, 0x026afba4, 0x0f6ddfe8,
-0xfe8bdd03, 0x89fec50f, 0x6dc8e8ee, 0xf989af49,
-0x01a8f8d3, 0xd8f006bb, 0x7523ee37, 0xd892b302,
-0x9e66f289, 0x16cb8302, 0xdf6ddb01, 0xd889289f,
-0xd8d4f93c, 0xd111bb75, 0x40f26f64, 0x2ca5ed66,
-0x2a2f1dd9, 0xc20901e0, 0x79b0794f, 0xd820703f,
-0x7c62e877, 0x1bde1200, 0x0521bc37, 0x00b9e277,
-0x8f7427ac, 0x1afc25ed, 0x00b81273, 0x02c20801,
-0xc04fc32c, 0x0fd96176, 0xeb3412c3, 0x16ae25e9,
-0x23d6616c, 0x2cf4fad8, 0x81a2831d, 0x8b25d5ee,
-0x2c7e06ee, 0x16058c5b, 0xf1ba0c1c, 0xd50684c0,
-0x6a77a6a5, 0x5c70ff28, 0xdb3812b1, 0x8fe3b752,
-0x82b01186, 0x8a799b50, 0xa3450540, 0xdf867a56,
-0x537ed601, 0x826ef77a, 0x48a34ddb, 0x2c3db911,
-0x0f581589, 0x6e5b7b19, 0xf7045ca3, 0x42082d05,
-0xbee6dfb6, 0x0d89400c, 0x4c0d0744, 0xa7208016,
-0xdc0fd235, 0x540f54f6, 0x538dbf05, 0xa96254de,
-0xb0efc8f6, 0x17eef16c, 0x305ffc6c, 0x06eb36d3,
-0x64f98341, 0x84ec3c7f, 0xe1b6f5b2, 0xbe0a6b57,
-0x5a2e9a9e, 0x73986be0, 0x663bc477, 0x097a64a1,
-0x0812d2e8, 0xac96a6b6, 0x561febec, 0x7eec45c3,
-0x0a85bbfb, 0x097441d8, 0x10f98141, 0xf27e1927,
-0xd8535150, 0xc0851f84, 0xdc4f3126, 0x7bbab6c1,
-0x2f9debe1, 0x09cca156, 0x7440148d, 0x9ae1b409,
-0x608248dd, 0x1164655d, 0x26047b99, 0x7275b3d0,
-0x28365a5a, 0x97bc28d0, 0x601002da, 0x895d2eb7,
-0x2450770c, 0x00009585, 0x87901676, 0x4eba561c,
-0x4d2fbc71, 0x6d400478, 0x848d0910, 0xda957710,
-0x0d0f3059, 0x6ac76b01, 0x6da37777, 0x166c82e3,
-0x5d3fff25, 0xb7296441, 0x38c3561b, 0x19700532,
-0x1d9cc1d4, 0xe860717e, 0x19b75123, 0x3c367e52,
-0x628070f7, 0x5508c070, 0x1d688071, 0x07e5ee84,
-0xa36c1277, 0xecc06e80, 0xf808de05, 0x96428d05,
-0x544203e0, 0xb61ec5d7, 0x003d03d2, 0xb8b35289,
-0x3c022d39, 0x5aef6284, 0x8ef69c77, 0x5cb0085c,
-0xbabc04b0, 0xecd95711, 0x7e6203ba, 0x873f4305,
-0x794a3edd, 0x0f0a4dd3, 0x4e29b08f, 0x513fb824,
-0x09d0e9f1, 0xd84d60d0, 0x59101d49, 0x148a7ae9,
-0x4b0b1baf, 0x081e8a2d, 0x14fe0253, 0x1b01cf48,
-0x15c169f5, 0xb0ad1f51, 0x4a518de9, 0x05c9ca89,
-0x1b8b1838, 0x3a5ba906, 0x8b54f43c, 0x22ad7953,
-0x88751a5d, 0x9c943cc4, 0x1de3868c, 0xe68350ed,
-0x04c68ffc, 0x702ee574, 0x977f6870, 0x8ac95344,
-0x0bfbeded, 0x6c428873, 0x5c001bba, 0x77e8d300,
-0x7a9687fb, 0x00794bdd, 0x3d9a0ffe, 0xff287d07,
-0x141b0e29, 0x9f0f40bd, 0xdb310180, 0xed8aff31,
-0xeb39f14a, 0x11732b7d, 0x833ef009, 0x2435dc5b,
-0x0ffb8339, 0xf3057ffd, 0xbf8bdbb5, 0x0143105c,
-0x3ec681d7, 0x32d77c2a, 0xfd68d85f, 0x5c508b86,
-0xb41f8076, 0xd1d98903, 0xf40b42eb, 0x01e183f8,
-0xe1164485, 0x0edfad03, 0x04887dbc, 0x053e431a,
-0x99fcd77e, 0x5c72ff58, 0xeed27fa1, 0x578eb468,
-0x813f4c38, 0x74babaff, 0xe9364a14, 0x77c71aba,
-0x5c1d1a93, 0xac9132f8, 0x68a69c52, 0x78bec57e,
-0x8b85e86b, 0x045618f3, 0xec3cd879, 0x4106b81b,
-0xb85e8d56, 0x0608c0da, 0xb806f00e, 0x1ed0b78b,
-0x878da67f, 0x833397e0, 0x87e12e40, 0x2dee590c,
-0x60978df1, 0x6023ada1, 0x38bbe3fc, 0x9b649089,
-0x1e3c913e, 0x81472464, 0x915b48c2, 0x4b4d63da,
-0xc676be79, 0xfd836069, 0x90adac1b, 0xa3c00862,
-0x018dad64, 0x200c86d6, 0x60238798, 0x603200c8,
-0xac9812a3, 0xee99c513, 0x4de30001, 0xf6a3ebc3,
-0x5c4254aa, 0x341b048a, 0x8360708c, 0xc0ea9735,
-0x2f16d01c, 0x6ad4cd6d, 0x9cfa833f, 0x966ebd84,
-0x0a0889ed, 0x98eca11b, 0xbb77110f, 0xe805781b,
-0x5d09a208, 0xdf9ac4a1, 0x6883bb13, 0xa00f0ca2,
-0x68c133c0, 0x7b3bb783, 0x9680c0c2, 0x02860da2,
-0x08400206, 0x3c36eeeb, 0x040d4796, 0x1705c607,
-0x70064805, 0x1b669668, 0xc5051d80, 0x22caf208,
-0x0105e179, 0x12725393, 0x58666679, 0xd5b54c66,
-0x3f1cfd44, 0xc2e6ca1f, 0x9a47391c, 0x0ff00b11,
-0xe5a8b843, 0x00c7b947, 0x7ef41e1b, 0x40c8defe,
-0x061c4748, 0x501b174c, 0x21611ada, 0x69eb14bd,
-0x00bd6e5c, 0x33a72701, 0xe9d285c5, 0x1752f7d3,
-0xabc0b87e, 0x15881ab8, 0x22cb07c8, 0x842dd404,
-0xc329da03, 0x3f57050b, 0x174a22b6, 0x4948d460,
-0xeb398175, 0x3a288d3e, 0x9e133b53, 0xfb7513b6,
-0xc7ded194, 0x8d4d1f18, 0x5f28e89a, 0x7a3a5c1c,
-0xafae9031, 0x0520c0be, 0xf075daa5, 0xbe4f08f6,
-0xea565155, 0xd7e91348, 0x726128fe, 0xc15005c8,
-0x947606a8, 0x57e6e93d, 0x43212e92, 0xe94393d8,
-0xb95734df, 0x5dd84ec0, 0x2efd3e63, 0xc1ba8153,
-0x39bb2e0e, 0xc1cd9028, 0x7cf11f40, 0x52fe42b3,
-0x1da2db41, 0x9bff68b0, 0x80ec28e4, 0x408b4219,
-0xe365e8bb, 0x26621b28, 0xf14a09ad, 0xf50aa120,
-0x6b0c89da, 0x088de91c, 0x012b986b, 0xf1068a93,
-0x58d8ee6f, 0x3a3c0cb8, 0x1ef3438d, 0x38bff442,
-0x265b7712, 0x05407017, 0x28501f73, 0xc3017561,
-0x93886637, 0x4aad9e4a, 0x8331fb3c, 0x721e08c7,
-0xc1a288e1, 0x597e1f6f, 0x8a94e868, 0x595a0447,
-0xec394468, 0x1f36a1d4, 0x31f129ef, 0xdd68b64c,
-0x6a51d21f, 0x28f76803, 0x42b9688d, 0xc3d355a0,
-0x73ba7550, 0xd5bbaa08, 0x03d4dabf, 0x037a802e,
-0x2574b92f, 0x8f82c3d2, 0xe8519495, 0x3ab817c2,
-0x18bbbbf0, 0x3a388031, 0x3980311f, 0x8380752f,
-0x9f75fbb2, 0x56fb6854, 0x05e889a3, 0x7b585e84,
-0xa02871a1, 0xe90405a7, 0x16dbeb73, 0x408dbbfc,
-0x6a525f01, 0x52fd8d0a, 0x87c33381, 0x811784ed,
-0x10a3144c, 0x2456aceb, 0xe8717e89, 0x84ed1d36,
-0xc3558bb3, 0x47315286, 0xb84af0e4, 0x7606eec0,
-0xda04ebc3, 0x6d303d40, 0xfa11f572, 0x75ab3456,
-0xbbe80865, 0x9a23f165, 0x02c8d260, 0x7d6e0278,
-0xb766c52e, 0x9a0462db, 0xbdf34117, 0x1f8ce547,
-0x9304ec66, 0xe8aecbff, 0x07e0e19b, 0x3d61db32,
-0x607c79c0, 0xb5ed14b6, 0x47854b68, 0x0b0b2110,
-0x68c8b363, 0x3a0d1f99, 0xa37afb7e, 0x0f55fc12,
-0xfe8eb58e, 0x7b609b08, 0x6f358477, 0xf6854a7f,
-0x8ed68609, 0x267eef7a, 0x3c9f1878, 0xff046ca1,
-0x62be0c50, 0xffa24ec7, 0x7571f021, 0xfe162198,
-0x023331ba, 0x8d09a1c2, 0xc9b8f865, 0x36bb7689,
-0x0d06fe66, 0xa28c4a02, 0xdfbb5222, 0x7479feaf,
-0x8f07b927, 0xe645992f, 0x7bbbaddf, 0x0233743d,
-0x7f2304be, 0x0d783d92, 0x5b896b7e, 0x62229f89,
-0x70e39beb, 0xada7dcbc, 0xd5489090, 0x041805cd,
-0x9fbf082a, 0x1943e8ca, 0x689970ee, 0x66d731dc,
-0x537a185f, 0x4370a346, 0xc5af7b61, 0xb34e22a4,
-0xc1956809, 0x0905b24c, 0x998a6064, 0x4253426e,
-0x3445532e, 0xbb07b040, 0x46b36876, 0xfb241c89,
-0xb84dfdbb, 0x4914433f, 0xff147ab5, 0xf200ee94,
-0x9e3a057e, 0xb22bd94d, 0xfbc9856b, 0x6f17e245,
-0x74204239, 0xb1e74c1c, 0xeab19644, 0xe991058e,
-0x77bebec4, 0x6dfb0f59, 0xc4cab80b, 0xfc637afd,
-0x8d43b3ac, 0xfe8c2ddf, 0xc20a02fd, 0xb1b077f6,
-0x0974ae03, 0x4218b7e9, 0xc3fb0114, 0xae6cec06,
-0xa6a1a753, 0x9e11b6ef, 0x01e25e78, 0x6a36144f,
-0x67d46801, 0x8d7378ed, 0x2dec686e, 0x1a26fa3f,
-0x427827f9, 0xcf688574, 0x9c5a02ca, 0xc28b607d,
-0xf057982c, 0x136f2243, 0xc8cc425e, 0x372be94b,
-0x184d2231, 0x29990824, 0xefb3cdb0, 0x34d3880f,
-0xfdc9ee01, 0x6031fcd5, 0x5d43e198, 0xacc746e8,
-0x06a2f7a3, 0xf1a4a55a, 0xc3e051a0, 0x62950c77,
-0xe8d3a3a1, 0x05f12aee, 0x07d7891a, 0x3c03ebc1,
-0xb58c3e12, 0x0fa32257, 0x67170a7e, 0xbfd0d19c,
-0xc5034f0d, 0xed0a8ba1, 0x7fe60b78, 0xd9625d68,
-0xe355b1d7, 0xa6a33140, 0x09d80a8b, 0x8e7abc1a,
-0x8fb386a1, 0x317bb5fd, 0x0d105089, 0xa11c5889,
-0x67784521, 0xbe8a20bf, 0xd301c703, 0x9ec70691,
-0xeb7839a0, 0x6498e9ec, 0x60170030, 0x58153bea,
-0x7849c9dc, 0x85dd3634, 0xd12a68fa, 0x480ba81b,
-0x81d1584c, 0xeeb748fa, 0x7ca5f81f, 0x0f186924,
-0x96201dbe, 0x6f4813b8, 0xf07502c2, 0x30772874,
-0x56e455e8, 0x8e12bd8d, 0x1dc5b6e5, 0x8820ce4e,
-0x4dbb920d, 0x8c26425b, 0x9d853488, 0xfa2c11ec,
-0x74237850, 0x7d9c3a2d, 0x27e8ec3d, 0xf7caeb33,
-0x74012757, 0xdb4b748f, 0xe8b712fb, 0xab0bee5c,
-0x05d59ed5, 0x5a60fe6f, 0x42fd10dd, 0x502725fc,
-0xc589da39, 0x870f34f9, 0x3e060107, 0x885b060c,
-0x20d93904, 0xf5187e0d, 0xc4820f24, 0x76cb3936,
-0x60aea10e, 0x393151db, 0x780f17f5, 0x803396e1,
-0xf4fec235, 0xa268b128, 0xf56c8675, 0x32be1cf6,
-0xba05ae80, 0x3cca140b, 0xfeed8030, 0x81cacc27,
-0x868bc00c, 0x3db96d01, 0xe40e23bb, 0x1891138a,
-0x4d8b2c09, 0x0dd6ddf7, 0x1f1c0339, 0x76b97228,
-0x142c0f7c, 0xf01d0776, 0x0a72ad77, 0x77f339ff,
-0x106c3ba1, 0x34f0dbad, 0x34781376, 0x072b092b,
-0xaa510a2c, 0x906f5b72, 0x7c40f6ac, 0xb08d3eeb,
-0x1b80ee44, 0x100bd3e0, 0xc06855d9, 0xd340df10,
-0xdb2ce02c, 0x55eb4b3c, 0x35c3dc2c, 0x4f19c561,
-0x86099c16, 0xd86fda45, 0x75d36c82, 0x71e9d49f,
-0xf4465004, 0x8954d1eb, 0x2c3dd2de, 0x24a90d94,
-0x88f0c09d, 0xff448018, 0x4c278a41, 0x7fd07971,
-0x04b75166, 0x10e566b9, 0xa9b14fb3, 0x500c07de,
-0x4d2d25b8, 0x29a94d7a, 0xe634363e, 0x14d83c17,
-0xd8a58838, 0x9a456877, 0xdb64b42a, 0xcf8c3aac,
-0xf94ce818, 0xe8544899, 0x16588213, 0xb844a1a6,
-0x4611178e, 0x2497248e, 0x08dc96a1, 0xdda24a5d,
-0x50291c54, 0xef8d1068, 0x09cf8905, 0x811874d7,
-0xdbb6e36e, 0x392e2bee, 0x0e726ff1, 0x0686821c,
-0x39d2ec31, 0x037ab0c2, 0x43b04729, 0xa924d2e0,
-0x547ab850, 0x01a3a109, 0x0858a177, 0x445d4b3f,
-0xa5e1b08a, 0x77d8429b, 0x5352c3df, 0x26034808,
-0xbac8d745, 0xf0522084, 0x3163c36f, 0xd82932c3,
-0x1d01b701, 0xdeb6ab1d, 0x15a33c58, 0x2b901841,
-0xa29ba701, 0x6981b42c, 0xac456d69, 0xbb43ca5e,
-0x442fbb16, 0x0269c2ba, 0x03edee6f, 0x131a483d,
-0xb923a32d, 0x31054cbb, 0x1ce5c7d2, 0xbb44460d,
-0x16fffb95, 0x3920c283, 0x83637ef0, 0x3d4a40ba,
-0xdf060082, 0x75b8b5d6, 0xac138be4, 0x60040edd,
-0x346ffedb, 0x95393b11, 0x06774048, 0xf939c872,
-0xea5fc472, 0x742711d0, 0x05d65716, 0xf444808b,
-0x267266fe, 0x404124ea, 0x3589a773, 0x8d8e108b,
-0x61104535, 0x9d7f6246, 0x76dcd75b, 0xc11bc267,
-0x4c8637e6, 0x6d8bdba3, 0xa48bd8b8, 0x4c8e1d4f,
-0x7fd30dae, 0x01b0db3b, 0x29ea11f8, 0x42d319c1,
-0x6116db1f, 0x1d8d0d84, 0x40440f99, 0xbb613c50,
-0x09392b75, 0x085c8924, 0xf738821a, 0x2910d63d,
-0x25f02835, 0x294c0c00, 0x5edf8bb7, 0x014f333d,
-0x01fb11c1, 0x4d5c11cd, 0x7dd43b5e, 0xf8ac0ff0,
-0x5d0c1d09, 0x7453715b, 0x489e1a85, 0xb4ff383a,
-0x5ed1b637, 0x4d829415, 0x43154ea3, 0xb69f706b,
-0x0de31dc1, 0x1c6a7918, 0xee0ae409, 0xb7155c6f,
-0x8810123d, 0x1ca9b088, 0x468406b0, 0x68683471,
-0x4ff88baa, 0xc77fa3e8, 0xa1d105b5, 0x5ab07861,
-0x406fc232, 0x0eb05663, 0xbdded50c, 0xb6737705,
-0x11b9e82f, 0xd7272dd8, 0x11b68a35, 0xf94234d5,
-0x46ff3226, 0x7b690110, 0x7e34688d, 0x38db3169,
-0xc00933f2, 0xbb8358c3, 0xf448ea75, 0x831f2687,
-0x54b3ff57, 0x2fb165b4, 0x2051236c, 0x50e85569,
-0x2f4f6793, 0x726cff56, 0xbb035116, 0xabbd8e86,
-0xa87f5738, 0x66df60ae, 0x893a6e39, 0x3474faee,
-0x5c315538, 0x3cbee8cb, 0x0702e142, 0x6deb418e,
-0x5e0af15d, 0xe9e021b5, 0xd58e4816, 0x897eec2a,
-0x671a39c8, 0x20ad59e8, 0x0d0e24c2, 0x08d43017,
-0xde400574, 0x8650ab59, 0x50f7013a, 0xc14bab54,
-0x5b7e58f8, 0x1b7420ec, 0xe652c0f9, 0x4e6f8c1b,
-0xc7d2533b, 0xa9b09ed8, 0xc8bb51d7, 0x19da29de,
-0xd2318c8f, 0xa1b3a7a4, 0x0370154a, 0xd7ce3a27,
-0xfdebe928, 0x21f89d4b, 0x3d802cdf, 0x813ed7e5,
-0x6d130358, 0x209844af, 0x687b3810, 0xc0e00281,
-0x1881146c, 0x7681513f, 0xb3e02db5, 0x02ba9f16,
-0x825344d7, 0xed85ce48, 0x4b77746f, 0x8a07be82,
-0xeb1de41d, 0x4c8ac832, 0x6e27a3fb, 0xaee8a3fc,
-0xa3f87dd4, 0xdde206d8, 0x1a9981c2, 0x25231588,
-0x995c0eb6, 0xdce2f025, 0xbbf0a8c1, 0x148de9b1,
-0x840cf390, 0x26dc152d, 0x4b6d2284, 0x9325c8dc,
-0x04fd6e75, 0x4c04dc58, 0x172f7bc0, 0x5f8e22cc,
-0x02a211b5, 0x73044a94, 0x42da26f6, 0x47d572a0,
-0x8a0c7a8b, 0xd8606d46, 0x366213da, 0xf50a7c03,
-0x2bdb0d1b, 0x6c4fad7a, 0x74e88018, 0xb7dff086,
-0x74020474, 0x2992a17b, 0xff58e9c8, 0x0e9ae89b,
-0x869bbd05, 0xf7087544, 0xf4f002ee, 0xfb3be4df,
-0x0476eb89, 0x6f0d18ed, 0xcda1b181, 0x2342488f,
-0x927b9eb6, 0x945f973d, 0xab5e4b29, 0x50985744,
-0xf6269a25, 0xad1afc35, 0xd3e919a3, 0x01faa1fe,
-0x20cda06e, 0x300be9de, 0xdb86717d, 0x1f10c436,
-0x461213d5, 0x725a31c6, 0x4cc43b28, 0xfd522a78,
-0xda81402e, 0x73c8356f, 0x0344cc35, 0xd2340f03,
-0x3f125bb9, 0xb9a08788, 0xefebacd5, 0xdb32148c,
-0x522e9077, 0x9b18d029, 0xdf4d60e0, 0xd4c73550,
-0xfd5a5846, 0x33183b1e, 0xf69c3a1a, 0x7493c505,
-0xe0db9e0a, 0x5106e6d1, 0x5189bb88, 0xd8f50c17,
-0x83169e0a, 0x58e00d50, 0x6b77da0a, 0x5031048d,
-0x51c8528d, 0x5fc12201, 0x895233a8, 0x5fe2e8d8,
-0xd8337b88, 0x92d50f69, 0x2b565026, 0x120f901d,
-0x1827c37d, 0x3c70e853, 0x35011861, 0x7bb87db8,
-0x5e08314a, 0xc35e6d5b, 0xa752e805, 0x8c326aea,
-0x44a3d02d, 0x449e231b, 0xab3deb61, 0x77ff32d2,
-0x8d1cbe89, 0x2a66fc42, 0x046d0777, 0xfce890eb,
-0x4028ffe4, 0x0bffb383, 0x161df684, 0x19dc0582,
-0xf881dbeb, 0xc0da4e64, 0x33ff8c26, 0x34776010,
-0x51166b2f, 0x530ac702, 0xab3c058d, 0x3bd38455,
-0xdbfc3d1a, 0x7f0dffef, 0x74464c45, 0x2ec0313e,
-0x8175d175, 0x1336007d, 0xfa781b03, 0xd6396d18,
-0x75d38960, 0xc74bafbc, 0x539e2a5e, 0x74bb4ed6,
-0x05c73d31, 0x78b1c1f0, 0xa19bbad6, 0xdada251c,
-0x0045dda0, 0x3500013d, 0x581049b1, 0x38fd8d1b,
-0xa2bc02e8, 0xa09214a3, 0x99db776c, 0x34082872,
-0x8d232000, 0x7742ba36, 0x8c032027, 0x77ee0605,
-0x013be60d, 0x6a6b51e8, 0x68115612, 0x5e0b7cc0,
-0xf00a2a32, 0x15811c2a, 0xa2d0af11, 0xb844d43d,
-0x298cff46, 0x5a7804d3, 0x0414abe0, 0x0dcb6fbf,
-0x9d56be64, 0x6ce5203d, 0x04bd9df2, 0xfee6e964,
-0x06197463, 0x76baf6dd, 0xba2f1281, 0x84093a1f,
-0xc5e226bf, 0xb923c08e, 0x18080a2c, 0x53fbfab3,
-0x6855106a, 0x3a99e812, 0x53a0e830, 0x8b0cdc3d,
-0x5c7da3a5, 0x8d169f78, 0x52d40590, 0xf4a38da3,
-0xb93f182c, 0x31f5b0e8, 0xb5a9845f, 0x0be3c00a,
-0x7802fdec, 0x0a62897b, 0x95548d69, 0x80021c3d,
-0x5be36ffe, 0x7442be99, 0x3907bd76, 0x514676df,
-0xfdde4b8b, 0x439236a5, 0x010814cb, 0x0c5651f1,
-0x51044b03, 0x0561fffa, 0x7c745647, 0x0303438a,
-0x04a80873, 0x5f671e75, 0x0365db01, 0x54935d55,
-0xac19ac75, 0x2124b6b9, 0xb0522682, 0x563487fa,
-0xbbd6555c, 0xa1000039, 0xe7ac5dc4, 0x01e8a2c2,
-0xccba6e9c, 0x5bc087c0, 0xe901252f, 0x065149df,
-0xcb52bb0b, 0x8a525009, 0x10a3cc29, 0x39720e09,
-0x1606f7d6, 0x9bd5d50f, 0xa435e0dc, 0x32c6d083,
-0x5c3cf6db, 0x817f750e, 0xe913ea1a, 0xe15a28d4,
-0x0fc339c6, 0xc250198d, 0xd86e13c1, 0xadf8dce5,
-0x8d4a7e3f, 0x7983a488, 0x75daee40, 0xfd988bd9,
-0x12b185c2, 0x0b041e49, 0x8dc977f3, 0x60681d5c,
-0x0c21b6d9, 0x1550cb0a, 0x8470ff30, 0x75289c1a,
-0x00c42444, 0x60eb1572, 0x12db811a, 0x3987082f,
-0xfc24c103, 0x0c9be217, 0x8b277330, 0xe0834613,
-0x0c4b8dfc, 0x4e9b348d, 0x83633efd, 0xf0010ec0,
-0x3930bad9, 0x762eadc5, 0x17c67607, 0x1e74992c,
-0xd5741f70, 0x16a0281b, 0xcc032c9e, 0xd2963f66,
-0x35c1447a, 0x577adeec, 0xb56d1afb, 0x66dd1fe9,
-0x4d00002b, 0x8e12db46, 0x4c0c4809, 0x928cadb2,
-0x58092009, 0x0e241dd0, 0xac2c39e9, 0x28340c94,
-0x64c11f6d, 0xeb0e753c, 0xae01b8a4, 0x4752e104,
-0xc5987d31, 0xd52de1c1, 0x232e11d2, 0x7b2f998d,
-0xdbdb6d40, 0x3ca27d3f, 0x9dc181fd, 0x8b505b8b,
-0x97490271, 0x408586a2, 0x202203ce, 0x0604ec87,
-0x53e378a9, 0xe851c601, 0x84e9f30e, 0x350e1dbe,
-0x664a31ed, 0x64a11874, 0xe146f46e, 0x7220ab08,
-0x0973a40d, 0x83a7612a, 0x4eeab86d, 0xe37092c4,
-0x5a1b92db, 0xf1c54c10, 0x0d8e8626, 0xfd2ae86f,
-0xeb3c5853, 0x3c7e4307, 0xdacfa307, 0xb4ac467d,
-0x7405e2c1, 0x8d77e575, 0x078da15e, 0x48763c59,
-0xb1df0473, 0x132f7297, 0x86b45482, 0x440f7644,
-0x6ddcdee8, 0x400c501c, 0xeb40b976, 0x48058bb3,
-0x6eeada11, 0xc18540a2, 0xf5451c10, 0xca7bb194,
-0x2ba67800, 0x85f98341, 0x383dd182, 0x21348638,
-0x20889398, 0xceaf86c0, 0x371561f3, 0x244c4300,
-0xed8d5a10, 0xff17ee76, 0x8334572e, 0x33391411,
-0x9a011a7b, 0xb8455ae2, 0x01a0dc9e, 0xf120351a,
-0xd1560390, 0x92a61300, 0x312d1a13, 0xbd770edb,
-0xa7860c10, 0xf8bff789, 0x590526f7, 0xc839d101,
-0x3906738d, 0x410276d0, 0x398b7620, 0x730e181e,
-0x6ec50c13, 0xd0881ef7, 0x3bc21f23, 0xfc0a7695,
-0x3a5b0b73, 0x0b8b0f10, 0x3b0c7609, 0x39c80f15,
-0x0d116807, 0x1dfd1b18, 0x490254c5, 0x21d0f71c,
-0xfbd139c2, 0xbad81c3e, 0xd1297f0d, 0x320b383b,
-0x16086557, 0xbbde644a, 0xc468416c, 0xc0466670,
-0xf621067e, 0x0105e3f1, 0x0e8b2893, 0xa3f143ca,
-0x7cc911a5, 0xe9de15b8, 0xde396e46, 0x084018c0,
-0x7cf19368, 0x3f0035b3, 0xaec00b0e, 0xc1084331,
-0xb037b647, 0x481e7749, 0x80049d10, 0x64d8307c,
-0x0d0dada0, 0xe92ed98f, 0x2b6e4986, 0x11eacaf0,
-0x8bad087d, 0x128f6fc7, 0xee29066d, 0xb157a366,
-0x47ec264e, 0x3f5de96e, 0x896d284f, 0x9b80c44e,
-0xf4032962, 0x4ca6e999, 0xcc684c7e, 0x17e9c316,
-0x9730a1fa, 0x12fc299d, 0x944d2e04, 0x60703570,
-0x45b82815, 0xce020b1f, 0x3dbae800, 0xc36ec2ac,
-0x09e8ba1f, 0x3582fb39, 0x4d730ca8, 0xadda2d01,
-0xdf07b0dc, 0xda222e73, 0xa91ffd58, 0xc1c2f905,
-0xc93109ea, 0xcf19d629, 0x3637a542, 0x89d801f6,
-0xa33f892c, 0x888b882f, 0xeb29ec45, 0xb8cf3989,
-0xc4c2a5e3, 0x72f01b6f, 0xd9dee4ad, 0xfafd91bf,
-0xc209f031, 0xa15e4074, 0x5b4daf3e, 0x01498aab,
-0x4ec5295a, 0xd63a1058, 0x15535530, 0x6d6141a0,
-0x15cfbc63, 0x913305c7, 0x362594a1, 0x92ec1f8b,
-0xb577d8a5, 0x3db951e9, 0x3c521d92, 0xe7a805c7,
-0x877809ac, 0xe83dc3c5, 0x64a3b9d7, 0x58906bf0,
-0x9b08f759, 0x2430fdc3, 0xc749c7e2, 0x909037e9,
-0x25889b86, 0xdaddd2e2, 0x37257388, 0xf6c0bf68,
-0x04b6a0c1, 0xb903740e, 0x9a81c287, 0x5b0cd1a0,
-0x10a69531, 0x0d1bfb46, 0x41d02bfc, 0xdb72d939,
-0x827a7e0e, 0x54968233, 0xbb7d0ccb, 0x1c6d2144,
-0x7416d2f7, 0xecc48602, 0x5f10ae02, 0x3d02ba1c,
-0xdd15633d, 0x062d0577, 0x10c03df7, 0x02f56f0d,
-0x697868af, 0xed55b85f, 0xd2e9f713, 0x5f406c1b,
-0xc11fc5c8, 0x475a45fb, 0x35c3db6c, 0xd583025b,
-0xd0be6f07, 0xc309db7a, 0xc1290286, 0x03e2bbcb,
-0xdcdbca29, 0x4f86e0d6, 0x23db16c2, 0xbd158002,
-0x1140c8dd, 0x0be2d177, 0x59d18943, 0x27b1ac44,
-0x6c5bea78, 0xf6ab69bd, 0x79cc49e8, 0x0f40046d,
-0xb60815bf, 0x4141de05, 0x8aeb100c, 0x7f16ab28,
-0xc244700d, 0xd6a1b729, 0x8ae346f8, 0x4330841e,
-0x8a1c7414, 0x06ff9f41, 0x8818fc4b, 0x1cc888da,
-0x38df2bdf, 0x460a75c2, 0xd52ff047, 0xe4751f7e,
-0x0fdf7d1b, 0xe183c3be, 0x41321adf, 0xd1be04bf,
-0x24d0295e, 0xeef7dbf2, 0x147f3b01, 0x744c5e0a,
-0xce5e5b0e, 0x5b06c2f6, 0xbed2229b, 0x118a3842,
-0xb438058d, 0x093cfa64, 0xee92ec76, 0xe20dad0e,
-0x51952f8e, 0xea8918b0, 0x4a184a4a, 0x31f631f4,
-0x644a88ff, 0x170532b8, 0x5ea8e813, 0x8de83e34,
-0xd19d6870, 0x779a3b74, 0xb7eb7ffd, 0x7f02ffa8,
-0x24684209, 0x752e3980, 0x08e6c126, 0xafc60947,
-0x13bf0bdb, 0x89c47e03, 0xc8c17bf0, 0xc6890410,
-0x1c371a22, 0xe53089d0, 0xa4e829a2, 0xf10c80fd,
-0x328dd107, 0xffb75bcb, 0x1258f812, 0x60e402eb,
-0xc09e64e4, 0x8204e1a8, 0xa8a5ee1b, 0x19e809d7,
-0xe8726f18, 0x93f1da90, 0x01681861, 0xcb633424,
-0x4fbbf70b, 0xb8e8a9d0, 0xe6d1b097, 0x08afe864,
-0xf7620f8e, 0x1560e6df, 0xb6d3a6eb, 0xe8b7bd4d,
-0x2efb83c6, 0x743a901d, 0x120e890d, 0x4bdbd4dd,
-0x064264e9, 0x67d5e80d, 0x6c393c53, 0x3d804a19,
-0x7f26c1da, 0x2e2961b3, 0xef10abe8, 0xe8dcbadd,
-0x95882877, 0x13c0b602, 0xa039de6f, 0xeb5bbbaf,
-0x187507f1, 0xb3b753e8, 0x7423c7dd, 0x0823e8ef,
-0x7417c389, 0x240dfbce, 0x74c409e8, 0x0ab3a707,
-0x12827777, 0x3c237496, 0x77fb70ab, 0x78a2e8f3,
-0x11741bf8, 0x7d740404, 0x9bba0fcc, 0xbadf7578,
-0x0aebff93, 0x15f0ba0b, 0x616baacf, 0x1213527c,
-0xd0b6b9c9, 0x84103221, 0x110fe0db, 0x07bf1576,
-0xe805eb58, 0xc9c6979a, 0x906ee952, 0x140ef2a0,
-0xb5681c27, 0x5f01368c, 0x1a2d70f1, 0xb9e9b220,
-0x91402088, 0x83c0f68f, 0x8d809f4f, 0xbe8dd086,
-0x1dc51d26, 0xe4f8d67c, 0x99688d08, 0x8346a281,
-0xfff00a1d, 0xf8873036, 0x3b453d14, 0x83b900b0,
-0xc1bb8daf, 0x4914c3a7, 0xbba4a0c0, 0x88c19fc1,
-0x938bed3e, 0x3ddc83c8, 0x7ed90e79, 0x17d57740,
-0xdfc41418, 0xbd3b3442, 0x1693f726, 0x96978883,
-0xf004750a, 0xc239f00a, 0x381b07fc, 0xc7916ac6,
-0xf79672ea, 0x6346dec2, 0x1175e403, 0x0aa96569,
-0x177efdf8, 0x07ea8130, 0x3b47e281, 0xff6d2c54,
-0x67229afb, 0x61c0208d, 0x29ced70b, 0xe9f51d7a,
-0xe39e7f56, 0x40335f35, 0xf83974b7, 0xf1f75557,
-0xd8afe850, 0x2c6853f0, 0x2c4a2595, 0xe575e894,
-0x9154dbbe, 0xc66e775f, 0xe8241c44, 0x277f4b62,
-0x89e02930, 0x65e972ba, 0x1c0608ff, 0x391c0f06,
-0x3ed6bc21, 0x0937540b, 0x1ed83058, 0x5e018b84,
-0xd3f8c993, 0x67fca713, 0x9c2dbb89, 0x267f012b,
-0x91484264, 0x75ff85bb, 0xa1ad12e3, 0x3ab38bc3,
-0xff09d9a7, 0x30e05db0, 0x39052abb, 0xb7a4f2f7,
-0x1ffebbb9, 0x393276f2, 0x392c7311, 0x139a66b4,
-0xc2df407a, 0x8ea148fa, 0xb9b7a1f8, 0xd338850d,
-0x33093914, 0xd0341789, 0x19d6ddbb, 0x779a3bf0,
-0xa581750a, 0x95302579, 0xe8868d7b, 0x0b4463ee,
-0xd3a07cb4, 0x58184e6f, 0x1d5e016c, 0xb6ba15cf,
-0xd43c7e01, 0x5ebe9f75, 0xbe582b11, 0x7ac13e91,
-0xa14be2e1, 0x20d1a328, 0xa2068710, 0xcf87debf,
-0x0452e03d, 0xd69c0d99, 0x3aa172e9, 0xb4060745,
-0xf8e417e9, 0x2932a1af, 0xfc508dc8, 0xace3c802,
-0x726a3f0a, 0x8951d319, 0x5b7b3894, 0x2415de44,
-0xb16ec310, 0xea4e131d, 0xe6168b0c, 0x9181da29,
-0x8db12fee, 0x0d3ef84a, 0x760a7823, 0xf13e5821,
-0xe10afc42, 0xb2ed960a, 0xa8480d89, 0xc980be33,
-0xc2d9966f, 0x87fc408b, 0x4188358e, 0x39ce0746,
-0x66a8f5c2, 0x767d3c87, 0x3295a05e, 0x3050f1ba,
-0x42f8528b, 0x23d7a0b1, 0x828f7a75, 0x2fb3a1d9,
-0xd4648cc1, 0xa155e2a7, 0xd6f8cee6, 0x0ea2e1fa,
-0x6884bc80, 0x2e28c380, 0xc8a81ae1, 0xf7b04a99,
-0x20b94f75, 0x5303281a, 0xa6112304, 0x20cc646b,
-0x1ecf086d, 0xdb9e66bf, 0x4ab2fb24, 0x417a38e8,
-0x5fd7b00e, 0xd0f015d0, 0x346c1401, 0x7955bbd9,
-0x6d0bb796, 0x88115a58, 0x43e100b8, 0xbd0869c5,
-0x01331ea1, 0x07bfec8f, 0x0a124f7c, 0x22ffec34,
-0x9d032d18, 0x7b7520fb, 0x081a14a1, 0xadb94f5f,
-0xe80af508, 0x6cf4a75b, 0xefe86122, 0x282aa7b1,
-0xe0ebe80a, 0xc02e02a9, 0x43f728b7, 0x58594fdc,
-0x49e2ce9b, 0xc433e836, 0xe8450d3e, 0x61dc80be,
-0xbe0028c1, 0x45f7dc30, 0x150b502c, 0x1f1ab9d7,
-0xcc22eb19, 0x128eb99e, 0xe3d8cf27, 0xb2e98be4,
-0xd0753315, 0x3a20cc8a, 0xa29789e3, 0x189a4b04,
-0x0d370806, 0x061e3617, 0x5e055b59, 0x1ce43d12,
-0x4a08ef29, 0xcaf176d0, 0x147b8115, 0x46c3ff00,
-0x9d7502a5, 0x438daf04, 0x13e8501c, 0x936db02b,
-0x18ca4210, 0xe0161406, 0x311be276, 0x00848db6,
-0x2ad21ff3, 0x9509b604, 0xa994abee, 0x280e45a5,
-0xc1183f54, 0x8c68056f, 0x03c6661c, 0x80597845,
-0x4128df5c, 0x03884558, 0x2e891dc6, 0x04e3dde8,
-0xc8370500, 0x5ca7c54a, 0x88ac1255, 0xd048c343,
-0x0618e7f6, 0xaca1ed09, 0xb540ed01, 0x8906bb1b,
-0x6b70dade, 0xe8b314c4, 0x1b90f6aa, 0x219a2070,
-0x16eb7687, 0xa28e54ce, 0x51a41363, 0xd40fef42,
-0x1040ea0f, 0x643e0539, 0xb445b423, 0x3241fc80,
-0x602ee7c0, 0x2df6206a, 0xaa14c294, 0x836a341a,
-0xed2d8abf, 0xd46897ed, 0x02ad4194, 0x3c02408a,
-0x7866dbf8, 0x3c3c23fb, 0x09e9ec75, 0xee463b68,
-0x180fe302, 0xf0304e3b, 0x01b074d4, 0x5588b57b,
-0x039173b4, 0xba8768ae, 0x700c407b, 0x51cd54a3,
-0xbf8ab6dc, 0xc6110688, 0x55d57943, 0x83439bbd,
-0x31e514e8, 0xe88ed90c, 0xe7e8ad47, 0x1e58c6f4,
-0xbae0b6ee, 0x56225a98, 0xcde80343, 0x87689619,
-0x86c65241, 0x59a1fc95, 0xa39e0bc5, 0x7153a845,
-0xd427243a, 0x582647e8, 0xb53f11ca, 0xec707ee8,
-0x4b6f8c43, 0x46727e8d, 0xb6edc214, 0xeb8351fb,
-0x0edf860c, 0x5f030247, 0x1ceb5d04, 0x7947c3f0,
-0x6e3de8f0, 0xf1110ad5, 0x3bd45dba, 0x0623c35f,
-0x8e9f4307, 0x00892520, 0x9ce5c263, 0x4f28c7c5,
-0xc256e804, 0x1c070169, 0xfcb96c06, 0x782a06ee,
-0x4e8ff42c, 0x760df983, 0x5b5015e2, 0x595d1d6f,
-0x66e40c42, 0x090d5a07, 0xc855ed09, 0xc066a76c,
-0x4988002b, 0x5906fdb4, 0x097d800a, 0xd8640f11,
-0xf152a9ec, 0xa9555600, 0x7b0340c4, 0x546573b5,
-0xc68f5dce, 0x46083cdf, 0xb0bd4681, 0x07bc2fb3,
-0x3974b516, 0x0405663d, 0xf19b778d, 0x5626c10f,
-0x0e6f8db6, 0x30fa3ee8, 0x6d006c09, 0x4bbae77d,
-0x6d883eca, 0x0f1108c6, 0x8e45143b, 0x1bdddfb1,
-0x5f385102, 0xe856531c, 0xde0c310c, 0xffd9ef1b,
-0x83561677, 0xe85720c7, 0x041127fa, 0xea743468,
-0x60f336ec, 0x0468060f, 0x550fda31, 0xd6b7086a,
-0x0792665a, 0x79fb402d, 0xe026c08e, 0x0595e0e9,
-0x852cdbf7, 0xdab6d188, 0xc1fb0fc4, 0x430b740c,
-0x1b815762, 0x2548c031, 0xbff1bf21, 0x8d38126a,
-0x528a0e6a, 0x3cbbc60e, 0x53870f0a, 0xa0c4e28d,
-0x932bc6fe, 0x42a7005a, 0xfacd7b89, 0x0b10cdcd,
-0x7fbba954, 0x89c5f7fe, 0x823f2c06, 0x5edab074,
-0x6194c6b0, 0x70846519, 0x5c627c56, 0x582478d1,
-0xef087594, 0x46e91c19, 0x938f3a1e, 0xcd0e1f8d,
-0x22c6833a, 0xae544584, 0x56086f6e, 0x86742b04,
-0xa02d5cd6, 0x8780bbf0, 0x7e836b13, 0x62db0627,
-0xe8977c2c, 0x0f30fd26, 0x277b6c4e, 0x694506bf,
-0x1de3240b, 0x86ddb74c, 0x05dc3d0f, 0x13cf8fff,
-0xeac8148b, 0x533ff614, 0xae09346c, 0x240c8b74,
-0xf308748d, 0xe33c4b80, 0x29312278, 0x0e73cfd1,
-0x8dde15cd, 0x0e152962, 0x3b203445, 0x0eb7dbd0,
-0xff0f7c03, 0xebfc15fd, 0x3501dfe7, 0x68f8ae81,
-0xfdc443e0, 0x60bf10e8, 0x4cf86e8a, 0xb9057e07,
-0x97f14b07, 0xc3843762, 0xf6e8e3d3, 0x96c751f2,
-0x71e0df4e, 0x99a4071c, 0xb129f9f7, 0x976b125f,
-0x44b72849, 0xd6381048, 0x45de2ec1, 0xa173748f,
-0xca89d9d4, 0xb18b54a0, 0xfe2423c8, 0x8db196aa,
-0xaa4fdb43, 0x460813b8, 0xb56d5b04, 0x07fe76c4,
-0x0616fcf3, 0x6274a16e, 0xe0d1c307, 0x7b18bc80,
-0x1378b622, 0xf0b40618, 0xebdd0704, 0x61740678,
-0x230354c0, 0x132eb468, 0xeb30810f, 0xee031917,
-0x2b028fb1, 0x681b54e7, 0x00d48b64, 0xfcc22033,
-0x42f8e6f8, 0x0362ee1f, 0x596851df, 0x8722a664,
-0x08030680, 0x5dba6638, 0x01a4fbed, 0x6d431206,
-0x15040614, 0x9946b630, 0x57176ddd, 0x56e303a9,
-0x55241453, 0x51cd252c, 0x1374b22a, 0xd250182a,
-0xa9b00669, 0x430ebe22, 0x35a3613d, 0xf876506c,
-0xe001b3d6, 0x21c05b82, 0xc3db0ada, 0x2ce6638f,
-0xf6812e18, 0xf0c345b6, 0xb41945d5, 0xb1e26b27,
-0x6d0f498b, 0xb8a56556, 0x9ad85914, 0xe9c3bb94,
-0xb97718ed, 0x5e975f28, 0x78c53906, 0x50b83c6a,
-0x7f0db1a6, 0xdca36604, 0x341be882, 0x13789318,
-0xcd52ac60, 0x7c3ac214, 0x4f83415d, 0xea699e63,
-0x7001a296, 0x4a24e702, 0x1c6f19bc, 0x42748008,
-0xb8255006, 0xfff8642b, 0x34756832, 0x2be818a4,
-0xe8e85b1e, 0x1b0a1f81, 0x671fbe42, 0x665ac447,
-0xec10e7be, 0x3ae7dd22, 0xec11c040, 0x74c20b14,
-0x07d9efc7, 0x713a02c4, 0xa068cf04, 0x6a9859b8,
-0x13ab3446, 0xb7376227, 0xe80c3544, 0x23e8ff23,
-0x6d18bc1e, 0x3de9d99d, 0x46782b8e, 0x2495e303,
-0xb1406ec7, 0x634a3152, 0xafeb76c2, 0x500176d1,
-0x7ee01319, 0xf1913698, 0x2dd0335c, 0x9b20bdfb,
-0x2c3e414b, 0x7245e3c7, 0x6d88e2fa, 0x00b178ad,
-0x40b43dc9, 0xa5d92bfa, 0x0ca3afb7, 0x5002efaa,
-0x5b053be0, 0xf100f4b6, 0xc0c1ace8, 0x5bdcfb9e,
-0xba0750fe, 0x0f0386cc, 0xfe5de87b, 0xcc458468,
-0x731d665b, 0x0d028bdf, 0x95dbde48, 0x6058bdc2,
-0x5da1b702, 0x0e3d79c3, 0x3a97bab3, 0x8df118c3,
-0x1408f668, 0x24835d47, 0x4a5aa3bc, 0x201c19e7,
-0x1222adb6, 0xf6204e05, 0x2ce88ed8, 0xe984c060,
-0xbac00da8, 0x1309b3a0, 0x63206a5e, 0xb0ee9a02,
-0xcd86c21d, 0x0dce04e4, 0x13a00fd4, 0x20c67db8,
-0x79fda7b5, 0x7e03ff4d, 0xe9357731, 0x75065d0f,
-0x2c578da4, 0x6823a976, 0x1a087349, 0x1a6aff10,
-0xd9180978, 0x32105c8d, 0x63063be7, 0xdbf29a13,
-0xa098fd61, 0x7660da96, 0x2f16dc87, 0x80d009d8,
-0xb3130b4f, 0x38848c8b, 0x384c45ef, 0x222ec884,
-0xb03002e5, 0x231f0736, 0x2d4d7576, 0x4c590178,
-0x75493812, 0x584428f0, 0x2fbd6888, 0x820a583b,
-0xb87d3145, 0x1db05742, 0x391e1069, 0x400249d0,
-0x58c6c0f0, 0x06d519c4, 0x16ef7902, 0x6012205e,
-0x892e4725, 0x6969a1e7, 0xa636f1b6, 0x41aa3da3,
-0x8e528ca5, 0x05fe4276, 0xd8a6e748, 0x0f704d72,
-0x1985b19c, 0x887c0ac9, 0x5bb9c141, 0xf19ae988,
-0xc70ec1be, 0x1559950b, 0xeaab8321, 0x7eb4771a,
-0x0d4f72ff, 0x06416dc5, 0xcece7d8a, 0xdcc03894,
-0x63098461, 0x086c0573, 0x97153693, 0x7ae0e8f1,
-0x484221c0, 0x7e70bb18, 0x4db8a01e, 0x40c1b1e1,
-0x38fc18b6, 0xf0c2a79d, 0x2d06c4e0, 0x7da17b02,
-0x10805588, 0xe857c550, 0xfd19ee26, 0x181a514a,
-0xe997ab9a, 0x585c22b4, 0x5220ae88, 0x25522ebd,
-0x167d383f, 0x1da3a27d, 0xfd756953, 0x09fc5198,
-0xe9018b1f, 0x386efd63, 0xf6be0a64, 0x428a9330,
-0x041f7283, 0x6dc2450c, 0x04b147d2, 0x74d3ed85,
-0x175083ad, 0xfbae06a8, 0x941235ee, 0x03e547b0,
-0xd7ba3e33, 0x1a7e1ab1, 0x97cc22a3, 0xc148d0b6,
-0x9f257df9, 0xf1fdfa20, 0x8b6c2197, 0x2f8c24bc,
-0x068024b4, 0xc1e3249c, 0x83a47e0a, 0x8d98ffff,
-0x831e1e2c, 0x9f6fea27, 0x8424841a, 0x3e4474b7,
-0xbc6c6d82, 0x8018010a, 0x1774cce3, 0x04d09f4b,
-0x9e32be1a, 0xe4020886, 0x0d9c4f76, 0x44afc898,
-0x821fc8a1, 0x012845d4, 0x816c7d4a, 0xa6d342d1,
-0x83f868a5, 0x41809e56, 0xef61ec3e, 0x8c09bae0,
-0x25c4012b, 0x3328c9f5, 0xcb1f47e8, 0x6b948eb7,
-0xa004f9b1, 0xa874bc9d, 0x8edb2fc5, 0xb6f4ea0e,
-0xee391b88, 0x93bd0b73, 0x77863edd, 0xf5720a46,
-0xa82d89b8, 0xafc52854, 0x4c758e05, 0x6a152052,
-0x44c22e18, 0xe840bd57, 0x68b86c34, 0x50beb8c8,
-0x52f42c6c, 0xbb642e04, 0xb67e5c1e, 0x0dbf0141,
-0x047bbab6, 0x225ef130, 0x1bddd1c8, 0x00dd54de,
-0x4e546877, 0xfffe42e6, 0x62c615ff, 0xd988d4c3,
-0xdf7ea180, 0xa09027ba, 0xac846ad0, 0xd13d804b,
-0x304275d8, 0x7f0256c3, 0x1135541a, 0xe5ffe1b6,
-0x2b750330, 0x8001568a, 0x177603fa, 0x83468d13,
-0xc4fd8b9b, 0x37e8ba68, 0x851bee1e, 0xe027b3c2,
-0x0230ff0b, 0x12c122e9, 0x580baf5c, 0x837b576a,
-0x9b49156e, 0x84f6caab, 0x1a7f75d2, 0x3608fb35,
-0x50ac55bb, 0x841d08c0, 0x65df0801, 0x0e2b1964,
-0x8001b381, 0x61dbfdd0, 0x9789a023, 0x9275961a,
-0x05c6ff6a, 0xee85dfd8, 0x12467318, 0xe88e006a,
-0x01e6fdd0, 0x19b3800f, 0x33360200, 0xb656707c,
-0x82028ee9, 0xec7ab7c1, 0x4e7401f7, 0x8f010895,
-0xed89eb94, 0xab475256, 0x6fe8c743, 0xa47aa179,
-0x4a1f089c, 0x0ba3ffef, 0xc58986cf, 0x11187135,
-0x483d32b6, 0x35f8891a, 0xe9cbdb15, 0x8a6eec04,
-0x2709fbad, 0x0e19a218, 0x0310108b, 0x708617ad,
-0xe78c1409, 0xd22a97b6, 0x7a86feda, 0x8ec9311a,
-0x6fe3ba8c, 0x383099e5, 0xb81773d1, 0x396647a0,
-0x16dfed18, 0xdd41af16, 0xf3721144, 0x7405f980,
-0x83800848, 0x481709b6, 0xc0e931d1, 0x8db50bee,
-0x2aa28514, 0x47f23db9, 0x6a2ebbfd, 0x6c4c7ec0,
-0x3c3c0241, 0x3cb00276, 0x76ac7b70, 0x8d5051a1,
-0xd45003c0, 0x03861c9a, 0x10d51220, 0x85d0323c,
-0x03104482, 0x10a21ad5, 0x16a8cf87, 0x075f46e9,
-0xc8fe1d3f, 0x80c9fef7, 0x0b57a7fd, 0x017e807c,
-0x00ea86a3, 0xe13b303d, 0x62008b60, 0x629a4f6b,
-0x8c36e48e, 0x58150625, 0xe91346fe, 0x6d387af6,
-0xa328538f, 0x7aa39a16, 0x15746292, 0x27e84769,
-0x6d5e971c, 0x933b1f49, 0xeb8323db, 0xf67c9c3d,
-0xfc5ae904, 0x0099f43b, 0xdca4b884, 0x3bd5a342,
-0x09ce6f80, 0xf20c0af0, 0xd1f81e48, 0x6fd1fbd7,
-0x718dc1b8, 0x7e8d7d27, 0xf8018002, 0xaae0c739,
-0x8322004f, 0x120e8e5d, 0x80758216, 0x1a25781f,
-0x08dd5c18, 0x77ef6e74, 0x21a5b91c, 0xca7b4714,
-0x0bb02de0, 0x446fb4c0, 0x47b6105c, 0xbf6f80ae,
-0x03877c51, 0x725e7c3b, 0xcafae9a5, 0xba1eea41,
-0x09e4c0b6, 0x27570dec, 0x05db910e, 0x340fe8fc,
-0xd4fdd336, 0xe80b3d90, 0xbd151af9, 0x6c425895,
-0xe9988842, 0xe01b7683, 0xe99cf82b, 0xf0418d81,
-0x1c51a2d1, 0x1e21f646, 0x02f1675c, 0xed20ad8c,
-0x332674c9, 0x313f8981, 0x31158556, 0x11762a5f,
-0xed01b1b4, 0xaf3cf890, 0x0875bf3b, 0x06742cb8,
-0x2a7f032b, 0xb8f47502, 0xa1ddf044, 0x43391ad8,
-0x2dea7504, 0x0f0f0fab, 0xf269515b, 0xf7ccb000,
-0x15260647, 0x73f13eb7, 0x67582e1a, 0xc582e5b4,
-0x9856b49f, 0x981c5a59, 0xf5111a8c, 0xf72a9d7f,
-0x1422ea09, 0x040ebfac, 0x9643633c, 0x141a0626,
-0xdb680918, 0xd2405385, 0x704b5776, 0x3b4890aa,
-0xfa94a3e4, 0xb890d9a2, 0x48c108af, 0x5bdde27b,
-0xffba7f6b, 0x3d107e21, 0xf7ba77bf, 0x55a83aa5,
-0xbc00c58e, 0x805829da, 0x875306c0, 0x8ab5003f,
-0xb6a15711, 0x85e2acc4, 0xe8f9b148, 0xf01ddf44,
-0x8713fd2a, 0xefc1011a, 0xf8f60285, 0xecea848f,
-0x0f6caa49, 0x5a4370ba, 0x962b7268, 0x388c6eb8,
-0x18446713, 0x57554a66, 0x47244e27, 0x216e5605,
-0xe8068f09, 0x0f27194b, 0xdf731a99, 0xebe9d385,
-0x1ea314f2, 0xf30422f5, 0x16bacf60, 0x5952f5d7,
-0xb1566c43, 0xedd02b05, 0x5c57a0c5, 0x386eb9a0,
-0xec81d7c2, 0xa1c10078, 0xd47c0d0d, 0x88ac1608,
-0xfa00a2d6, 0xf7ce16ed, 0x010a84a1, 0xa234081e,
-0xf5034602, 0x0386168c, 0x75136ce4, 0x1abf76e5,
-0xb90c04a2, 0xef824740, 0xcaedd3e0, 0x013cc279,
-0x063e3d04, 0xd8184d0d, 0xd02ab193, 0x2206f351,
-0x8614c3db, 0xf018ff10, 0x15a9820e, 0x18050385,
-0x072b06f0, 0x0fa3f7d3, 0x15c36cd2, 0x2d2f2241,
-0x1b040ce6, 0x34ce8d0c, 0x830b63ae, 0x5416b615,
-0x38168c59, 0x232374df, 0x800f1001, 0x680d6a52,
-0x232cd0fc, 0xe91799bf, 0xff8dc617, 0x060c7f4e,
-0xe814bedc, 0xb73df15c, 0x71010ed9, 0x89ba2e1c,
-0x1cba5ff7, 0x284b0e93, 0xb750fe9c, 0x8f13bfbf,
-0x242c1f9a, 0x436afb68, 0xe8ffb66a, 0xd58a26bb,
-0x7efaf2dc, 0x246a28ff, 0xdca1bd17, 0xc9561ce8,
-0xb0e2e8c7, 0xa7f04ff2, 0x68483856, 0x5728eb00,
-0x87bc7a0c, 0x0c5386c5, 0x09cfee51, 0xe0dd8ca1,
-0x1adc4ddd, 0x892fb2e8, 0x2dc729df, 0x475ed47f,
-0x63158228, 0x22043d83, 0x7fb77424, 0x570c0385,
-0x8b1c2713, 0x2b1c2bd7, 0x611d16fa, 0x6840ec1a,
-0x16e31da1, 0xd2324c04, 0x3d163ac5, 0x821390cc,
-0xb5439c8c, 0x8cd84e43, 0x9e991674, 0x9a4cdb31,
-0x7ff16708, 0xfb8309eb, 0x858f0f13, 0x8b1455f9,
-0xc71c2301, 0x9f5f1802, 0x01d8c25e, 0x50f5f001,
-0x89ed4907, 0x11d84ecf, 0xe5b10843, 0x26a87505,
-0x47ecb6c4, 0x39f685de, 0x895c81f9, 0x48bd8847,
-0x34814375, 0x4ba9186c, 0xe8d38c80, 0x516b7013,
-0x970a6d24, 0x32061d8e, 0xe2ed59df, 0x79941d1a,
-0xbb408ece, 0xf31aae77, 0x3163b702, 0x5d0031a8,
-0xffe53374, 0xe27536b3, 0x838d9903, 0xa0831f1b,
-0xfd16f6c0, 0xef0d6807, 0x0412d3e8, 0x17f5ba47,
-0x6cd23ca1, 0x483944c3, 0x5022a1cf, 0xc8daf1d7,
-0x024c0350, 0x0858c8f0, 0x5abd5177, 0x2b92bc15,
-0xaa495a9d, 0x84575a2f, 0x410dc203, 0xad8b87a3,
-0x03681535, 0xbe1af0d2, 0x02756df0, 0x418dfdd0,
-0x6899682e, 0x4290960c, 0x15cfd61a, 0x0aa3ae1f,
-0x2a61830e, 0xcbf79668, 0x77f068a9, 0x048302b0,
-0xe82835ff, 0x91e4f028, 0xe89e80f0, 0xb494ee6c,
-0x426c84eb, 0x536a8a98, 0xf67d81d0, 0x82e8d960,
-0x6845d714, 0x0e46c9e0, 0x146be416, 0xfffe3cbc,
-0x11dfec24, 0xbd2c68de, 0x00001184, 0x3ec0f2a7,
-0xe81e3f6b, 0xc7a4ef83, 0x25f447ed, 0xe9a20f47,
-0xdfc069e2, 0xad736d55, 0x39ba0904, 0xf738e38e,
-0x408f51e2, 0xc2029b4d, 0x82e7e944, 0x09337044,
-0x3ec03100, 0x144d1380, 0xca3867f2, 0x2c112d52,
-0x0fd1d237, 0x3013c474, 0xa3f6fb04, 0xb40bff03,
-0xa9132740, 0x3960518b, 0x5c418bf2, 0x6a3a2d77,
-0xb5e50e8b, 0x75cdd8ae, 0xada0b114, 0xf10c7fc1,
-0x15477a37, 0x8354578b, 0x891c760c, 0x46d889d5,
-0x8d6e036d, 0xdf57f5f7, 0xe9a63207, 0x19cfa5b6,
-0x6c277c11, 0x5f140b44, 0x396868ea, 0x7764789f,
-0x40dfaf78, 0x77f76085, 0x13548b72, 0x208a5842,
-0xe222dede, 0x775e7268, 0x5876d819, 0xc5aeba02,
-0x10d44da3, 0xadab1c61, 0x03e45e21, 0x10786c47,
-0x6cd913fe, 0xe2054def, 0xff5378c7, 0xd0386022,
-0xac54b113, 0x0a6c3804, 0x90f10482, 0x036d3c33,
-0x29473ff0, 0xe9d619c3, 0xe1a37c4a, 0x8300cd04,
-0x034651bd, 0x43119720, 0x48b1dfc4, 0x5288794e,
-0xda50ad79, 0x0fc466c3, 0xc50fe0f2, 0x9e09b748,
-0xc789da10, 0x2eed3187, 0x51721786, 0x8dbd3bd6,
-0xd1e200aa, 0x340d1686, 0x29e80e20, 0x6eb07bd8,
-0x071f756c, 0x89ecd65c, 0x59d875c2, 0xeb7a0bb0,
-0x89f7de75, 0x06259718, 0x50eb2201, 0xfb9b8aed,
-0xff034152, 0x36104c40, 0x1428bc7e, 0x8b30c61f,
-0x491c4292, 0x86f80a5c, 0x89480275, 0x42037842,
-0x7b3ba274, 0x688b1315, 0x26037c3e, 0x68b50edf,
-0xa22eb131, 0x9b042b68, 0x36427838, 0x3ee103e0,
-0x40358f55, 0x3445038b, 0x3fb4229c, 0x4cf3a771,
-0x003dde3f, 0x4c314877, 0x0fb9d339, 0x71b10672,
-0x6f77fc33, 0x6b77c139, 0x7451441a, 0xab6e40e7,
-0xd8e604e3, 0x28d0c7d1, 0xaafa5ac4, 0x131ca944,
-0x70255518, 0x2c261d6c, 0x60cf78b3, 0x58ec3edf,
-0xf6a9f066, 0xbd4b74c3, 0x514674fe, 0x6bb59ddd,
-0x5028262b, 0x582b4c86, 0xa7fe535a, 0xe30c9dc2,
-0x5c46782c, 0x2960568b, 0x1bec3ec8, 0x194876ee,
-0x014c56da, 0xa5da11c8, 0x70ff6ee9, 0xb30f04d7,
-0x54825036, 0x58285052, 0xba4afc47, 0xfdd0c0e0,
-0xc7bde06e, 0x880f0c0f, 0x20f1a6cd, 0x9fb717c3,
-0x8d71dd84, 0xfbec71b1, 0x50415e3d, 0x3db8d4ba,
-0x2aa7fe28, 0x24b32360, 0xe4ded341, 0x492703c3,
-0xa30dda53, 0x20e1da0b, 0x20bd392b, 0xa0251dc1,
-0xa0bb3610, 0x8163924c, 0xe8029657, 0xa8a6a5a7,
-0x83fc87bd, 0x6f9b6e5a, 0xe9800f41, 0x01d3747e,
-0xe9e7a6ce, 0xdf116257, 0x070afa53, 0x8df6c28f,
-0xc629f1f0, 0x01dad719, 0xc09155cf, 0x50d26705,
-0x85efdc8b, 0xc9bd8bf0, 0x0a41a279, 0x58539310,
-0xe06c8a90, 0x6d164bdc, 0x4bfd9010, 0xb1045b28,
-0xf7443d66, 0x19961bd8, 0x281b7633, 0xbaa92a9a,
-0xd7625774, 0xf80e8890, 0x467c8d5f, 0x2cdcaf89,
-0xc0855d20, 0x227bb1be, 0x8394c602, 0x3d50047a,
-0x230fb1c0, 0x02255028, 0x80309cdd, 0xae46ddc8,
-0x2b3c2d02, 0xda00edbd, 0x2d3c050f, 0x3a80d507,
-0xd75e2e93, 0xbf08ac3e, 0xd67c747b, 0x0805aea2,
-0x0904e00f, 0xe0b06e0f, 0x341c9a6c, 0xc6899809,
-0x2ddf1566, 0x2d49a930, 0x41cdbab6, 0xa3291af0,
-0x155c2820, 0xf472dbf0, 0x723a1d02, 0x1eedf8d7,
-0x89276dec, 0xa3059835, 0xfcc23294, 0x8a49be3b,
-0x4257be59, 0x93572061, 0xc360f846, 0xdc41e852,
-0x63481834, 0x20bf066b, 0x7e5484ab, 0x0f125b98,
-0xc7fd983d, 0x4100000b, 0x18644a1c, 0x23087aa4,
-0x427d0e91, 0x7909c91c, 0xdbe7061a, 0xa9076002,
-0xfee54823, 0xdb71e952, 0xddbe7a0b, 0x97eb6679,
-0xb88d8f09, 0x34760431, 0xb7002b66, 0x8ad056c3,
-0xdb241ee3, 0x6ee883dc, 0x7a808988, 0xbefe4e1b,
-0xa08d778b, 0x720711f7, 0x41d1e915, 0xeeec3efd,
-0x2b78387c, 0xfb813b43, 0x118779fe, 0xdf75bfa3,
-0x07c3f634, 0x2ba4df75, 0x57530eab, 0x5223d9e8,
-0x344c35d8, 0xb910cd8a, 0x82ff0224, 0x8d34ecc7,
-0xfdf8fd46, 0x1ddcb877, 0x1daab7d1, 0x10edc124,
-0xd46d0899, 0x980468a0, 0xa6d0087b, 0x8d2bd3ca,
-0x68ba2d44, 0x58ad402e, 0xfa68bfb7, 0x9db3c580,
-0x042cb80a, 0x69185106, 0x17733053, 0x785c02a0,
-0x34388256, 0xe9722414, 0x0bfb1678, 0x4274d2c4,
-0x35731440, 0x26fb2767, 0x08e9c16e, 0x73280beb,
-0xef753f21, 0x8702c11a, 0x3943dbed, 0x08e175d5,
-0x1e701583, 0x21df4998, 0x28f17817, 0x88c33f4d,
-0x980bba5a, 0x428819e2, 0x6602c32d, 0xa91d0a06,
-0x428ddc7b, 0x06072704, 0xdc306a45, 0xc5d91af6,
-0x693023c7, 0x93c40ac9, 0xb21758ee, 0x6ae81442,
-0xd5a71f14, 0x3c9a0161, 0x52be0564, 0xd6f04dfb,
-0x0c241824, 0xfe8608eb, 0x552e7f24, 0xa9ff2956,
-0x287da4e0, 0xfce283f1, 0xcda8e174, 0x01ee4ee1,
-0x8622dd74, 0x38357926, 0x50f0d0b0, 0x4fd27e10,
-0x873d4217, 0x2ddd02d4, 0x04501961, 0x424d551a,
-0x47236c43, 0x6a172c8a, 0x8446f5dd, 0x18c30b68,
-0x5b547cc4, 0x58d488db, 0xdbbc1af7, 0xafd76b3b,
-0xb5e9fded, 0x456110d0, 0x08ad0a58, 0x700319b7,
-0xdf2ddd1a, 0xb60dec6a, 0xe8def898, 0x544721f6,
-0x9a29ed76, 0xc6f84274, 0x0019036d, 0x2bc6f15d,
-0xe9474ffb, 0x5542b4be, 0x90104a0a, 0x8d806b18,
-0x5b56db4a, 0x0bdf7280, 0x0a7dd15f, 0x0e0c3941,
-0xca44f74c, 0x2d86e166, 0xce0439ea, 0x39d944ae,
-0xed8dce44, 0xe06f6da0, 0x3c1cd277, 0x1004c8da,
-0xaee1635d, 0x2fd80816, 0x916c1a39, 0x3b843edb,
-0x6314fd09, 0xdbd87dc2, 0x2f542fb5, 0xa7d2eb04,
-0x96121c92, 0x47053c15, 0xe0031821, 0xf5537003,
-0x12809506, 0x115eaebc, 0xf34c2a1c, 0xc0954329,
-0x36abbd17, 0x8605ca6f, 0x1874d039, 0x9b375b36,
-0x50ac2630, 0x0d180543, 0x203914dc, 0x052d20dd,
-0x3584761f, 0x73b81088, 0xb1054f21, 0xe21af8c9,
-0x2f17608d, 0x08496a0e, 0x59dd5350, 0x29b8b5f3,
-0x8b648246, 0x4b4cf6f4, 0xf4c285d1, 0xfca3891a,
-0x614d04d1, 0x21dc1dce, 0x00588324, 0x0643d54c,
-0xe027045b, 0xf02307af, 0x0b76daeb, 0x324b6032,
-0x1a334e52, 0x975ece2f, 0x2d560b5c, 0xfd51d0ac,
-0x18148368, 0x072d5650, 0x8365cd35, 0x5c9da4f9,
-0xab585674, 0xe4c780c9, 0xd84c1419, 0x170c1c24,
-0xbbb72c0c, 0x349a1e12, 0x63f62d56, 0x9b1178d5,
-0xe19913df, 0x1a28d06f, 0x21980d97, 0x34205ed0,
-0x12c3b390, 0x330142f0, 0x0a62baf0, 0x7f503b97,
-0xd6a04c55, 0x7510c4f2, 0x60bab908, 0x092d7e00,
-0xc9b5c19c, 0x0c342980, 0xb49f3c19, 0xe07f6009,
-0x08858b84, 0x31df6a55, 0x2934b019, 0x3c083c0a,
-0x252fbe3f, 0x2376ab68, 0x07235b76, 0x296c07ef,
-0x571388ba, 0xdb2e50e9, 0xedb8041e, 0xef3c0721,
-0x80f61d31, 0x240fbdfd, 0x08693e74, 0x4e2a5540,
-0xb32bafe8, 0xc6695b67, 0x775f0828, 0x1022b2a9,
-0x8a1607b3, 0x007a9b33, 0x8bee3dc4, 0x0ab1bb53,
-0xc39d5e38, 0x5829c784, 0x1a1eabe2, 0x6f036773,
-0xa029a3ac, 0x5fc3e96c, 0xab811d10, 0xe272f192,
-0xee42526a, 0x689a5f83, 0x294284a4, 0x8f6d0a34,
-0xff9214c0, 0x4fa35e8d, 0xd00aae3f, 0x1574912d,
-0xe2011a43, 0xc2e94b1b, 0x46c7131f, 0xd07d930c,
-0x1113e04e, 0x73651ac7, 0x2e05ddd8, 0x3810466c,
-0x483e3874, 0x821bcf75, 0x724f8c42, 0x405b5ae4,
-0x8b6c59aa, 0x4663f83d, 0x6d4d2224, 0x9783b0bc,
-0x05f0147e, 0x135646ff, 0xf2df7088, 0x91b772bb,
-0xf0042fb0, 0x02e65f46, 0xcb8b5859, 0xd0560c70,
-0x218382b1, 0xea701775, 0x9a20f5d5, 0x3750a88b,
-0xba35a062, 0x527ec735, 0x6a28940f, 0xa310b215,
-0xfc681b17, 0x50e7922e, 0x89bc1804, 0x6e0b0426,
-0x1c1b2163, 0x071cc9ab, 0x2dd54ad6, 0xe2628f20,
-0x8ccedf06, 0x4d20d17d, 0xbc03ce78, 0xc3023eeb,
-0x8c3f6601, 0x7e060904, 0x98db6744, 0x0884060c,
-0x9727cbe4, 0xe0ceae6d, 0x3fdf5340, 0xea0ed50a,
-0x5694eb24, 0x731676ff, 0xf7aeb849, 0x2e33371d,
-0x12420377, 0x6988750e, 0x68132007, 0x062326c1,
-0x508b1c9d, 0x8a43439a, 0x2a30e94b, 0x4b669d4e,
-0x1059a74a, 0x0e303377, 0xfe04e851, 0xa84d5bd4,
-0x168aa3f3, 0xdff14584, 0xc784eee0, 0xfa801b74,
-0xdf2f7425, 0x45c006bb, 0x8829ffed, 0x20464717,
-0xc76b4075, 0x39a7e583, 0xb143c603, 0x2506d13a,
-0x61f6a028, 0x1f70ab1b, 0x2e3df6a9, 0xa3581c43,
-0x15bc0b58, 0x62d8e873, 0x23088501, 0xbdb930f5,
-0xb94e0041, 0x011219bc, 0xedcf140a, 0x00b8086c,
-0xdb1bad68, 0xf477f5be, 0x783c20c8, 0x6415b20c,
-0x65cf2c08, 0xbd40fa64, 0x43f92101, 0x638cba47,
-0x30da0177, 0xe8043c88, 0xb345542f, 0x0feb3930,
-0xdf0e4583, 0x2862b800, 0x038aa6f2, 0x06430788,
-0x47fa8fb3, 0x848be4eb, 0x810683dd, 0xda26d80d,
-0x843c1818, 0x6f462e16, 0x4fccc0f0, 0x1ebe902c,
-0x6bd34ee8, 0x1d6c576e, 0xfef03046, 0xbba7da08,
-0x87954c86, 0xb137534d, 0x0f7b2304, 0x85b11273,
-0x0764494e, 0x350132d0, 0x0de0f9eb, 0x80afd476,
-0xd884ebc9, 0xbff8e8d3, 0x8a1da5e3, 0x0938cf80,
-0x004588d0, 0x04e98345, 0x1d08e879, 0x50e583dc,
-0x5088f527, 0xfedeecad, 0x801bf250, 0xd2ed1156,
-0xdceb89bf, 0x0d7f762e, 0x1e0ab999, 0x1c38f9f7,
-0x0bb6038a, 0x14e6942c, 0x6667f255, 0x7460f700,
-0x041e0018, 0xdeaa0c89, 0xc12ebf80, 0x450502fa,
-0x96d8c229, 0x75026d1a, 0x0bbd47be, 0xe6870aef,
-0x022a6ffe, 0x434a0b88, 0xf177da39, 0xdb7dace9,
-0xa3ad6f5e, 0x8358df6f, 0x306402c5, 0xe9310454,
-0xb164dd37, 0x9b1ee865, 0xd0301e45, 0xe9c46280,
-0x10306973, 0x3fb82c76, 0xe995d20e, 0x182fcb8f,
-0x6a2cd530, 0x76d8bac8, 0x41b0d81e, 0xb1034103,
-0xe85516e0, 0x226dd67f, 0x3ac501ab, 0xe2771d43,
-0xd419e94d, 0x44600ab7, 0x390653ff, 0xae91d9d3,
-0xde73aafd, 0xe43f7351, 0xda79fcf9, 0x43b60e5a,
-0x3dbf503b, 0x776bfbdb, 0x45af3d86, 0xcdf45cf7,
-0xaabfe92d, 0x0e5c83b1, 0xb7d16303, 0x9c1314fd,
-0x4e450470, 0x16acf17b, 0x1ec5a12a, 0x50d890c3,
-0x1804148d, 0x52db85ba, 0xb808cfe1, 0x8a307414,
-0x6d32b907, 0x84d2d2f1, 0x74342628, 0x1b5f3822,
-0x0ba5e26f, 0x36c188d2, 0xe720488d, 0xd188c888,
-0x776fd10a, 0x38204a0b, 0x0375ca08, 0xe817754b,
-0x430d6d05, 0x7a15d202, 0x5eba27e1, 0xcb891508,
-0x4201808a, 0x88ac4541, 0x2df62ead, 0x4f09f452,
-0x89b94c1b, 0x8bb64ade, 0x74c2b7ba, 0x41034ea6,
-0x66f02343, 0x9d34d577, 0xd34c543d, 0x4204eb94,
-0x76eec06c, 0x24fa7505, 0x48424102, 0xe976ce4c,
-0xc93746d0, 0x1b74fd1f, 0x2cdfa52c, 0x74430307,
-0xf3754906, 0x5dda34c6, 0x955760b0, 0x1a2ac34a,
-0x15f4161e, 0xf0993a02, 0x0efdc2d3, 0x20da51b5,
-0xa8ef05eb, 0x025ed8a9, 0xd738108a, 0xa05728f5,
-0xa92db300, 0xbac1b05c, 0xa01ff155, 0xf7aef2df,
-0x388449d1, 0x836d4010, 0x3b4827da, 0xab9d19f7,
-0xb8574cf8, 0x89d6384a, 0xfa0377c0, 0x801174c8,
-0x404a1739, 0xd10505e4, 0x75805bf0, 0xc3c829f4,
-0x0744566e, 0xa295cdda, 0xcf7cff31, 0x2d350c05,
-0x03f11675, 0xa215748e, 0xf189ed86, 0x6e161a74,
-0xafed3810, 0xf5ae76b1, 0xbbc39d5b, 0x3543f374,
-0xbbd9a708, 0xebd5b147, 0xf39556e9, 0x5c8c83af,
-0x0d4323d8, 0xe8874314, 0x75267e04, 0x815a73e3,
-0x09861474, 0x3079f089, 0x04b77542, 0x01d86481,
-0xee4c59c3, 0x58f7505f, 0x9b0f3c74, 0x745a5e16,
-0xc56bb909, 0xe574822f, 0x3d5d94a3, 0x1deaa5ee,
-0x540a1d8b, 0x2bf174db, 0xb2f7efd0, 0xc4753b28,
-0x1f05c764, 0x6c410000, 0xf2120821, 0xecf62c1e,
-0x10bbf6d8, 0x5a5b3f2f, 0x06895659, 0x088fc353,
-0xa4f6902f, 0xd9c206eb, 0x0171e153, 0x36204143,
-0xb3205be2, 0x3548c593, 0x6a5b0820, 0x0d8c30a3,
-0x65f685a4, 0x856f9282, 0x02016dae, 0xecd01813,
-0xef754e4e, 0x62e18c3e, 0x0c371a69, 0xda0b74b1,
-0x21d856c6, 0x428cc402, 0xef27f52c, 0x8e20c413,
-0x4e5c8b31, 0x0a9a1100, 0xf218154e, 0x5bf68c1f,
-0xda89cdf5, 0x03122774, 0x14ebce89, 0x89db750c,
-0x7ed49055, 0x80174e30, 0x952f5bd2, 0xe87dee71,
-0x6c163d4f, 0x08daf910, 0xf9834978, 0xf7b7e96d,
-0x9fb30c58, 0x8aff508d, 0x7e382142, 0xbf1473c1,
-0xf275180a, 0x18a284c2, 0x5ef3e2a1, 0x07c6d0b8,
-0x77537cf0, 0x628b0df2, 0xb8400ca9, 0xf4433510,
-0xd0791045, 0x40c850c8, 0xbf3d8070, 0x52e1c3fd,
-0x087256bc, 0xb201c84c, 0x6211403f, 0x088be399,
-0xd8ecffd2, 0x37ff8ab0, 0x4601b25c, 0x8c30284f,
-0xc7eb85ba, 0x643a8305, 0x00097782, 0x11e235dc,
-0xe84f54aa, 0x8a84d212, 0x28075464, 0x9648f150,
-0x60caa829, 0x09288a08, 0xf416c1fe, 0x16740301,
-0x6d152c3f, 0x76c416f8, 0x3813e811, 0xb608c321,
-0x111db1c1, 0x85e89e07, 0x6dedfa10, 0xa6e9ac55,
-0xe6eb170a, 0x50a5e5e8, 0xdb2395bc, 0xc8eb010a,
-0x6082dd11, 0x016a6c20, 0xfc0420f4, 0x99a4bf6f,
-0x0f75fb49, 0x05b50678, 0xb0a76ab6, 0x804bc301,
-0xc263e429, 0x04160d8b, 0x66f86ed9, 0xc508eac1,
-0xe84075c5, 0x2d98a290, 0xb5990240, 0x49c5822d,
-0x9be889a5, 0xe2d41090, 0x53681b8d, 0xfb97881a,
-0x0ce8cbee, 0xbe1538f8, 0x38b87535, 0xd407bd05,
-0xb0fa2305, 0x93e6dfeb, 0x83b6f106, 0x0c755d41,
-0x148c0336, 0xa257ba7d, 0xc031000b, 0x921b6056,
-0xfed84714, 0x0899022d, 0x2daa5bdb, 0x16361e7c,
-0x1c5fd7c1, 0x0816e374, 0x3d3ec21b, 0xdc544f6c,
-0x6c0fd856, 0x54cffa4a, 0x328b02f2, 0x64fdd468,
-0xf684399b, 0x30a36b7c, 0x86903f00, 0xb70f07ef,
-0x068a0a47, 0x06f56b75, 0x61f80857, 0x03a4680b,
-0xbf791f29, 0x7748220b, 0x6c2b1274, 0x02bb77aa,
-0x512b6831, 0x348d3202, 0x6f8eba10, 0x80de29ff,
-0x8901037f, 0xba0911f5, 0x10a98d14, 0x6b60064e,
-0x1fa44c00, 0x151dd5da, 0x1315c826, 0x40bc387e,
-0xc5161c35, 0x35b8a929, 0x4c0d8a3b, 0x3ab83bbe,
-0x06305155, 0xc25e14bb, 0x3407edce, 0x3dda1e22,
-0xeb1f06b8, 0x5c733ede, 0x1c746e22, 0xa9f289e7,
-0x18b70e6e, 0xe98944dc, 0x3487eb0e, 0x0f080300,
-0x5c414984, 0x8121fcb2, 0xff128278, 0x1c21de02,
-0xe2dc69f6, 0x0a24faf8, 0x682b2d3a, 0x5d034484,
-0x857205e9, 0xe8a14f62, 0x572a5b39, 0xec1924d1,
-0x2b620d0b, 0xdc374137, 0x5f0ae687, 0x3d0843d0,
-0x85895c0a, 0x6d44b636, 0x894dde8f, 0x6fc3130c,
-0x391c5cb3, 0x8b40d8a1, 0x1e101c00, 0x2c46b6eb,
-0x30402e3a, 0xb6ec0001, 0xa43642c8, 0x81c6c20e,
-0xfb8c038c, 0x82cd77ef, 0x52c2b902, 0xc3d64249,
-0x2ca1ebc3, 0x69fd15ff, 0x4b82e11f, 0x0fb702d8,
-0x24a8a126, 0x3b64f5e2, 0x05aa0903, 0x8c28a1a1,
-0x482fb56d, 0x37880a07, 0x55887bf5, 0xbd54424c,
-0x8708e21c, 0x3d2badae, 0x09420b2a, 0x2e140a76,
-0x0da08714, 0x9beb3b1e, 0xeb6011ba, 0x030a0358,
-0x08030728, 0x6bd02a2b, 0xbba62409, 0xe221d9e4,
-0x85bce057, 0x112b50fa, 0xbbfb0b39, 0x077a2138,
-0xea6808b5, 0x02a74191, 0xda037b7c, 0x3f1a7b8d,
-0x98968012, 0x4882d583, 0x976f16c5, 0x0e06622f,
-0xd8d70420, 0x446a08c1, 0x3f068fab, 0xa50a43a0,
-0x91164774, 0x760e35a1, 0x0c4fbb3e, 0x180a08c5,
-0xc0531543, 0x0ea0b75b, 0x752b0f03, 0x8108257e,
-0x495d7e13, 0x031c0216, 0xef596f6c, 0x98b1f833,
-0xf0eba408, 0x5add7548, 0xc5087b18, 0x22d5cb6d,
-0x9d024e01, 0x1fc18b15, 0xa752c559, 0xc8841d87,
-0xcb3b0e25, 0xb0f03af1, 0xeb6567b3, 0x182224d0,
-0x5bb0ca74, 0xeae64630, 0x76247652, 0x582d05e3,
-0x26c1b28f, 0x3b3dea03, 0xb7eb3150, 0x877bc11e,
-0xf2e46305, 0xd9dd0608, 0x533c2308, 0xff191073,
-0x54371213, 0xe8845283, 0x8012f752, 0x0f0b1441,
-0x1a027032, 0x93160cd9, 0xabc54888, 0xe18d08eb,
-0xfb855ffb, 0x7f547423, 0x08003d45, 0xff084420,
-0x8d7cd132, 0xf717e856, 0xb0473818, 0xe9589570,
-0xe3051f85, 0xde134b09, 0xe0ca9636, 0xfbabf777,
-0x1dcce9d6, 0xbb75983d, 0xb9eb0324, 0x6038c005,
-0xb3eb0270, 0xe3f85e79, 0xe04031f7, 0x30557504,
-0x5934832e, 0x2f183c43, 0x24120d2e, 0x18dae8d4,
-0x136e8b57, 0xe0025648, 0x08441d6e, 0xe08a83cc,
-0x0fb4469b, 0x260d0c37, 0x568f2066, 0x08f5018c,
-0x02604475, 0x6d8732dc, 0x5750183d, 0x4254d1d7,
-0x37c01d82, 0x3ba9eb43, 0xb074eb05, 0xb23dfa02,
-0x18a30212, 0x87b497eb, 0x41b1f65c, 0x6dbe7470,
-0x0bb14109, 0x718966ac, 0xea9ac7ba, 0x54666b87,
-0x12184f78, 0xc1879089, 0x6094a0c6, 0xb4980e1c,
-0xd82a0ec2, 0xa50f74ff, 0xdac79c05, 0x8a3ac0da,
-0x8aea2ef5, 0xf120065f, 0xf72120c0, 0xe07ec21b,
-0xf3af178a, 0x74272df6, 0x2b2adaa0, 0x786d811c,
-0xa6bab0f6, 0x08d71f74, 0xd0979e50, 0x87684fbd,
-0x1c2e3833, 0x9c828dca, 0x0435e8af, 0xe4c7825b,
-0xd9c308ff, 0x0c099882, 0x82c7df5b, 0x03260090,
-0xdf0066b1, 0xaf07a3ba, 0x539c156e, 0xc8cde306,
-0x123620dd, 0x5152164b, 0x054b60ed, 0xf4f27c21,
-0x8e8233ee, 0x56fc1870, 0xab7b4953, 0x509abc07,
-0x8b2eb020, 0x07ea7ab2, 0x048dfd88, 0x15793b3e,
-0xb3512873, 0xc68c76c9, 0x504a3304, 0xbd12803b,
-0x632dbb46, 0x37d5d5e2, 0x940f00e3, 0x53c8d1c1,
-0x8310fac0, 0xf5d7498e, 0xd1c960ad, 0x555bbb50,
-0x1a2951e3, 0x5ef1ac79, 0x73fb5302, 0x7dd50082,
-0x86868b58, 0x18375a14, 0xc11163c2, 0x82968bec,
-0x20c20ff4, 0x94ffd24c, 0x79a56808, 0x147630ee,
-0x2bd364dd, 0x26846a0e, 0x0e019900, 0x910978de,
-0xe39e5b62, 0x65d9f53d, 0x5b04302c, 0x66c06a00,
-0x50756f41, 0xc836c37c, 0xd2911e34, 0x359c487f,
-0x26c719d2, 0xa001fd00, 0x0b191b14, 0x23898b3c,
-0x210ec094, 0x9cf4a06e, 0x8fec2390, 0xa305748d,
-0x39013300, 0x21222c66, 0x8225f72d, 0x07900d0c,
-0xbc45bc8b, 0xfbe7b56b, 0x473b0b5a, 0x96b6a210,
-0x53701382, 0x895ad6b9, 0x126a396a, 0xc5fa2ed2,
-0x39f69bd2, 0x87e275d0, 0x018b300c, 0xcd0ab1ed,
-0x8dde62de, 0x1d18f870, 0x1081dc07, 0x960f2b41,
-0xc2b59b0e, 0x73f039eb, 0x533c7e4e, 0xa39a2814,
-0x10ab12a3, 0xf51785a7, 0x51495e30, 0xf7a35208,
-0x08b167f1, 0x0e7360a6, 0xc8302c3f, 0xff120761,
-0x5a11d9f3, 0x07aa13ec, 0xded08908, 0x6170760d,
-0x8f6aeca9, 0xab327ba0, 0xb0558dc8, 0xd993bb08,
-0x8ec1460a, 0x2dd230fe, 0x1a89ee6e, 0x677c1d81,
-0x9e896014, 0x772b9251, 0x40bf01b0, 0xd305ba89,
-0xbfd10a5f, 0xe76d416d, 0x0e0e672b, 0x698d0c77,
-0x5d83fd1c, 0xfd819d00, 0x7ec68973, 0x617a3e19,
-0x7e0632d4, 0xce1215bb, 0x8e74e9d8, 0x9757f365,
-0x23e86cef, 0x39c05628, 0xa211f0ff, 0x01fb7286,
-0xba238a55, 0x7791512d, 0x1ecc3e8b, 0x34388a55,
-0xc400c0ed, 0x316e47e8, 0x446874c0, 0x64107a4b,
-0x412ecfb4, 0x2483ef99, 0x75dbbfa7, 0x4eda4264,
-0x00599600, 0xc47b6859, 0x2a7cfb43, 0x838f8bf0,
-0x3477831d, 0x9e8df6f2, 0x340fbef5, 0x5e07a84f,
-0x1286c6fe, 0xd8bb3202, 0xa50147a8, 0x4618c606,
-0x1c5524d1, 0xb6a8c160, 0x073a80cd, 0xf23c8c44,
-0x140aa110, 0x2b1814a1, 0xab878118, 0x0c7dac86,
-0xd62b16c6, 0x2c4d0ced, 0x1c040800, 0xc8e4776c,
-0x68efeffc, 0xec686600, 0xcc0ea818, 0xd6017c73,
-0x2fdb0804, 0x449c9154, 0x7404ec0a, 0x4057113f,
-0x06aa0753, 0x7dd2c604, 0xd0532942, 0xfa8161cb,
-0xf88a56ec, 0x04b941d7, 0xd1890273, 0xc0ef42bf,
-0xef93ea4b, 0xf45e5bba, 0xa2840d3e, 0xbc75e21d,
-0xa11c4553, 0x895364a8, 0x9b6e8cda, 0x6d22c93b,
-0xc6eb4904, 0x01c330ac, 0x56a95e0b, 0xa411c3aa,
-0x402540e4, 0x7d44358e, 0xf896e3e8, 0xb7e876a4,
-0x1bbb766c, 0xbd76e831, 0x04991d11, 0xa56f8b23,
-0xd9afbba8, 0x0965bed6, 0x0fe82a08, 0x1d3b83c0,
-0xd329fa04, 0x3ab0dc46, 0x296dc016, 0x93b9c0d0,
-0x68f0d427, 0x1e12f581, 0x22c8f074, 0xaba92360,
-0x091c5811, 0xdd109cce, 0xacc860c0, 0x161d85b3,
-0x3f142914, 0x0c149a16, 0xb612f6f4, 0x3a29b86d,
-0x0b0b840f, 0x080e417f, 0x457d010a, 0x6d78d7cf,
-0x48b6eea0, 0x368fafdd, 0x030e5201, 0xf58e0f3f,
-0x0ab16a1b, 0x52f34dde, 0x55236ce8, 0x80b9d3b3,
-0x963026c3, 0x64156bed, 0x200a7a40, 0x45d15172,
-0x655340c6, 0x346d849c, 0x0edea0f6, 0x495c3b15,
-0xc4db6db1, 0xb4ebb003, 0x17270d18, 0xb65b1936,
-0x0a0e5b03, 0x21cb3678, 0x0b1b6fdb, 0xf8c6100e,
-0xb71c3f0c, 0xd238a04d, 0x711bf3f2, 0x91b6c6d0,
-0x32ab4231, 0x99420f0e, 0x46ddf6e4, 0x02ba0e33,
-0xd9427008, 0x30a0cd00, 0x81fc6b0f, 0x839ac6db,
-0x1bf38912, 0x4b370f55, 0x1b6c6546, 0x0e103019,
-0x09114660, 0x92a458cd, 0x5a49304d, 0xefb11b0e,
-0xf3240536, 0x89d63301, 0xbcd984e6, 0x3319b1ec,
-0x63627507, 0xfeb7f093, 0xd6e8aeb6, 0x64d684b6,
-0xcb760a7b, 0x5d5bb536, 0xef4d3d2b, 0x8c2d3475,
-0x57cd236d, 0x222289fd, 0x6ad35d82, 0x238db636,
-0x255d050e, 0xec364df0, 0x03024441, 0x4e448f00,
-0xfb03dd63, 0xe9fe4472, 0x3112f941, 0x22717357,
-0xc475d977, 0x0c45e917, 0xd65eeb09, 0x1516ad9d,
-0x41022eee, 0xa6ec0f35, 0xefe99a23, 0xf30612fd,
-0xc1041ddc, 0x21a4e651, 0x9cf6135a, 0xfedde9ec,
-0xccf0aa10, 0x7759f147, 0x34f8bac2, 0xf62347a7,
-0x7d479412, 0x7b723613, 0x91763695, 0xee909c70,
-0xf4dd3684, 0xfabe5d12, 0xd2137d84, 0x37f95b4a,
-0x909cd612, 0x24f2a8e6, 0x2511f00f, 0x17764245,
-0xfcfe12ed, 0xdb09bf65, 0x12ebe992, 0xfcd8974b,
-0x65c236bb, 0xccd9fbcf, 0x5ac803cc, 0x137d84df,
-0x47a33444, 0xbd9080b4, 0x126139ac, 0x5a7df8f6,
-0x0f61efbf, 0x7e49f213, 0x36593a31, 0x37d979d4,
-0x364612b9, 0x01c8faf8, 0xab060709, 0x041eebe0,
-0x061c5685, 0xa83b6de0, 0x26881a64, 0x712f092d,
-0x831d0ba8, 0xe823c1e5, 0x0438b69c, 0xb781fb80,
-0x085ac96f, 0xf4073570, 0x344d8950, 0xbde6b68b,
-0x5d1cb3d3, 0xc1e8f8bf, 0x0bb308e3, 0xb3e835c2,
-0xb7fb96b8, 0x53b108dd, 0x0e2d827c, 0xfcfad6ff,
-0x4409a1e8, 0xfaa8df60, 0x0a88e430, 0x5fc4b6d9,
-0xb0193cc3, 0x8a38b076, 0x0b3c434c, 0xe4990585,
-0x263a643f, 0x77b02ef9, 0x29043a09, 0x416b02e4,
-0xb08b78b1, 0x0c2efc87, 0xeb81c63d, 0x49907881,
-0x3a0a2bbe, 0xdf24b08b, 0x0d775805, 0xa90c4e3c,
-0x7773d858, 0xf05aa870, 0x1f2dd54a, 0x18156ad5,
-0x68b08ea7, 0xe0070224, 0x60dfbbd0, 0xb82ca3a3,
-0xf3a80f5a, 0x6739f029, 0xd8a01540, 0x6672bef7,
-0x1afeb61f, 0x335f3b81, 0xb04c5f32, 0x2510c3f9,
-0xef7aaba0, 0x8be67323, 0x0d5b2535, 0x0bbfec3b,
-0x24b8db9a, 0xe8494350, 0xe98980c4, 0xc4bdb709,
-0x85d689b6, 0x348d97d0, 0x25046f33, 0xdb622215,
-0xb7892fc0, 0xdec9d993, 0xb19f997a, 0xb63291e8,
-0x444dbc80, 0x7ffe802e, 0xbdc0e810, 0x810c1550,
-0x084857fa, 0x8a4f76a8, 0xf0967053, 0x402fe4cc,
-0xe8e093b0, 0xf42058a9, 0x587b8191, 0xabe9fd05,
-0x17eaa720, 0x51091f0b, 0xbe8c4384, 0x4c055bfd,
-0x02107dc2, 0x0742130c, 0xc984f87c, 0xd404d428,
-0x008a4d92, 0x2baaaf62, 0xd18189d3, 0xe809f777,
-0x04271218, 0x7700433d, 0xe0d0f721, 0x19a35e96,
-0x3cd2fee7, 0x34a22489, 0xd66844cc, 0x93083b2a,
-0x3596a46f, 0x95d3756b, 0x23bfd52f, 0x80c21f15,
-0x528c4374, 0x72006850, 0x68310fbf, 0xe3fc38d4,
-0x007047a1, 0xf4d9c0f8, 0x9810880e, 0x19fc686f,
-0x11cc89e2, 0xe9ac4f7f, 0xebf08479, 0xf1402ba0,
-0x446a8392, 0x61e4534b, 0xbffba088, 0x83fd7b14,
-0xd08801ca, 0xb0b261e6, 0xf11a4305, 0x040e8de2,
-0xd9df42e6, 0xdf735cd8, 0xe9c3c308, 0x5e29d9d6,
-0x153f0510, 0xdf190091, 0xa0d5048d, 0x3b550f6d,
-0x028208d0, 0xab6e0b6b, 0x3b0880c9, 0x85041003,
-0x02062a5e, 0x4b83baad, 0x23bbec86, 0x8907d840,
-0x02b0e953, 0x723d0000, 0xd2ec5ff6, 0xd3ba3a37,
-0x2410624d, 0x55020f06, 0xbc578b33, 0x182500bf,
-0x3105fa21, 0x0add03c4, 0x8fddbfd5, 0x151868ee,
-0x071b05c7, 0xa50e1fb0, 0xb642b9ea, 0x28452209,
-0x08c19ee4, 0x0a05c225, 0xc00e7908, 0x07e50015,
-0x02ba467c, 0x0409e500, 0x1f158b14, 0x7845056a,
-0x3b57d4e5, 0x4234459a, 0x9234687d, 0x2176c6c9,
-0x286624a3, 0x42502c40, 0x09306ebe, 0x49374006,
-0xfe9eeec6, 0x891d5068, 0x443d401d, 0xbae114ac,
-0xdc8c0948, 0x111a9a4e, 0xffff540c, 0x6dd7050c,
-0x29fa16f4, 0xc31a5c77, 0xb03efd51, 0xf46854e4,
-0x27e84827, 0x83b0eebe, 0x5227ec6b, 0x480209f0,
-0x52eec2b0, 0x127131c1, 0x280c3192, 0x1ecc331f,
-0x04312836, 0x091eae28, 0xaf90615f, 0x077e3103,
-0x2320314c, 0x142324dd, 0x1c070918, 0x35f60a92,
-0xac4c3101, 0xb1926ebb, 0x28342442, 0x1b07092c,
-0x1f8084e4, 0x01661728, 0x0db19268, 0xc0688e51,
-0x00b0b431, 0x5cb86c10, 0x5b0f2806, 0xe85b9e39,
-0x68b5c0e5, 0x878468ce, 0xe8e10fc1, 0x7518b01f,
-0xb5eae012, 0xe57b1072, 0xd9208b1c, 0x10a3ca6b,
-0x093d960e, 0x03201bf8, 0x127b75e8, 0xbe06e990,
-0xbe1c0a0e, 0xa64204d5, 0x8c51c037, 0xfbcc5e90,
-0x3515891a, 0x4b91447a, 0x720bb638, 0xb2ab96b9,
-0x0f754b6e, 0x3e80c305, 0x2ddbf257, 0xeb4a448c,
-0xe8208a87, 0x824d0ee8, 0xf2909d43, 0xecf2f423,
-0xdeefd046, 0x031d813a, 0x37ed1cde, 0x071f05b0,
-0x89038ee3, 0xdfa805ec, 0x008b4032, 0x1605fe00,
-0x7445e4f9, 0x351fff68, 0x062b0301, 0xf6f60647,
-0x1161a501, 0xefbead5d, 0xe25fff03, 0x035e178f,
-0x203cbb01, 0x43455850, 0x6e65696c, 0x75bb3a74,
-0x7241fdff, 0x303a6863, 0x4e553a00, 0x320a4944,
-0x5f003102, 0x0a7d8412, 0xdc050239, 0xb1b1655b,
-0xbd365fc1, 0xc26b0532, 0x3757b7ff, 0x2b0c510e,
-0x81803c11, 0x85848382, 0x015e8786, 0x7f45bac0,
-0x13ff7301, 0x720d9d92, 0x544146af, 0x203a4c41,
-0x5ffd2d4e, 0x72206ffa, 0x6d386165, 0x2065646f,
-0x63617473, 0x6c21c46b, 0x50d77fee, 0x564e0300,
-0x6143002b, 0x746f6e6e, 0xfa762023, 0x14ae676f,
-0x6e252124, 0x64006369, 0xb76b7369, 0xd6dfb6df,
-0x70706f6c, 0x27723079, 0x6c6f636f, 0x48445473,
-0xfdadfdbd, 0x54205043, 0x26045446, 0x52504545,
-0x0085314f, 0x7b7f6469, 0x3205bb1b, 0x0d330639,
-0x98383238, 0x006d6163, 0x584c6565, 0x3870b5d7,
-0x32162d1f, 0x4c84330d, 0x353484c8, 0xc84d9cdf,
-0x38633736, 0x65323635, 0x21d84d74, 0x62610e67,
-0x4ee6632c, 0x640d84c8, 0xf50b0065, 0xbfd8f7ec,
-0x71313538, 0x6539076d, 0x3536bb72, 0x6c1b360d,
-0x6d5d7859, 0x1b033d07, 0x3207b06c, 0x84587a17,
-0x4c6b2e19, 0x0da0350d, 0xb5336df8, 0x6e64521b,
-0x646120a8, 0x56db7264, 0x254c5868, 0xc4a1566b,
-0x6d6e0320, 0x6bc3c35b, 0x83658d20, 0x27730d62,
-0xdadb7f64, 0x66741bbf, 0x4c007074, 0x671d2c6f,
-0x253a402c, 0xed002073, 0x3aecb75b, 0x0f122f2f,
-0x726f2e3c, 0x6f2c3e74, 0x57b5cd0b, 0xec161267,
-0x6e550c78, 0x7378b773, 0x18b97585, 0x50412046,
-0xfd25229e, 0x63b6a376, 0x69122201, 0x207a616c,
-0xc36d203e, 0xcfad6db6, 0x33640f07, 0xfc280565,
-0x5a2ab41b, 0x13e90529, 0x3e16d62e, 0xf020006c,
-0x20c17267, 0x6f776885, 0x20b0b614, 0x69624afc,
-0x424e2867, 0x8085ed49, 0x437f0a2d, 0x44697372,
-0x74736d0a, 0x401073cb, 0xb1952a42, 0x13d6b9f6,
-0x61cfde3f, 0x0ae6e021, 0x6d69f76d, 0x3c696761,
-0xad117f73, 0x462ff63e, 0x5f7469f7, 0x08a7705e,
-0x756f6620, 0xddc62cbc, 0x0a1a2edb, 0x404e654d,
-0x0a6c2c00, 0x11ec5a1a, 0x1fd90a72, 0xaebdce65,
-0x853392e0, 0x4333d020, 0x7b6e6ede, 0x646d1b09,
-0xf861472d, 0x36796177, 0x3acfb588, 0x0a6c6552,
-0x3526743b, 0x06ed24b6, 0x4d550029, 0x56b1c844,
-0x65572c68, 0xb6ed2ef5, 0x6b5b62d0, 0x73ad213e,
-0x1e19a4bc, 0x4427adda, 0x949b7261, 0xb6d6ad65,
-0x46e5a152, 0x06745c09, 0x861ac110, 0x7a6934b7,
-0x0b5a5865, 0x56e946b3, 0x924346a7, 0xb5b64916,
-0x2600a458, 0x28a9750a, 0xc2ec5b3b, 0x130a29ec,
-0xbd6e7775, 0xec716d4b, 0x5770b5ad, 0x7562a44e,
-0x5049c574, 0x885b1b43, 0x0e73a41b, 0xb6613e53,
-0x1a04c337, 0x65631719, 0xdd641069, 0xad91860d,
-0x6ec76a62, 0x64973a75, 0x0eda453d, 0xb70ab98c,
-0xe39a64f7, 0x09798217, 0x25783020, 0x304b136c,
-0xc9d687e1, 0x6f66b7eb, 0xcbb59072, 0x0aecd192,
-0x6d4a114d, 0xb6ded6f6, 0x27502743, 0x6f4a603d,
-0xe6572066, 0x753ded1a, 0x14966c72, 0x0b2f19c7,
-0x6ec2b5ce, 0xac90ab1d, 0xadc36b97, 0xd66eb9bd,
-0x6976650f, 0x707920a4, 0xb1dcc689, 0x5a62470e,
-0x5b9f6173, 0x2790d25b, 0x175d07db, 0x1d696370,
-0xd6a50bfd, 0x3d4f0832, 0x43424139, 0xf7464544,
-0xd2d6fa4d, 0x6868032e, 0xed353a58, 0x8dd62f00,
-0x395f478f, 0x4f8a205b, 0x60de5753, 0x3f70b828,
-0x2e351e91, 0xfb2e2e34, 0x7295951a, 0x20350018,
-0xc42f8da5, 0x50477f17, 0x7469294c, 0x61c28d52,
-0x1c65424d, 0xf0d70a2e, 0x44bc6b40, 0x9755c7c3,
-0xdc3a3820, 0x0d0883a1, 0xc1d220ec, 0x6c22dd3e,
-0x4f784500, 0x6d0e3a73, 0x276c2f6b, 0x5f6f126d,
-0x287b3a77, 0x0c15b657, 0x963d7485, 0x10776da6,
-0xc7edec10, 0x3d20f468, 0x0a2e58da, 0x89028d27,
-0x8e2691ec, 0x1adb630b, 0x32c7500c, 0x611e78ac,
-0xe8e8e882, 0x69306d06, 0x63886cce, 0x5ba3da38,
-0x2ce97058, 0x93b4494e, 0x9172c96e, 0x6e499861,
-0x3197856b, 0xd74d9702, 0xa1452325, 0x2cb302b5,
-0x39f9e20e, 0x8eb9ad79, 0x65625c5b, 0x0e536505,
-0x6c20bd35, 0x69d31278, 0xa157be73, 0xe2a9605d,
-0x346a381b, 0x6dca3330, 0x7742a5bd, 0x553c635e,
-0x3ad68d2c, 0x67654386, 0x174b8f31, 0xb90a9c2b,
-0x7ac7ac8f, 0xb63af6a6, 0x74986721, 0xe196ca79,
-0x67ecda36, 0x320b6874, 0x380a63f7, 0x8ecc31b7,
-0x9d6c1023, 0x186ad604, 0x60911d28, 0x028f8509,
-0x1d9e8496, 0x96296181, 0x33340ab0, 0xae29654b,
-0xa036a447, 0xb2dc93b0, 0xdb6d8ad7, 0x379a9f79,
-0x62c2da6b, 0x67667b0d, 0x31093737, 0xdb3a4102,
-0x253d21bb, 0xaf48c0ec, 0x02195375, 0x5a3b42dd,
-0x7361ba19, 0x81833970, 0x2a7b0b42, 0x810ccee9,
-0x18980e03, 0xd133464b, 0x902afb32, 0x630b70ae,
-0x6290b61b, 0x1f0a6b0e, 0x2e65f162, 0xfb48604c,
-0x6c69973a, 0xb14ebdcf, 0xa05fafec, 0xb0db1b4d,
-0xf72f00b2, 0x69e26e67, 0xa95e963c, 0x6e8d8905,
-0x9db032b9, 0x5232d870, 0xbe5fe576, 0x73a1b078,
-0xbba62ccd, 0x784578f5, 0x970b7b29, 0x610cbeec,
-0x5452453e, 0x5b08ba1f, 0x2b48676c, 0x70cc3d61,
-0x2e075ce6, 0xde2dbd1f, 0x5cb1c2f0, 0xe367dadb,
-0x9ed27983, 0xc2e876a8, 0x074f9c7d, 0x0a8c7737,
-0x85705b56, 0x7419bb15, 0x41eee146, 0x6666ed83,
-0xaf8e2119, 0xeb278189, 0x0000f548, 0x4f4f427e,
-0x683c081a, 0x339c2d6e, 0xc859cf51, 0x0056833a,
-0x83c66bba, 0x1ed0a507, 0x18a617af, 0x632c2db1,
-0xb69335df, 0x6db96c18, 0xce2069d0, 0xc58b531f,
-0x1d88e7ae, 0xc3797878, 0x30c6f5b8, 0x6c757171,
-0xdd4440b8, 0xc0b4d771, 0xe56c7e68, 0x4b623436,
-0xba524142, 0x19bef0f1, 0x3a783830, 0xd952c304,
-0x0a093a52, 0xd075c35b, 0xb0f86879, 0x0f9e0457,
-0xeb1092be, 0x3fee7ae6, 0x4aafb700, 0xcdb3736f,
-0x430430e0, 0xdec91621, 0x67c60b46, 0xa33aa468,
-0x05af9976, 0x305895cf, 0x8ce0ce2c, 0x854c0d85,
-0x3a996431, 0x60b0374a, 0x58582307, 0xb5a12157,
-0xed754480, 0xa33f3a2d, 0x2315d4e3, 0x6dd78161,
-0xc25a1948, 0x4012a880, 0x76d846c4, 0x6f6f26a1,
-0x6f75292e, 0x3e39c117, 0xae55703e, 0xb6c100a0,
-0x8d8261ae, 0x98081e83, 0x3b131d02, 0x8b42ef56,
-0x1f079780, 0xb207cf9f, 0x933906c1, 0x1f93179b,
-0xb6012836, 0x1f5b5000, 0x73eba660, 0x0064035f,
-0x1e298086, 0x10efe479, 0x30078d8b, 0x10319210,
-0xa2103299, 0x4791e479, 0x34b01033, 0x1035be10,
-0x4791e4cc, 0xda10361e, 0x38e81037, 0x3f23f610,
-0x1039791f, 0x05103afd, 0x0c103b8e, 0xf23c8f3c,
-0x3d1510c8, 0x103e2310, 0x3f105131, 0x23c8f23c,
-0x09451059, 0x12274d12, 0x23c8f655, 0x5b12288f,
-0x49611229, 0xb02f6a24, 0x247b1e47, 0x245d0772,
-0x8210507a, 0x52d8f34f, 0xae078a6c, 0x52010798,
-0xd8477ba6, 0x0300086c, 0xf31c1600, 0x5568dffc,
-0x0060c399, 0x400048f2, 0x053f80f2, 0x458b20c5,
-0x2d82008f, 0x7fd10da0, 0x7255ae41, 0x83d81945,
-0x328def42, 0x4f28ddb3, 0x26035c09, 0xecad810f,
-0x04054f37, 0x96156747, 0x002d80c2, 0xecb7a8ae,
-0x0003417c, 0xdb2b04f3, 0xbaf2c654, 0xec68b72b,
-0x8263d3df, 0x0b966353, 0xb17705af, 0x8fd00039,
-0x07d902ca, 0x549f5f45, 0x5c24205a, 0x6de03765,
-0x00000000, 0x00900000, 0xffffffff, 0xffffffff,
+0x61983d2b, 0x8336a810, 0x68affbbb, 0xe8550e48,
+0x5b217cba, 0xd637df40, 0x42a30eed, 0xbe778904,
+0x29b4b923, 0xb6dbf77b, 0x732ea3f1, 0xf8ea2015,
+0xb8000881, 0x6e1b1c10, 0xd88ebfff, 0xd08ec08e,
+0xe88ee08e, 0xc35d5e5f, 0xb837c035, 0xddfbc435,
+0x3d057e7c, 0x58cc1dc8, 0x250bd0a3, 0xfeeb05d4,
+0xbb59b85e, 0x0300e968, 0x68535f1d, 0xe4514328,
+0x3dddddfb, 0x890bb1e8, 0x8d23aca5, 0xa52fa0a5,
+0x4bbd296c, 0xcf61ae6f, 0x00768de4, 0x8fbcfc81,
+0xba6bdd0a, 0x0c6020a8, 0x341b22ed, 0xbd8c8c02,
+0x072db7dd, 0x8bd0ff17, 0x1d8b8b7e, 0x8b8c8e79,
+0xa18b158b, 0x14685dbc, 0xe2ff04de, 0xd6da4c8b,
+0x7e518968, 0x02bff8dc, 0x61890459, 0x0c698908,
+0x79607189, 0xc3006f14, 0xe685edb6, 0x08431f1b,
+0x5a374a8b, 0xfa7b6209, 0x6a08dff5, 0x10728b0c,
+0x1c147a8b, 0x89ffb805, 0x4ace1643, 0xa29c285b,
+0x0c5401be, 0xc5b325c2, 0xbb188dce, 0x8c1f30b8,
+0xa24b43f7, 0x9d5d5821, 0xe172282e, 0x07353de1,
+0x8150802b, 0x86910038, 0x85890387, 0x956ffa82,
+0xc90d88eb, 0x4f290768, 0x5e530c28, 0x50f7346a,
+0x1d9da953, 0x0243892c, 0xea5f6f97, 0x101f0a03,
+0x02044388, 0x0763880c, 0xb6fe5b0f, 0xc358edc6,
+0x53560090, 0xab1525c6, 0x4d046cb8, 0x65effecf,
+0xb0d629c6, 0x29c38970, 0x01006ad3, 0x2d32e8b8,
+0xbb7f08e3, 0x685004e4, 0x09e5e805, 0xc23b806e,
+0x7adede17, 0x7703c60d, 0x109f8005, 0x131800b0,
+0x5cdb0306, 0x230b6206, 0x8114570a, 0xad6f4db1,
+0x10047918, 0x160d026a, 0xcf360650, 0x501cf7c8,
+0xe851efb8, 0xc28993e8, 0xe08dbfc7, 0x23f66653,
+0x0374010a, 0xb8c6b60f, 0x3d836d8b, 0x038849a3,
+0x7b459212, 0x1ee59e46, 0x4defeffc, 0xd93ba497,
+0xbb782c1b, 0xfc230304, 0x67992d91, 0xc03229fc,
+0xf6bdac26, 0x262b0cce, 0xc8269405, 0x31c2f816,
+0x01f08306, 0x642f01b9, 0x15e7919f, 0x08d20c0c,
+0x64cf2356, 0x1729afb3, 0xde191515, 0x26a83c96,
+0x16c76634, 0x6e11632d, 0x170a6ac7, 0x182422d8,
+0x33f233cc, 0x1c741717, 0x34b7f5cc, 0x33351817,
+0x7d88000e, 0xb1bbd236, 0xd06a3da1, 0x6630eb39,
+0xcb68e783, 0x75578377, 0x11160719, 0x5ff7c817,
+0xc112cadf, 0x104306e2, 0x0febc201, 0xc7e11610,
+0x891432ef, 0x5755a1d0, 0x95bb3c1e, 0xdef8dfbd,
+0x513b07a9, 0xb87d7d54, 0x17496c46, 0xea71ebe9,
+0x1e9081bd, 0xbf06b6fe, 0x66502406, 0xe8226804,
+0x3f0807b3, 0x81c0c6d8, 0x740e127b, 0xf2ade707,
+0x39ebf7b0, 0x2b0d7cf6, 0xddfbc88b, 0x457cadb7,
+0xfc1a378d, 0xf31305b9, 0xc58343a5, 0xed8d7114,
+0x850b1fb3, 0xbc9d74db, 0x4cd88996, 0x0d86613c,
+0x5a5fad62, 0xda1bfe9f, 0x1be05e97, 0xfe84e8b2,
+0xe0a3feff, 0xa0e8862d, 0x76e7f7e6, 0x09e4a30a,
+0xec682095, 0xdeff2e13, 0xe89ffdf7, 0xc08510c4,
+0x05c77375, 0x05db020c, 0x6085bf20, 0xf005e5c7,
+0x49050809, 0x36e7e0c1, 0xa30aeef7, 0x899907f4,
+0x1f06f815, 0x2d2105fc, 0x09b77dd2, 0x10072e00,
+0x1e000409, 0xa1d83bf6, 0x2e0831e4, 0x542e0c2a,
+0xbdbb2e10, 0xbf34ce11, 0x60773d28, 0xe9055d86,
+0x89a9835e, 0x18145aa0, 0xa045080b, 0x180ca419,
+0x977b6b1c, 0xb9358d88, 0x01174079, 0xf0d8a60c,
+0x870f1eed, 0xb981050a, 0x7730ffbd, 0x7df08d4f,
+0x0a064a58, 0xba12992b, 0xfd8e91af, 0xa4b7eb7d,
+0x993b0877, 0x8b0676c8, 0xb181c707, 0xf3c5cd61,
+0x30f3092e, 0xb1b164e4, 0x36191e29, 0xde00a267,
+0xff9dd367, 0x8b920f09, 0x22918b81, 0xdec73868,
+0x03d68972, 0xcbb11338, 0xf06f0210, 0x39142d1b,
+0x776a72d6, 0x6476c3d8, 0xd8fd8e37, 0x390c112d,
+0x722c772f, 0x773f3908, 0xdb1b3b22, 0x1c19db9d,
+0x4f1b0f2b, 0x39194b81, 0x9189f3ec, 0x892128eb,
+0x108ec189, 0x815ec719, 0xb63809f8, 0x8347ed08,
+0xa15d71c1, 0xbb1201cc, 0x267370ee, 0xd813b8c3,
+0xee33052b, 0x9f61d342, 0x90850c7a, 0x0ac6329f,
+0x4a75db23, 0xa60a8c08, 0xfc607c08, 0x0cca3fc1,
+0x7d9c35ff, 0x2e000072, 0xdddd91ec, 0xcf681412,
+0x62a51391, 0x5203feeb, 0x6f6df607, 0xfd2835a3,
+0x35590c6e, 0x20fd8639, 0x8ca12c74, 0x988f809f,
+0x5a9815fb, 0x3ae81bf1, 0x1c0f7837, 0x446a2cdf,
+0x0168d557, 0x10e9ff73, 0xc361ff05, 0xe80aebc1,
+0xe9c81ee7, 0xaa08a17d, 0x3172189d, 0x63af14ba,
+0x1659a171, 0x2ea118a7, 0xed8ce8c2, 0xc13ae96f,
+0xfa890ae7, 0xcbceb809, 0x6c5b4e05, 0x55d78923,
+0xf4a0dbaa, 0x1e433b4c, 0x144ce88b, 0xc9b726ee,
+0xe81c73bd, 0xa7460b85, 0x066206fc, 0x18f6183b,
+0x8856c35b, 0x26661447, 0x6b77f7a1, 0x96e2811c,
+0x061a8c8d, 0xf85d326e, 0xf2893381, 0xa4227423,
+0x17ff02fd, 0x74c98504, 0x2102c714, 0xfb455246,
+0xc281044a, 0xc180bd00, 0x49669fdf, 0x24e8ec75,
+0xae711b00, 0x758cd864, 0xadc5e898, 0xeb1678a0,
+0x1c1f6d3d, 0x77d4bed5, 0xd86ffd74, 0x29f1897e,
+0xbb01c2d1, 0xd729c789, 0x80398166, 0x50bd7402,
+0x3f4f6dfb, 0x98187564, 0x044703e0, 0xa97be6c3,
+0x4fb71d6d, 0xebd8e604, 0xa47dfbc5, 0x43c1b363,
+0xc358828d, 0xc600e381, 0x68db1e11, 0xde0d0d8b,
+0x2955ce29, 0x637b1ad0, 0xc8397ffb, 0xd8392977,
+0xfb812577, 0x1d9c0a13, 0xd219c889, 0x274342c3,
+0x1d48ae56, 0x6625211d, 0x04353843, 0x4440ccab,
+0xf412a16c, 0xd856e13b, 0x4a9b03df, 0x34053b52,
+0x71393277, 0xec1b16dd, 0xff522a75, 0xfaf05745,
+0x0fc612c7, 0xc76705a3, 0x0b000405, 0x0e0e2708,
+0xc8c8a84f, 0x8d8c6e5d, 0x245d8454, 0x1b8ca3d7,
+0x2e701619, 0xed885cef, 0xdbb61ecf, 0x88a1981c,
+0x4001b81e, 0x5ad85b08, 0xb8c50476, 0x8c423a01,
+0xf66f1bb1, 0xa12d4c4b, 0xc8368b7e, 0x5c52efc3,
+0xbf4ae981, 0x78357854, 0xfdf53258, 0x79aaf529,
+0x6786f289, 0x3347751f, 0xb80bf781, 0xfb0f2d00,
+0x3374e3f4, 0x9b31d4f8, 0x340ca113, 0xd7735b76,
+0x9d0318e4, 0xb7bef301, 0x9b368cc1, 0xbe66025d,
+0x811be507, 0x0189bf60, 0xbacba900, 0xc28c5ea2,
+0x9e567401, 0x15d888e5, 0xe798ad6e, 0xee480242,
+0xbfe90112, 0xc8e5b6b3, 0x75b005d6, 0x0054b82e,
+0xafdfbf12, 0x8112810d, 0x928bc1ea, 0x1c1089af,
+0x6866b1be, 0xd0aa01db, 0x2141b04f, 0x4eb5d718,
+0xd6a4eb20, 0x5a2457d5, 0x3dcd1928, 0x2dd3dbdf,
+0x8d1177fe, 0x2b901a04, 0x1d89a815, 0x18376a08,
+0x2523ebd6, 0x22fbc033, 0x4041d6b1, 0x3a08ffd0,
+0x6c369428, 0xdd29c5ff, 0x7f83ee89, 0x9c15be0c,
+0xcd5577ff, 0x740a85d1, 0xd86139c4, 0x11cf770b,
+0xbfb18d0e, 0x564c8f01, 0xe19a1de8, 0x121b7307,
+0x5e8dc601, 0x7633f0f4, 0x39db6c6e, 0x35031937,
+0xc31f1004, 0xf917fb02, 0x01c132fc, 0x8d1260ea,
+0x56e00654, 0xac5e0150, 0x018b818b, 0xcfecc2b0,
+0x890603e8, 0xd90612e8, 0xdb09edac, 0x7ff30814,
+0x2508a010, 0x52a3605d, 0x5942db34, 0xdc111447,
+0x1c05b76c, 0x290c4730, 0xceb09174, 0x0d666df1,
+0x03dc0399, 0x6a5f7508, 0x014cff13, 0xfce18303,
+0x715504e2, 0x5154cc29, 0x1b0236d3, 0x0c6cabc3,
+0x9324f57e, 0xd0777170, 0x89062ce8, 0xa1e75dec,
+0x8652f53b, 0x9c106140, 0x37089424, 0x61dc0d8c,
+0xec073354, 0xbc36ec40, 0x36f76035, 0x8d487458,
+0x8878898f, 0x77a5f16c, 0x18c283d6, 0xba960600,
+0x30b0be16, 0xc2b42c76, 0x7c4800c7, 0x7964b6db,
+0xc6d3c07c, 0x1602fec1, 0xfb05bdb8, 0x107df139,
+0x108c551b, 0xf07c0f41, 0x6dd6e8f0, 0x5f535267,
+0x12499814, 0x1b062fd2, 0x2e6324cc, 0x1f17264f,
+0xa143c58d, 0xd8b8aa10, 0x5f81ed2d, 0x0566d084,
+0xc41601e8, 0xbc783b8d, 0x40c44b6e, 0x85ce2d46,
+0x6241d2d2, 0x061074c3, 0x399402c5, 0x3a11d6d0,
+0xbf498452, 0xc7068ba3, 0x04b05b72, 0x0f084a21,
+0xa45f35e3, 0xb40f7b96, 0x008b150d, 0x652c9cd8,
+0x0abec3f8, 0xb974a7d1, 0x493e8da3, 0x73d93982,
+0x1904fe0b, 0x7f6f1837, 0xda3942c1, 0xc10af572,
+0x1cb45e5b, 0xe1bbe086, 0xc08c3046, 0x0a749829,
+0xdde907a1, 0xe599b831, 0xb6207599, 0x21be1325,
+0x86b822de, 0x6ac280fa, 0x840f1bf1, 0x217fd8a6,
+0x64a923e6, 0xe7830f02, 0x89c729f0, 0xc3019644,
+0x80b920b1, 0x0205326c, 0x12bfef0d, 0x8d60738d,
+0x18a61183, 0xdbefec6e, 0x8eef81f0, 0x05c781a5,
+0x9605042d, 0x1fb91b04, 0xe7146eb3, 0x18830ad0,
+0xfb750701, 0x2d12b783, 0x6c8d32e4, 0xf0e56805,
+0x828d4786, 0x1c28e4a3, 0xfafdb1b9, 0xea68046a,
+0x5e21ad91, 0x58acc605, 0x5d0ce9c6, 0x1807075d,
+0x08050e43, 0x19184467, 0xac300c0e, 0xcfb16e05,
+0x12e29c78, 0x0abd2b66, 0x106d107b, 0x1625eb1b,
+0x9405142b, 0xb6edd7ff, 0x531805d2, 0x071d571c,
+0x16fb1e0d, 0x8c690eeb, 0x03281f9f, 0xd6070f20,
+0x2adba775, 0xbca12202, 0x26032e13, 0x602d806a,
+0x0d113053, 0xc9eeae32, 0x057c5466, 0x405c3643,
+0x8b6c6fce, 0x8e4243c4, 0x48054607, 0x6c6f9012,
+0x054e4a90, 0x7e521250, 0x566dc2d3, 0x01586a05,
+0x43283501, 0x2404c705, 0x3d5a192e, 0xdf16c4eb,
+0x00ee5d0a, 0x4622fff6, 0xc6020106, 0xfc2c0846,
+0xec830c46, 0x149276d9, 0x0e2c0a46, 0xe7124657,
+0x0f7583ba, 0x14032046, 0x032246dc, 0x1b191e16,
+0x281822eb, 0x1e1c051a, 0x27120000, 0x2462ca6c,
+0x502646e6, 0xac07048f, 0xa72a4660, 0x310fe383,
+0x0c6fb776, 0x2c6a285e, 0xc9fd37b4, 0x6d8e0946,
+0xc7e0c118, 0x1fc18c80, 0x57f01fdf, 0x0f37688f,
+0xd25c2be8, 0xc5f6fb6a, 0x6aa51749, 0xf91a152c,
+0x833cffff, 0xb3106358, 0x6df57d1c, 0xe80fb5bd,
+0x4a1cf6a9, 0x19e3c1db, 0x5830411d, 0x90d3dde0,
+0x648a413c, 0x3416de8a, 0x021b3b14, 0xed99ea1b,
+0x4b8eb851, 0xf410689c, 0xf0f86cfd, 0xa213847b,
+0xeb81d3cb, 0xd368be95, 0xeb7831ff, 0x29f7896d,
+0x89078bcf, 0x260b4883, 0x6c7705dd, 0x83ec0a04,
+0x83250c4e, 0x1b60064c, 0x156e9f74, 0xc1180a94,
+0xd05719ea, 0x6c691435, 0xd04e7606, 0x1f6c201b,
+0xbad07f2f, 0x20d0eea9, 0xac160e06, 0x81013065,
+0x9effb34e, 0x527407b2, 0xba3f74af, 0x98152b98,
+0xb1dfee9c, 0x8b5f1860, 0x02899c80, 0x85c8cee8,
+0x42628684, 0x70771476, 0x68828ce1, 0xe86a188e,
+0xd162bd8b, 0x2a10748d, 0x84237823, 0x05af4686,
+0xc75cb734, 0x830723e7, 0xa6eb7345, 0xc592bfe8,
+0x57bcf667, 0x8d147a85, 0x57331660, 0xf11bed9f,
+0x3a5f4686, 0xc1896032, 0x024b0c00, 0xa93ee083,
+0xd30dc06d, 0x3979f201, 0x6ce28306, 0x12ec0871,
+0x086a0453, 0x7bf84d85, 0x46350740, 0x9ae805a2,
+0x77b9ddf9, 0x206bda74, 0xb327fee8, 0x5e5b1409,
+0x9cb5d023, 0xec208b6d, 0xdc81dd24, 0x38806f1d,
+0x8b1f76a8, 0x428b4d02, 0x81806904, 0x0762d6d8,
+0x42407208, 0xfea0dfb4, 0x1beb06a0, 0x8f14138b,
+0xc0d8b50c, 0x06408243, 0x46c19331, 0x365fd6ed,
+0x1315c109, 0xb1ea49c8, 0xd144ff68, 0x278bd001,
+0x50b60dc1, 0x1e25c60e, 0x5324946c, 0x7c7026f7,
+0xd46818bf, 0xa8bb9e96, 0x69b8e6ea, 0xe8b55ee8,
+0x79775159, 0xd91c970c, 0x56ff7b1c, 0x77000a0b,
+0x7e921027, 0x8dd72304, 0xbeb7be17, 0xded6f726,
+0x9f8314ea, 0x900a7702, 0xa0853493, 0xbae0fc72,
+0x75f87bd1, 0x8d6f9f17, 0x5add247b, 0x247e09e4,
+0x75161c00, 0xb6e0b01c, 0x1c1b6d1e, 0xb6144275,
+0x7ee17743, 0x310775e9, 0x02219f02, 0x43c91a91,
+0xe62e50fa, 0x066db99a, 0x76010f48, 0x850f0069,
+0x5086a498, 0xb4834c5f, 0x86fd180a, 0xff53e00f,
+0x0003c713, 0x8f5e1824, 0xa7be2791, 0x81913a5d,
+0x2e7a305f, 0xd00915e2, 0xbb84da0b, 0x6fb9e1bb,
+0x319fb015, 0x41ef10c2, 0xbd8b2ea5, 0x72dbe839,
+0x5ced173f, 0xe1f0f8cf, 0x5613794e, 0x7b293468,
+0xa9075255, 0x04d85a93, 0x63c97428, 0xe4a632c3,
+0x696d615b, 0xe4237108, 0x115c4819, 0x127cb08d,
+0x7c8b1835, 0x961d1fbd, 0x418f81be, 0x02b80ec3,
+0x66da89a5, 0x124c6aef, 0xed82183f, 0x0f03b85e,
+0xfde86ace, 0xe16fdd71, 0x06a05262, 0xbef8d3f9,
+0xeda81f06, 0x9f0bb1bd, 0xf038be05, 0xc83d9c2a,
+0xd4dfd81d, 0xc8830f71, 0x14bf3d01, 0x58916c68,
+0x16ee2d29, 0xd8b07bed, 0xe0b6b6df, 0xc509cd20,
+0x7aad794f, 0x1ac1423d, 0x052896ee, 0xc868847b,
+0x10fdac30, 0x955dacae, 0xfa85bbdd, 0x041d7401,
+0xc3f30672, 0x870936d8, 0x020835b8, 0xc20cc333,
+0x804f612c, 0xfd0f02cc, 0x2dabddf9, 0x8a152cd8,
+0x06f6a625, 0x0345d1b1, 0x0cfd2c81, 0xf74b96ff,
+0x8db98b6e, 0xff28ec06, 0x12155c70, 0xd2b41a80,
+0xdf861023, 0xb00d3f64, 0x25b7067b, 0x0567a020,
+0x400c0822, 0x082fdcdb, 0x24a31655, 0x212c1804,
+0xfb67b80b, 0x14022080, 0x48042830, 0xb703e214,
+0x1c0ca3bd, 0x03a90534, 0xef08f830, 0x381589c1,
+0xa32cfca0, 0x4b80a03c, 0x5f58b278, 0xb0ef04bc,
+0x1a130bef, 0xb7ee02c2, 0x2dec2bf5, 0x84adfee4,
+0x83412ccc, 0xf57e64f9, 0xf1f0210c, 0x10ff4d8e,
+0xf9814109, 0xf27e9110, 0x6856515e, 0xc0dabf84,
+0x52f61af8, 0x9adeff3b, 0x4ec4122e, 0x6fc71876,
+0x59e277a1, 0x09f73acb, 0x0812c1e8, 0x7b8f2cec,
+0x04364572, 0x04b07481, 0xc02085cf, 0x8300ba01,
+0x2d993b4f, 0x584080c2, 0x12b44807, 0xa1077788,
+0x4e806b4c, 0x4205f808, 0xbd915e05, 0x0301a961,
+0xec87d07e, 0xee0b4b51, 0x3fa04d84, 0x09764096,
+0x083c2436, 0x401084c2, 0x60aa017a, 0xe5020327,
+0x4b3c2454, 0x226d6218, 0xb87339b8, 0x00822bdb,
+0xcd0f67ca, 0x07b2d2b1, 0xd08e2ace, 0xeedd603b,
+0xb13fff25, 0x50936442, 0x1b50051d, 0xbf89d9de,
+0x6072ff50, 0x4f540de8, 0x24625219, 0x1b10dd3c,
+0x24c04208, 0x1e9760b0, 0xe02d428d, 0x8a309c03,
+0x00706ab5, 0x522e8542, 0x917841b1, 0xefdc380e,
+0x4a5078b0, 0xec25ebc2, 0x7805c5a4, 0x0c3d1601,
+0xc48524b9, 0x180222a2, 0x35a2106a, 0x4c2610e1,
+0x081bb14c, 0x07fa4a28, 0x6a0c026c, 0x6dc8e814,
+0x40a10000, 0x60592e1d, 0x941c510a, 0x57829a2b,
+0xb0f45496, 0x19ecc1a1, 0x8b3b2d64, 0xbbc53005,
+0x8a10c63d, 0x3436a3fc, 0x581d6db0, 0x93b46833,
+0xf18a0f47, 0xe1283bd0, 0x41881cec, 0x7b1b476c,
+0x257f01a9, 0x9415e806, 0x0ffe00d8, 0xef15b7e4,
+0x75073daf, 0x4286bd0f, 0xe2b02008, 0x0debfd87,
+0x0e0040bd, 0x00bb0180, 0x8106b68c, 0x7deb397e,
+0x1bbebe32, 0xc3f80bc6, 0xc63601ea, 0x0ffb833f,
+0xbdb8057f, 0x5c649bf8, 0x43d70110, 0x31c8c681,
+0x7625d37c, 0x5f998451, 0x6db45c50, 0x370b0bd0,
+0xd103741f, 0x5f443bf8, 0xed6f56e0, 0xb7e183d9,
+0x883103e1, 0x50431a04, 0x3f6f0780, 0x7bd77e05,
+0x4fa4e23c, 0x685ce0bc, 0x4f642837, 0x53608178,
+0xbac1d8b5, 0xc7b746bc, 0x58fb3091, 0x49a2bcc7,
+0xd802661a, 0xceb3a71f, 0x1f6c68e8, 0x37090a48,
+0x7206b8af, 0x565a1624, 0x724ec7af, 0xc0099f17,
+0x401690ba, 0x1197eb91, 0xde6264b3, 0xa640c281,
+0x1923200e, 0x63f2c123, 0x89fbab1d, 0x43074490,
+0x23c2811d, 0x0d8106fb, 0x40a3bb2c, 0x9642acb2,
+0x08fb37fd, 0xa359cfc0, 0x0000b244, 0x8d915e0e,
+0x85def590, 0x2760044d, 0x60b0a310, 0x8307065d,
+0x018527c9, 0x183c9700, 0xe0d24b3c, 0x28ba8c9c,
+0x0c77c6a0, 0xa74c4156, 0x048a5c41, 0x5a349118,
+0xbeed1e32, 0xe9c56aff, 0x5e4ba5ed, 0x04f53fe0,
+0x0a040574, 0x5d084f75, 0x17ea1ada, 0x1f162806,
+0xc4f7510a, 0x14037a13, 0x0422cb81, 0xaca43d2c,
+0xa07fbbdd, 0x01cf8003, 0x14685329, 0x4c929498,
+0x0ea65321, 0xaa38536c, 0xb4377459, 0x74f6f70b,
+0xe020be37, 0xc0199820, 0xf16353f7, 0x8159d0a5,
+0x342000e2, 0xb93794e0, 0xce4bb7ec, 0x006a5201,
+0x89da6f3a, 0xe25dbb65, 0x084002ce, 0x70e39ce0,
+0x1ab100c8, 0x6e9317e4, 0xd3deedf7, 0x08c4050a,
+0xac12e9a2, 0x09eca29e, 0xc3fabedb, 0xc061a8a0,
+0xdaeda280, 0x7e0258f8, 0x16f3bd9d, 0xf7a24911,
+0x5be0117c, 0x02bec1b0, 0xfba240e8, 0x0a140126,
+0x2145e1c0, 0xfda20df1, 0x4b599c9c, 0x21e4a755,
+0x68339331, 0x12f3682d, 0x0197261e, 0xbff5b923,
+0x12b0991f, 0x04a810a6, 0x4a502375, 0x83c5de92,
+0x734af836, 0x3ce85ceb, 0x946c77fa, 0x2829cc04,
+0x01c75016, 0xd67f4def, 0xc7c81ed4, 0x1dd14840,
+0x884c406b, 0x3518061b, 0x4050cc81, 0xe0256b46,
+0xd817ab54, 0x5ddb052e, 0x72143875, 0x30be0f18,
+0x86ff689e, 0x0505c3b7, 0x48b8d1bd, 0x816f4869,
+0x46f605fa, 0x5a1feb3c, 0x32067707, 0x0d2feb0c,
+0x80bb06b3, 0x6d187472, 0xec1b3d2e, 0x57563b1f,
+0x2c8c3de8, 0xedf3040e, 0xc08c688d, 0xb64490eb,
+0xd80350c1, 0xc581774d, 0xc6939817, 0xffffb831,
+0xa9da291e, 0xd57688d8, 0x94008100, 0x833a5dda,
+0x7005f0e4, 0xd017606b, 0x73523d7b, 0x0a40a90b,
+0x1c036df0, 0x75f1f572, 0xe808020c, 0xf824699c,
+0xc35c98dc, 0x682202c8, 0x75cf6ea5, 0x075040c4,
+0x984c7016, 0x61ac7bb7, 0xa1e82b25, 0x1a620c66,
+0x9776a104, 0xa2f2e668, 0x1e04e48b, 0x80ec2205,
+0xc468f54d, 0x40e0c855, 0x36fbb85c, 0x7e911208,
+0x20135bff, 0x912b01a1, 0x79751233, 0xfbb75f50,
+0x296035ff, 0xa1892ee8, 0x5b88c909, 0x3e308bc0,
+0x39fe7495, 0x38ebdd7b, 0x68b518a3, 0xd6836435,
+0x84909854, 0x2e648277, 0x36c87bf4, 0x3d64766b,
+0x58741248, 0xbfef0b78, 0x83547e6d, 0x4f7f02fe,
+0x14c610a1, 0x89f7701d, 0x400c9ed7, 0xff084ca1,
+0xc02a0450, 0x233708b1, 0xc6917883, 0xd4942352,
+0x16defe5b, 0x92f76350, 0xead468e9, 0x32cc688e,
+0xa0331879, 0x3689773a, 0x02469853, 0xdb1a5c0b,
+0xd39adec6, 0x8f0f0339, 0x19fd1059, 0xecf50872,
+0x81e9b632, 0x0094040d, 0x9f8a8c08, 0x9d4d7b6f,
+0x4814a1fe, 0x503d5e22, 0x1ff0d04d, 0xe81b742f,
+0xd10a19ac, 0x2ff61207, 0x05731f62, 0xe8129217,
+0xb3b003bb, 0xbb209708, 0x0cf4fedc, 0xd35fbddd,
+0x50f91c71, 0xc95805d9, 0x0004be00, 0xec426d90,
+0x0c6dff0e, 0xcebbba44, 0x30090541, 0x0210e9c2,
+0xfac16566, 0x8455cc2c, 0xd11cac50, 0x638e10af,
+0x33850f3b, 0x77c35708, 0x8941d889, 0xa102c506,
+0xe57fd340, 0x0f45da16, 0x4807e20e, 0xfb5f0f54,
+0x03901d6b, 0x7e022236, 0x0313640a, 0x08bc2dac,
+0x16981285, 0x0b161208, 0x0d757676, 0x15c219b5,
+0x9e08cd31, 0x8cf817d5, 0xd7704a16, 0xe91ad86b,
+0x1ea12371, 0x20908dcd, 0xcd0e8d7c, 0x62ab6a08,
+0xf621a30b, 0xd0cc2080, 0xc20cba82, 0x50891c27,
+0x1c5889c2, 0x6fbf20ee, 0x0c3e2308, 0x99be0dfc,
+0x208c11e9, 0x4f01843c, 0x15421b2e, 0xf8c2384b,
+0x14241c89, 0x423b5514, 0xe96408ec, 0x745ce3cc,
+0xd847ec33, 0x302a0ec6, 0x763b7a8b, 0xb05f1a74,
+0xb0194f4f, 0x38467db3, 0x8c4390e0, 0x02457cf7,
+0x896e0986, 0xbd8310fe, 0xa208803c, 0x01be6978,
+0xfb23b35d, 0x0c1e62c4, 0x84471e34, 0x3608e337,
+0xdf0440eb, 0xd3e4b083, 0xffbd7d05, 0x843b1d45,
+0x097f7983, 0x894105b4, 0xa31a6ef0, 0x108dda49,
+0xeaa1205a, 0x0a6035b6, 0x0c890e61, 0x91db5408,
+0x3078f188, 0x80466301, 0xf512dc3e, 0x046ff6dd,
+0x430d743a, 0x0b1e3c80, 0x753a0506, 0x6df8bff3,
+0x273216e4, 0x7ce000c9, 0x3c0ca5d8, 0xff530012,
+0x670d7037, 0x63c460b7, 0xc7827748, 0xb9722408,
+0xdff65c9f, 0x3100b2e9, 0x68036aa6, 0x618db5cb,
+0x1e461b5b, 0x92352d34, 0xbf472267, 0x03d8a588,
+0x4f06f4b5, 0x850dfae4, 0x742f3880, 0x52df1d47,
+0xc3401ce7, 0x01e4cfe8, 0x7634031e, 0x1d35bbdf,
+0x29402092, 0x10240a54, 0x0cf50950, 0x15318ac7,
+0x0730cff6, 0x46bb03de, 0xa3f82d75, 0xbf827ef2,
+0xcf68c3e2, 0x5644c836, 0xd03bf668, 0x9bc6dc3d,
+0x04573e40, 0x56502574, 0xafdf203e, 0xdb682d90,
+0xe8569e29, 0xa4f81f20, 0x104b2138, 0x1a13e8df,
+0x7a4957f5, 0x3f976497, 0x08fe6a14, 0xd09e1512,
+0xd055dbb2, 0x2d0d102f, 0x7f347b9a, 0x343d8038,
+0xc58c60d6, 0x0825295d, 0x6b8775b8, 0x3d461258,
+0xb6f9860f, 0x52f7ef5a, 0xc7810bee, 0xbdbc8605,
+0x2b349dd1, 0x218bc64a, 0x97466bf6, 0x8a0c106b,
+0xfdd4129a, 0x0f46c586, 0x7926bf07, 0x3aa5e95c,
+0xe0900c16, 0x54808db4, 0xb9bafc64, 0xb0dc52ad,
+0xac35ef1a, 0xfbda461d, 0xf75ee06c, 0xaf7410e0,
+0xeda63f43, 0xa55916c0, 0xd4bb7473, 0xec1422c7,
+0x08db85ff, 0xdad8d90a, 0x7ef6c7b3, 0x5868040d,
+0x50baa84a, 0x88310877, 0xb0014e47, 0xc5608a27,
+0xb8bccb25, 0x962961e3, 0x855ad946, 0xe84acc5c,
+0x546f18df, 0x0c428b70, 0x8ad90d8b, 0x6885de2d,
+0xa2034209, 0x15ed4dd8, 0x2075b776, 0xeb09c81d,
+0x90113248, 0x4b4f6d8c, 0x4402b8b8, 0x2f18a33d,
+0x9f0420dc, 0x95187502, 0xf7b01b2b, 0x10b90ed9,
+0xa10e2000, 0xb0307cb4, 0xa1efd98d, 0x43b4a304,
+0xfe72b815, 0x6f58a85a, 0x0fff248b, 0x14b5f025,
+0xc13b1bfb, 0x148d02f8, 0x03bb0190, 0x93e10f24,
+0x830f02bd, 0xd9d9d6ec, 0x848affff, 0x1bfbfb75,
+0x04a01a0c, 0x3a74ed85, 0x39141d8b, 0xa5e776f3,
+0xf36c4560, 0xb12d836b, 0x578da6b1, 0x29ad14f3,
+0x31d70121, 0x29f5f018, 0x36df01de, 0x89ba7f1d,
+0x44988c5a, 0x87a0341c, 0x28a2bc42, 0x1e2442fb,
+0x07755274, 0x9ec2e730, 0x0a5409d0, 0x361092df,
+0x7d3d2300, 0x1cb8300c, 0x0daf4d2d, 0x058181de,
+0x2353e4df, 0x3c8ae851, 0x9bb31420, 0xb380905f,
+0x504cad18, 0x382110a6, 0xf8614bf0, 0x18c7080b,
+0x1bfff3b2, 0x7eda4193, 0x018c1c3c, 0x3c02d8d6,
+0xa7217495, 0xd027815d, 0x720c1939, 0xc6284f15,
+0x730b67ab, 0xd9b7a109, 0x63440082, 0x2e3c1491,
+0x0e11c817, 0xdf5c03fd, 0x0d018603, 0xc7281f97,
+0x0bbf00a5, 0x461a16bc, 0x1baa73fb, 0x025d8dbd,
+0xfb53b557, 0x348d2e12, 0x03307897, 0x302c0bfa,
+0x85879839, 0x0febd2d3, 0x75083b35, 0xeaab0e76,
+0x8cdd6ab8, 0xcacc332d, 0x722f5fc8, 0x28d0bbb4,
+0x042674ce, 0x1df80777, 0xa5376ff4, 0x03064beb,
+0x44eb2874, 0x8068148b, 0xd6e07d81, 0x75a9307c,
+0x31eb0f37, 0xd9bd4b12, 0xeb0424cd, 0x0fc3b11e,
+0x051dbf06, 0xd3a366de, 0xa3205456, 0xcdeb89e7,
+0x84761eed, 0x7c2c5682, 0x061f74b9, 0x8039cec8,
+0x511e0646, 0xf4482103, 0xf26810eb, 0x6a40514c,
+0x820ac1e0, 0x6d181a15, 0x07752774, 0x5424e310,
+0x34c558ff, 0x0b5f7772, 0x050b0b34, 0xdf6d0530,
+0x5a35d558, 0x3e107534, 0xb1721a15, 0x28f63909,
+0x1e390877, 0x14291e72, 0xb1c4efba, 0x88e92419,
+0x1e010f78, 0x59d82dc7, 0x343919c4, 0x9b0d7309,
+0xc9388461, 0x5c439155, 0xc52e1dcd, 0xd8107a36,
+0x20c2078b, 0x1eea68bd, 0x3869cb43, 0xfb181840,
+0x409a1b1e, 0x291ecd42, 0x15bb012a, 0x81d2658b,
+0x010da850, 0xb803a367, 0x8d00d1d8, 0x889ec39a,
+0x3ab90cb4, 0x9ab18b25, 0x8b1b770e, 0x15132528,
+0x548a522c, 0x89af167b, 0x40292dfc, 0xe00a20be,
+0x0296db7f, 0x3d30084a, 0x8e8b4174, 0x3b6fb924,
+0x55fd1057, 0xb1d3392f, 0x6f392972, 0xc1e107bd,
+0x74442572, 0x1707a116, 0x1b968b05, 0x2c7efec4,
+0x7305903b, 0x611e8906, 0x7e125fc6, 0xc51020a9,
+0xa27ff839, 0xec8b6b74, 0x35b19775, 0x2c86e634,
+0x6cdda32e, 0x0d807eb4, 0x19c129b1, 0xed9cc3d3,
+0xb3593ad0, 0x6d303a55, 0x3d221a00, 0x82363997,
+0xbacec721, 0x3458e832, 0xf02d3546, 0x23fbf325,
+0xa81500bc, 0xd311c101, 0x11540d01, 0x59f8011d,
+0x0f1ab384, 0x8e09d0ac, 0x9dac1b16, 0x2901ff2f,
+0xe21e40a3, 0x7223a1a1, 0xe8265038, 0xca6b3af8,
+0xeb2df1f5, 0x75080af2, 0xa9416c46, 0x3404de20,
+0x9e0246e0, 0x390b6306, 0x87dc2b08, 0x2869e196,
+0x49e86732, 0xfa876e19, 0x3dc09702, 0xf47ee830,
+0x2bc5b7ee, 0x8928150c, 0x688d2ad0, 0x958ebf34,
+0xfa5e583a, 0x83d69300, 0xf88101bb, 0x8b37a713,
+0x10b92c83, 0xdc0a5b09, 0x090e34b3, 0xb82c580a,
+0xe855ec77, 0xab035726, 0xc394491e, 0xcc437a74,
+0x66b1988d, 0x9e6e3539, 0xaba0276b, 0x0f1a2f72,
+0xdafc184e, 0xff9394a5, 0xd4416e3c, 0x8444d18d,
+0xdef60870, 0x1178b1fc, 0x0040e3db, 0x21231f22,
+0xf8d08af0, 0x6ea65ffa, 0x284951ae, 0x1a4bfc1e,
+0x8da09c5b, 0xe316aa93, 0xdfc558e0, 0x50503304,
+0x80d0e853, 0x0301c085, 0xce0ac271, 0x35e647d3,
+0x5626e4bc, 0x2ae81663, 0x4635023f, 0x47e1c2db,
+0xc0189b1b, 0x7eae9957, 0x985d778d, 0x0fe879ad,
+0x7459d6f0, 0x4fd5a3aa, 0x781820c8, 0x07f26a90,
+0x5ab86ae8, 0xea0bd2a8, 0x33fc428d, 0xe93905ee,
+0xc842b40e, 0x4751047c, 0x388181a0, 0x8d6818c2,
+0x0bddd820, 0x3be34c94, 0xea0a7d00, 0x6c56e136,
+0x181bf74e, 0x70d15b96, 0x82f190d6, 0x60480c2c,
+0xa1da31be, 0x11d77644, 0x0582a53d, 0xe946483c,
+0x8b570178, 0xe18f4a97, 0x73486a45, 0x6f015030,
+0x3b1c415d, 0x24764036, 0xd04ceb43, 0x037e5207,
+0x439a9b58, 0x64d97a18, 0x4fe92040, 0x576bb8a1,
+0x0d3b4870, 0x6634763f, 0xcf1d3b40, 0x402ba194,
+0x0a02d873, 0x6be0dbe4, 0x60511c05, 0x31243ff8,
+0xf70e04c2, 0xa3be361f, 0x5e420749, 0xc50d9092,
+0x62c5086f, 0x334c8969, 0x66092b5e, 0x5faa2c45,
+0xbf8a1fc4, 0x8b567560, 0x5f97d787, 0x87117fc4,
+0x03d389c1, 0x409fd78f, 0xf8bdb174, 0xa1183b0f,
+0x265be61c, 0x5613f0c2, 0x04772672, 0x88b0437d,
+0x1c01df20, 0x06721277, 0xddea4752, 0x0a7718fd,
+0x4608ce99, 0x86174101, 0x77f52db7, 0x1f327499,
+0x9ddeec25, 0x48034c01, 0xd4992868, 0x89553a4f,
+0x6ca35db7, 0x0339445b, 0x00167648, 0x4408d87a,
+0x29beb837, 0x059c18d9, 0x2c992aad, 0x96df032d,
+0x596c0608, 0xbaff458d, 0x5d60844d, 0x5fc585e0,
+0x119500f0, 0x988c3522, 0xebfe42d9, 0x54266207,
+0xf7e8520d, 0x4c500dd8, 0x996ac518, 0x85e11146,
+0x098103e5, 0x755bb51a, 0x7c77d629, 0x1b777779,
+0x8df860b0, 0x011bb921, 0xf80f07d7, 0x2e2ef106,
+0xe9d03947, 0x24348bc7, 0xda82f734, 0x0c730e2d,
+0x6c18e909, 0xc2f08f7b, 0x0eee3d3b, 0x2e07153b,
+0x22c70f8b, 0x150d59bf, 0x8d0f380c, 0xff86f154,
+0x23ff2af6, 0xd7399c54, 0xf8890a72, 0x205ad029,
+0x78431573, 0xec4348f6, 0xffff4a1d, 0x7fd089f7,
+0x429210d0, 0x89b93014, 0xb04e89ef, 0x5ede84f0,
+0xab0833fb, 0xd6749e08, 0x5534112d, 0x811095ec,
+0xd1aebb3d, 0x457f0dff, 0x4975464c, 0x52250a35,
+0x80ed3d00, 0x0001b42f, 0xa16638b1, 0x02e819f0,
+0x3e168c6d, 0x54297770, 0x342077f4, 0x0f14b838,
+0x75d03435, 0x61f6bf14, 0x3f570e2d, 0x0a740609,
+0x2474fa75, 0x7a39e938, 0x63412168, 0xf99c0438,
+0x0b26e946, 0x063c7a57, 0xc315d7e2, 0xd0af060a,
+0xa4e3ecb6, 0xf039a45f, 0x2a24607a, 0xaaf0a82c,
+0x2b14b8fb, 0x8504e652, 0x6677d81e, 0x4e2c2118,
+0x02c42108, 0xc6159810, 0x4b3452e6, 0x182f85c0,
+0x073aa771, 0x62e703d1, 0x4ba2c61c, 0x01411829,
+0x9f12188c, 0x9e00012e, 0x8f4e2425, 0x7dc177c0,
+0x603b4f68, 0x833c0989, 0x9071d2b8, 0x71dee61f,
+0x7318fcd2, 0x20058904, 0x82349003, 0x367c3587,
+0x13d1f3ca, 0x017dec05, 0x1d316157, 0x8b07763c,
+0x0158a340, 0x6a810043, 0xe07dc02e, 0x9c7c0937,
+0x04854887, 0x9187d80d, 0x29008053, 0x4de5de37,
+0xa2c07a85, 0x980e2bb8, 0x8f437010, 0xf2e851e2,
+0x75ffd241, 0xb7e40632, 0x681c587b, 0x36f137b0,
+0x724d00ad, 0x99a30966, 0xdb995b1d, 0xb92bc28b,
+0x237d10f3, 0x8762cd84, 0xafea01be, 0xd13a3222,
+0x14dd7cea, 0xd3b0c561, 0x0f4bd843, 0x4f89e98d,
+0x71ff42f8, 0x8375908d, 0x7504407a, 0x8b5052a8,
+0x1b0b8788, 0x11594ebc, 0xbd0e77f9, 0xf831601d,
+0xdde85751, 0xb97399f4, 0x96c3900c, 0x708c5c63,
+0xa32a36f7, 0x62b8b8ec, 0xea170c8d, 0x043c7fdd,
+0x488be205, 0x0df90150, 0x40708b04, 0xd5b03f0d,
+0xb1146ed6, 0x3b515652, 0x22754d20, 0xf9f6786e,
+0xf0cae207, 0xe700c941, 0xec0cc6ce, 0x58edcf3c,
+0x14f4171c, 0x097c9db7, 0x8c0fafb9, 0xc7e41774,
+0x28ca2805, 0x2c1924d9, 0xf07e7409, 0x3809db20,
+0xf02f3eb8, 0x23fd850f, 0x36a01100, 0x36007d81,
+0x121b0313, 0x13ba4e3f, 0x44540160, 0x21350ef9,
+0x61fac6ee, 0xfffb81ce, 0xbf053ff0, 0x109ab8a0,
+0xb93d041c, 0xd8c4672c, 0x10f96967, 0xb2379ba0,
+0x980770aa, 0xb1857a62, 0x26a3d001, 0x0a4d8713,
+0x91ccbca3, 0xdd0bc246, 0x07e06a83, 0xe1e83d52,
+0x07be14f8, 0xfc692c5e, 0xa11cbf56, 0x09802c2f,
+0x83e3245b, 0x14009d5c, 0x2c018add, 0xcac3012f,
+0x2addfee4, 0x22858d5f, 0x5576d839, 0xf60d91b2,
+0x5079dd5c, 0x0607ae57, 0xcc4dfcff, 0x85e83a2e,
+0x033be25b, 0x43f6087b, 0x80f0b003, 0x0f25146f,
+0x9e7d03b6, 0x7bf93d93, 0x021c8018, 0x868d0a54,
+0x8ab7ab77, 0x2f8d8bfd, 0x07eb4d74, 0xbca1c20c,
+0x0180df6d, 0x562a6867, 0x064ca8be, 0xac0b26cc,
+0x1ee5e8d5, 0x017d920b, 0x874523ba, 0x87b83d12,
+0x4faed285, 0x67412765, 0x6333a8c5, 0x57b873c0,
+0xccd0858d, 0x24482932, 0x2260070d, 0xc9750a1f,
+0x4eb62b0e, 0x8c8e882a, 0x41047d09, 0xcb179088,
+0xc020a44f, 0x80a3790d, 0x31ef96b8, 0x506f9859,
+0xc96b396e, 0x1ed8ab1b, 0x0109a8b3, 0xb1d94d15,
+0x3572f416, 0x2b7261d8, 0xfb1f521b, 0x310d8b79,
+0x091933d1, 0x1c5375c1, 0x0d8c4b7c, 0x5b77783b,
+0x7b730735, 0x6d5b7a03, 0xd95d071d, 0x8e1fc181,
+0x89f61d8d, 0x3a2942c8, 0xe1816419, 0xa7d4afb1,
+0xc5d90188, 0x8e3b292d, 0xebef006d, 0x6a20a139,
+0xc6295303, 0x1449dbbe, 0xd020d4e7, 0xa3cc15ff,
+0xfb160389, 0xf0418920, 0x3dbc10c4, 0x92050f14,
+0xe110fe90, 0xb49eac42, 0xcefc245c, 0xa0f373f2,
+0x04bd40ad, 0x06c1f60b, 0x181a0860, 0x1f719430,
+0xd452fde6, 0x105a2058, 0x6dd7d59d, 0x72e88a37,
+0x0bf70edb, 0x476d47c0, 0xcd2e0238, 0x7311d2f7,
+0xf6899bdb, 0x86023881, 0x1dd21ac4, 0xbd820a3d,
+0xea810627, 0x9fed3407, 0xfb12f40a, 0xe8197567,
+0x4c1bc9f4, 0xc86d0dee, 0xbf0f8de4, 0x0306e815,
+0xf0affe85, 0xb805491b, 0x1389c755, 0xc10be9f7,
+0xc1e1bed6, 0xf8220cfb, 0x8dc3291f, 0x568302be,
+0x6c6ed6db, 0x092a07e2, 0xe802a7c3, 0x8db7abed,
+0x030f8941, 0x0903ca29, 0x73620d78, 0x18e2d1db,
+0x800225db, 0x6ded0a27, 0xc839e181, 0xc2294309,
+0xdb1b141d, 0x5855f1be, 0xab050a79, 0xa1697f77,
+0x5e1b5004, 0x80fd8bc1, 0x463c1f3d, 0x3c7454ff,
+0xf00273e8, 0xcc3be833, 0x9812c6f8, 0x0c741bea,
+0x9503abaa, 0xe245fc16, 0x0bf40aeb, 0x92fdba05,
+0x3460d108, 0x8fc8ff52, 0x8c952b92, 0x36e12091,
+0xb7a9682e, 0xeb58348e, 0x2e74992d, 0x00b80ba9,
+0xf2726411, 0x83d06a1d, 0xc5733f51, 0xe81c3230,
+0x81a0ffbd, 0x921c723d, 0x7de82ed4, 0x48511c01,
+0xacc22a52, 0x1b6d3f4b, 0x1e3980bd, 0x8a28972d,
+0x7cdf5711, 0x8a82de37, 0xc238df88, 0x194341ce,
+0x07eefb13, 0xe6740ef2, 0x0f08018a, 0x138ac0be,
+0x16d08015, 0xdcd2079b, 0xc9c5ce5b, 0x8920edaa,
+0x8bab0803, 0x3562155c, 0x3053d660, 0x0550f557,
+0x183984d7, 0x56766512, 0x4d027f8f, 0x02ff833c,
+0x2216177f, 0xd0fec1fe, 0x3a80d901, 0x201b742e,
+0x0908e6c1, 0x6f6847ce, 0x0321de94, 0x2717ac7e,
+0x0410c8c1, 0x89e8fd08, 0x29c5026a, 0x464a43e8,
+0xadd86c90, 0xbeb5df85, 0xb7920a33, 0x093c30e8,
+0x60d01477, 0x92b6858d, 0x42a111b6, 0x12ee1391,
+0xec76e88d, 0x890bed05, 0x7e2bffca, 0xc7996244,
+0xeb12c349, 0xfd60e402, 0xe4c6c40b, 0x46c0d964,
+0x7402a804, 0x177ee809, 0x1acb7082, 0xf6e872bc,
+0xc3240180, 0xc235c831, 0xe8173615, 0xfeb613e0,
+0xe6d1b0fe, 0x08b1e864, 0x8160e6df, 0x740dd9ff,
+0x4b5b7b43, 0x701d89d9, 0xd420fbd7, 0x6f0aa2c7,
+0xffe2e80d, 0xb1b38832, 0x4bc02385, 0xb1bb8a18,
+0xa86c7007, 0x421a03e8, 0xf8c398d3, 0xfb81df6f,
+0xfb837415, 0xb302750d, 0x83d8890a, 0xefee0093,
+0x28c7dae8, 0xb2c0950f, 0xf4430c12, 0xa8ee5670,
+0x37058d0d, 0x89fb605c, 0xdeeb29fb, 0x81f0f60f,
+0x76fff082, 0xd4092a43, 0x7bb6bf05, 0x82778046,
+0x910cd7e2, 0x1b1502ba, 0x0cbe63a4, 0x7d418b66,
+0xbaddb170, 0x2723478c, 0xa10f5b63, 0xf494f81c,
+0x24df503a, 0x11825184, 0x0bafb9b6, 0x83198201,
+0x04648809, 0x8016a70f, 0xd0e0f0dd, 0x29168e39,
+0x08730776, 0xb32c3843, 0x04f62017, 0x0df74b72,
+0x64810afe, 0xfd8a9617, 0xba1debd4, 0x16a9d829,
+0xc3d96c0b, 0x1e20cd86, 0x26107248, 0xa956e837,
+0xc58950e3, 0x044104bc, 0x83d0b6c3, 0x8fcec9c2,
+0x801b7629, 0x98e08c52, 0x354ab459, 0x3308c436,
+0x6aaf5557, 0x87c03f01, 0xb72d6789, 0x90e8d9e8,
+0x74fe1be2, 0xc377e855, 0xe8241c85, 0x03024d0a,
+0x903b5482, 0xf55ec200, 0x752c2bd1, 0x8e00aa4f,
+0xdc65301d, 0x7c3d4820, 0x7a07080a, 0x6f1c7e44,
+0xab0bd449, 0x3e00ded3, 0x762a0f6c, 0x0cd60cd1,
+0x41b1b3c4, 0x0cb76c88, 0x478019f4, 0x07aa8043,
+0x019b5ca9, 0xf9f50545, 0xaf85ea07, 0x8a105c11,
+0x7614353b, 0xdd075d4c, 0x46130666, 0x6c9c1405,
+0x3ba06c0b, 0x2eebd8a8, 0x2910eb07, 0x95d857e8,
+0xed14b04e, 0x47720c3d, 0x6c6c6f35, 0x8916eb73,
+0x0a0510eb, 0xf417043b, 0x317dc03e, 0x0c4f2b2b,
+0xeb0d0405, 0x7c39256e, 0x7b191865, 0xa6db3780,
+0xf5297c8b, 0x08b5de18, 0x09784611, 0xa3b5ffff,
+0x4709190e, 0x406f82f1, 0xf1623c5e, 0xdaea736b,
+0x6051e02b, 0x680b4884, 0xa33c35e2, 0x1845868e,
+0xc01c8a76, 0xa1a29e05, 0x83d9c2dc, 0x49bf50ea,
+0xf0e2cebc, 0x725280b8, 0xf008ec19, 0x08897b60,
+0x0442ae89, 0x5b252810, 0x5d3e3fd6, 0x376d81c9,
+0x44c2217c, 0x66244108, 0x3b6c9d87, 0x084c1889,
+0x7a6b6810, 0xb7779294, 0x03034727, 0x31b1e947,
+0x9a83fc40, 0x2b1668e7, 0x762f4063, 0xc04b39eb,
+0x7dad2001, 0xec746d2a, 0x0d037856, 0xfbfc422f,
+0xf60c8cf8, 0x01812caf, 0x320d3bd1, 0xaf020d0d,
+0xa5908c49, 0x472dfe8a, 0xd431390c, 0xb73c9e21,
+0x01808384, 0x1505c8db, 0x5582ebef, 0x03281aa5,
+0xd7510453, 0xcc2360c8, 0x05085c20, 0x355f522b,
+0x17e548bb, 0x22fb0264, 0xd05b69e8, 0xdda10c26,
+0x379a10e6, 0x0b6d042a, 0x3dc23a1a, 0x1e8ebb23,
+0x06ffe018, 0xf00cf106, 0x88a9c160, 0x53dd475f,
+0x9faae035, 0x9129f32a, 0xe8c7136f, 0x68626c35,
+0xa0e012a7, 0x8c40b10d, 0x167480fe, 0x3dfbe417,
+0xb2680b17, 0x9215c11e, 0xeacf3d87, 0xf834abba,
+0xbe43b031, 0xc5680bdf, 0x53f48c1e, 0x17efb0c0,
+0x1ed1680b, 0x3da2536d, 0x0aa3bc52, 0xb86b3ee8,
+0x111e324c, 0x59578026, 0xfab84005, 0x27dd9c05,
+0x30e3653c, 0x6df6602c, 0x313bde9c, 0xbe6112c1,
+0xc070bd63, 0x1ef4683f, 0x35221212, 0x41342948,
+0x165aa117, 0x3ac04870, 0x6f412735, 0x0605811a,
+0x82637508, 0x52a361e4, 0x9529720d, 0x687be00a,
+0xc3f60ea3, 0x067b240e, 0xdb8a3f3c, 0x0bb18f1f,
+0x920e438d, 0xdaa52b92, 0x75854077, 0x19061d21,
+0xe0543dba, 0x8db60612, 0xa6503e8f, 0x71b41262,
+0x9bfb822b, 0xd08ab018, 0x54d33c86, 0x80edd88b,
+0x0ca545a7, 0x59551ca3, 0x238a6854, 0x6822feec,
+0xaabb9024, 0x5be915fd, 0x6c4488dc, 0xfcbfb855,
+0x7b0523ad, 0xcb3c5b08, 0x5b122f39, 0x6307a109,
+0x47de2c5f, 0x23b8261e, 0x2f12c010, 0x15461a6d,
+0xdbfe830a, 0xb4120ef3, 0x062b835a, 0x0c089501,
+0xea5fed48, 0x42fb4e27, 0x6cbd7440, 0x1e3c80bc,
+0xc0b10706, 0x04f423f6, 0x43b52d06, 0xa2ebedae,
+0x1206017e, 0x8471c6a9, 0x06bb001f, 0xbc041504,
+0x31030100, 0x686f503e, 0x49e84a3d, 0xd9cb2397,
+0x6804e30b, 0x352a13e0, 0xb1c02710, 0x22788d85,
+0x86d9897e, 0xeeb66d04, 0x34049551, 0x01b31024,
+0xe2ff0930, 0x1c6ade26, 0x92170668, 0x488361e0,
+0xe1b442d7, 0x7feed0bd, 0x3c33cb05, 0x8d685650,
+0x0d9f1046, 0x20ddf096, 0x14bb087f, 0x22ebbe7e,
+0x3b182959, 0x474a9a10, 0xc53cd710, 0x541c0319,
+0x57eb20d3, 0x8d2472df, 0x4506c6f3, 0x7d0379f6,
+0x6017c350, 0x03006c03, 0xc86c43c6, 0xa021fa29,
+0x43c74a24, 0x6140c504, 0x2106e00c, 0xac6ffe88,
+0x439d17e8, 0xf6a1c109, 0x681c2d3b, 0x43e8e027,
+0x09404542, 0x56e25b1a, 0xb1412da3, 0x5286430a,
+0x62c403aa, 0x5a026f24, 0xa15ba806, 0x9434b211,
+0xee40731a, 0x7e8db906, 0x767d2914, 0xee9ff961,
+0x47240807, 0x14eb8302, 0x7f5fdf86, 0xae6c56ba,
+0x2c588247, 0xd50618c9, 0xd221835e, 0x3f170602,
+0x460bef77, 0x661c87fc, 0xa366286e, 0x8ef7d8d0,
+0x565354c0, 0x50673c6a, 0xc5e0726c, 0x182d8db8,
+0x7d57e814, 0x802c789d, 0xc50c0543, 0x4449be68,
+0x8b06ac17, 0x1849f60c, 0x8a1ac40a, 0x0827e854,
+0xfe885a77, 0x3b0df4f0, 0x84751050, 0x8385b443,
+0xaec07eb1, 0x8c01948e, 0xc83f342d, 0x248e5b3d,
+0xeab54582, 0xb803acea, 0xadde1bd0, 0x4e450440,
+0x05980640, 0x263ceb8c, 0x91c5560b, 0xb4d60375,
+0xfdb1c1d1, 0x1cc0337e, 0x04b817fd, 0x1df8f1fa,
+0x352519d0, 0x1a9a0015, 0x1a18160b, 0xe884540d,
+0xd5afb710, 0x86899028, 0x8e81c554, 0xbd296a78,
+0xf3e8cd84, 0x55b00c3d, 0xca069c8b, 0xbd9fbb76,
+0x500646b4, 0x6836fff5, 0x9e68633a, 0x3394e81b,
+0x988e4b0b, 0x9e401f57, 0x316c8b30, 0x08afa0aa,
+0xb82c07a2, 0x02a467bb, 0xf405ff12, 0xc4460259,
+0xa02e0452, 0x7ccdf6a3, 0xfbb27380, 0x503b1822,
+0xf49ef607, 0x813c0062, 0xaf50e860, 0xb05ba241,
+0x03079d5a, 0x6dd824bb, 0x115a3db1, 0x07c75df5,
+0xfdaf1134, 0x50793ddc, 0xb78a1e66, 0xb13db001,
+0x5636a07e, 0x3e901612, 0x006a6c3c, 0xbbdb685e,
+0x35210a7d, 0x72f0af57, 0x1639ac66, 0xc5b7b09f,
+0xfa4108ed, 0xba8f2c14, 0x3b6f144b, 0xc1a16676,
+0xa303d083, 0xabc46009, 0x8ec17dec, 0xa2e82bfd,
+0x3885f60e, 0x40e9bc02, 0x8dee0d0d, 0xc15911db,
+0x18417a0e, 0xf6588d17, 0x3092e808, 0xc48614e1,
+0x1c14431f, 0xc40bdd80, 0x74051a35, 0x0e7f041d,
+0x56a66c03, 0x477bf7d9, 0x26176e9e, 0x06f87f63,
+0x94e92d74, 0xb11e2a01, 0x4586518d, 0x5220db9b,
+0x0b9551e5, 0x47b6ef23, 0xc6deb6eb, 0x67268d27,
+0x446aeb28, 0x6c2aa16d, 0x0edb16b5, 0xa8bad42b,
+0x46a900e9, 0xde251b25, 0x553e0c87, 0xfb7783ad,
+0x5bc02e04, 0x55737439, 0x65681037, 0x60e01b58,
+0x91f21af5, 0x80522975, 0x4402627a, 0x8ac207a2,
+0xe0b743c1, 0x23cf77a4, 0xdbffaaa3, 0x8a188040,
+0x63f02e7b, 0x39a5c237, 0xcb81ab69, 0x107e6bff,
+0x1e331869, 0x0f363be3, 0x854bc08d, 0xdd3444f1,
+0x089e0805, 0x93076d03, 0xa081f3e7, 0xec212212,
+0x04e108f5, 0x008dc091, 0x6a19e2fc, 0x08242006,
+0x35f093ed, 0x3b42f3db, 0x4b75d039, 0xd8370b06,
+0x82a1d3de, 0x775e0258, 0x7a202f3c, 0x6a5a39ee,
+0x064f28c1, 0xd0bb4358, 0xfe426158, 0xaec04405,
+0x300cd89a, 0x0c11109c, 0x08db0aa9, 0xbff83058,
+0x8c37a1f6, 0xdec3bdee, 0x200ecdc6, 0x8438c745,
+0xb1206a9d, 0x833ffb4e, 0x1ee00d3f, 0x4b1aeb1d,
+0xc1d07b08, 0xd444928a, 0xdb0785c6, 0x9b3b80c2,
+0xde3c0432, 0x84b0ba84, 0x7b6809e1, 0x84028625,
+0x568d23f1, 0x04f743e0, 0x3c2801b0, 0xf896b03c,
+0x70d801c6, 0x02788002, 0xa429ce6e, 0x08701087,
+0xb920615b, 0xf160d86f, 0x02a80238, 0x58df152a,
+0x1981c58d, 0x05e45c15, 0x221842b7, 0xdb0250db,
+0xdbaa0cc0, 0xc231b804, 0xeb01c842, 0x52b10290,
+0xf90d689c, 0x31bf10cf, 0xbc2f0b3e, 0x3d5ca685,
+0x360fab3a, 0x758a6c53, 0x73838dff, 0x4c572baf,
+0x85aa0316, 0x160ad17c, 0xc03a896a, 0x42df53a1,
+0xe8437c3b, 0x3bfff7f9, 0xc16ce300, 0x50d0fba2,
+0xe3e82c68, 0xdb64b915, 0xe9d989b7, 0x2c723546,
+0x58142490, 0xcbb045e8, 0x23583562, 0x49d98622,
+0x1c7badbc, 0x22c55457, 0x891d85c5, 0x571920b1,
+0x39aee8c4, 0xd0728344, 0x55b6aa85, 0xd91b6c3f,
+0xa9a3588b, 0x6c37eebf, 0x3860d418, 0x5a1fb906,
+0x1879e4ae, 0x10f8f4a3, 0x60c5d86b, 0x27a3d40b,
+0x02bd7007, 0x29904167, 0x2889c17e, 0xbaeff04a,
+0x7ff869ff, 0x53f4117e, 0xc9d1f82e, 0x00057e57,
+0x29f142d1, 0x18bfb861, 0x000021e0, 0x8c77dfad,
+0xef096a17, 0xfeaa33eb, 0x243b028a, 0xec38923c,
+0x21984a04, 0x43c052f0, 0x1bc83535, 0x20fe3b1d,
+0x6cec812e, 0x0488a013, 0xdf3b7ba2, 0xa1a86caf,
+0xae6d0a84, 0x136ea208, 0x19e43b80, 0x08706f86,
+0x0733c8a1, 0x024072c6, 0x4ffc002d, 0x04013cb7,
+0xe8063e3d, 0xffffb688, 0x24d4e3f6, 0x2720e60d,
+0xc6880fe8, 0x3822c420, 0xba400315, 0xa337ba84,
+0x67443004, 0xa10ef864, 0x6720850d, 0x08847464,
+0xf328d1f6, 0x3616ca51, 0xfcb76323, 0x38169040,
+0x4b9c8db3, 0xf716cfb8, 0x680d1d01, 0x9c273468,
+0x75b50c28, 0x9d23c616, 0xd4e84b49, 0x04e88c41,
+0xb3c2d541, 0x28ee55ad, 0xe0bf5673, 0x26d8ceda,
+0x254f284c, 0xfe513753, 0x21c50f0a, 0xf9582cd0,
+0xc16a436a, 0xb1df163f, 0xf777e8ff, 0x6a46565f,
+0x0c03e824, 0x13e1bf89, 0x00b587a8, 0xc6df01c7,
+0xa8bd6805, 0x07a1d5d0, 0x032c7edb, 0x116b4eb0,
+0xce09d8c3, 0x72b29a03, 0xc0b6bfb7, 0x35602b3f,
+0x2bc329fb, 0xc0fad47f, 0x151561d7, 0x0fa28555,
+0xfc37421d, 0x3a050b4e, 0x0231c83d, 0xb0e80a74,
+0xc0235cb6, 0xa7c88512, 0x426109c2, 0x1f963375,
+0x2840ec15, 0x33696170, 0x6464167f, 0x6c2d16ec,
+0x683d16bd, 0x99391983, 0x61514370, 0x490e4679,
+0xaa1f3a9d, 0x1b004dbb, 0xac248a04, 0x1d54ec55,
+0x88502608, 0x3519e2a4, 0xed439094, 0xe2410acf,
+0x1acf4421, 0xbbc902b3, 0x10175874, 0xa605ea01,
+0xabe401e8, 0xd7090088, 0x86caf68b, 0x9df86610,
+0x7d86ac1e, 0x68457ec0, 0x86f89120, 0xab00001e,
+0x032603b0, 0xa88e3018, 0x1ad7591b, 0x242cc1db,
+0xbecc68b9, 0xc85e1e44, 0x8fe8fd80, 0xb6fffff5,
+0xec01fc18, 0x802c3a97, 0x7e13a105, 0x933d80a9,
+0x5b509c3e, 0x94c329a0, 0x0e1b4ac4, 0x230a1076,
+0x742110c4, 0xf8edc036, 0xc0b3118c, 0x82838b30,
+0xfbe60405, 0x808338ed, 0x34ae6807, 0x02b10415,
+0xef441d63, 0x07a811ea, 0xa1cf1d6e, 0x845d890a,
+0x4ca93016, 0x6903ca93, 0x9901c232, 0xd03cb71d,
+0x5e0f86d6, 0x1187bc59, 0x842b496a, 0x91c3dcad,
+0x042474c5, 0x4efcc149, 0x02be981c, 0x54688f9f,
+0x3e88676b, 0x901a8e19, 0xfeeaa30e, 0x09c11304,
+0x3273f789, 0x0d8efe10, 0x2b35ff04, 0x35f459e8,
+0x9c84e426, 0x00c608e2, 0xc6ee268e, 0x0b33b1a0,
+0x22bb8e0f, 0xed11bfe8, 0x04b23de8, 0x39ba0c03,
+0xf738e38e, 0xaf5dbbe2, 0x26021fba, 0x24fe832c,
+0xbd59fc30, 0x8115059e, 0x29f0ccc4, 0x1c357816,
+0x250c240d, 0xe03d7016, 0xa49b9043, 0xb6a4fb8a,
+0x0788c5ad, 0xe883c011, 0xc12e4b14, 0x3d12388b,
+0x49e74e92, 0x829815ca, 0x2dc0e114, 0x5023742c,
+0x33211478, 0xe0ac691a, 0x150c4301, 0x4b10270c,
+0x7f11586a, 0x61f05785, 0xb184e8d1, 0x0a4175ef,
+0xa5c88aee, 0x9eb175e8, 0xd087dca6, 0x206aee91,
+0xf141f3e8, 0x8ea03aeb, 0xbf5a263c, 0x2e3b254f,
+0xbe0907ab, 0x4ae9cf76, 0x760dba02, 0xded77ec1,
+0xfc089c16, 0xc1c3cf42, 0x2a099ce3, 0x0d782444,
+0xc7bdc309, 0x24389581, 0xe9d61d58, 0xdfb7cc21,
+0x8d47477e, 0x428a0e6a, 0x3c45bd0e, 0x2f81770a,
+0x0a2d0e52, 0x147714b4, 0xfe8a3238, 0x04c1ba84,
+0x551cfd02, 0x6fe65ce8, 0x8a444e22, 0xf766c709,
+0x33a00645, 0x1a3fb6da, 0x40a84c2c, 0xc7e9f441,
+0x7468c911, 0x84188a03, 0xa2f8bfa8, 0xe90c421e,
+0xee457022, 0x2c4fbbba, 0x3205dc3d, 0xfbff0e8f,
+0x14ef6e7c, 0x7bfa2389, 0x3c744e89, 0x508dbea1,
+0x51b05922, 0x748dbeff, 0xa8a10e01, 0xf929c189,
+0xad0b0709, 0xa4b350dd, 0x36170eeb, 0x15f70a84,
+0xfd37035b, 0x0547fc0e, 0x1146ff26, 0x6360b581,
+0x11097d80, 0xc58e5d75, 0x54ce0583, 0xc6cb358b,
+0x51ac9122, 0x04567ddf, 0x860bd686, 0x5c2eeec6,
+0x8687b834, 0x7e839bfe, 0x1f61c0a4, 0x892674e8,
+0x74ebfde3, 0x8d3eceaf, 0xb75db857, 0x9f59c817,
+0x004da980, 0x455556c9, 0x73395678, 0x8e54033a,
+0xd985bc8f, 0x066e4e6b, 0x6e892c2c, 0xdd630b45,
+0x2deefe1f, 0x4c664de2, 0x883782c7, 0x267527c3,
+0x1a183056, 0x00088a15, 0x72442168, 0x7f3eb6db,
+0xec3f018d, 0x601fb389, 0x0eef5736, 0xb502eddd,
+0x3a6706c1, 0xff56905d, 0x6dfb7019, 0x1649b456,
+0x20c58356, 0x0c19cfbf, 0x795808db, 0x2c21bf92,
+0xa018b6e8, 0x570faf31, 0xa31e2957, 0xec3e2ddb,
+0xfd80e96e, 0x5602a638, 0xd7fbc40d, 0xd11428df,
+0xb1df864f, 0x550d3a00, 0xfbebc152, 0x158a1873,
+0x7a21b807, 0xf52ff56d, 0x36410874, 0x72d13844,
+0xb0f980f3, 0xa5de3645, 0x1a75249e, 0x09a20143,
+0x23b7d154, 0x0406a9a0, 0x33851c0a, 0xb3ecbebc,
+0x500346bc, 0x85048d1a, 0x0a32fb06, 0x1913042e,
+0x53565751, 0xcb200c7f, 0xcd86c10f, 0x20081db3,
+0x43b3cd2f, 0x3a6efbd3, 0x724c8b1d, 0x0cd343c8,
+0xff587111, 0xf889fb79, 0x853c8df8, 0x3da43082,
+0x27ff457a, 0x02468ac8, 0x02763c3c, 0x237c3cb0,
+0x57b59c97, 0x6a82d3a8, 0x91e906ba, 0x5f5e5b18,
+0x704a5cd3, 0xe88d8810, 0x7cdc78ae, 0xb42a5a57,
+0x57a4605a, 0xa094e0b6, 0x74328c6d, 0xf90b5397,
+0xdd0487b0, 0x6c09bfc4, 0x210b0130, 0x38080789,
+0x22c19f01, 0x8a4046c4, 0xb9086f18, 0xfbb60f60,
+0x5d04c3dc, 0x015986e9, 0xd4312675, 0xf0790b93,
+0xee838717, 0x4a85bb1d, 0x77b04d81, 0x760ca03d,
+0xa21d3d76, 0xd6b3a622, 0x1caca190, 0x18e02c06,
+0x503cff6c, 0x1588016f, 0x3335c920, 0x02b98778,
+0xa34056ff, 0xd2de9504, 0x351db0fb, 0x81b7ba8f,
+0xb0522da8, 0x84e31bec, 0x0d54c255, 0x1b46c714,
+0xaedd409a, 0xab9ca9ad, 0x0a10038a, 0x6fbad4bf,
+0xe94306b8, 0xba800f84, 0x890d75cb, 0x87db89df,
+0x161d87df, 0x3d1370e9, 0x697517b4, 0x6335b508,
+0x2522237b, 0x80381be0, 0xdf76fd9d, 0xe78cb868,
+0x3334a416, 0xc873ff4b, 0x75032c35, 0x017b8025,
+0xc1117b03, 0x02ecb53e, 0x9c3d0000, 0xdd3da9e8,
+0xf6d9f004, 0x75128501, 0xe6e9df09, 0x17d87701,
+0x81364d92, 0x51000000, 0x8bf62515, 0x7535f00b,
+0xa3024c0e, 0x2abbe960, 0x5ec2640d, 0x36ac5a75,
+0x0e2d60d8, 0x876eff35, 0x873d2b33, 0x0c1d260c,
+0x35a12ebf, 0x60a3b022, 0x0f08bcc2, 0xf61b6ffd,
+0xff800158, 0x75082573, 0x02738d2e, 0xbf858b34,
+0x01016b20, 0x54ee39f5, 0x46813737, 0x4dd5b073,
+0x20bc16e2, 0x70ff6033, 0xee700386, 0x1ae9e872,
+0x4192353d, 0xf909c90e, 0x97219100, 0xdc30649d,
+0x2a3faa00, 0x36dfdd00, 0x2f752b46, 0x06e00b06,
+0x53158efc, 0xb2ff6a5d, 0x647d6a50, 0xeb373363,
+0x94f2184c, 0x650dc647, 0x968085b0, 0xb1287605,
+0x780cf20d, 0x3bb59020, 0x523b0e15, 0x061fb683,
+0xeb217b6b, 0xe1143456, 0x7581f874, 0x1e281e13,
+0xfb0e43bf, 0x9f3ceb27, 0x962b2a33, 0xcae46475,
+0xb47f23b6, 0xdab45298, 0x1917a971, 0x9b0203d5,
+0x74876482, 0x89fdec7b, 0xac05d13d, 0x044facbf,
+0x06702ada, 0xb51948c6, 0x305d6825, 0xc0854a42,
+0xd320674a, 0x33650d59, 0x12341832, 0x04378b74,
+0xf0e0fd20, 0x4efa2474, 0xe4a91187, 0x70098e59,
+0x64230418, 0xbf5c9110, 0xc64920e0, 0x7e0786eb,
+0xf807b905, 0x38402605, 0xe8e3d36b, 0xdf80df66,
+0xc7b62de0, 0xd1f61c71, 0x29f9f799, 0x38009a84,
+0xf19b9136, 0xc9114822, 0x9a09bfc0, 0xf541bf5a,
+0x547883c8, 0xf6197601, 0x2b6a0648, 0x71f7c6c5,
+0xefff7154, 0xc7ca8211, 0x3922d519, 0x2a776870,
+0x0d390572, 0x58f77823, 0xbd237764, 0x58428b20,
+0x897c1430, 0x410335df, 0x68511364, 0x77067272,
+0x01db7022, 0xe81e51be, 0x7007e007, 0x2db567ff,
+0xff772a6c, 0xa7c41152, 0xc1482dc2, 0x5028a502,
+0xae962771, 0x09532981, 0x136c2840, 0xf119222c,
+0x1346e830, 0x61a09187, 0xbb0c8714, 0x709faaa9,
+0x00bdcdb0, 0xc5393001, 0x08c16373, 0x0e24613a,
+0xbdff01e0, 0x11ebeffb, 0x7239add6, 0xbd117760,
+0x0a775c5a, 0x5c582bcd, 0x01f5701b, 0x5260b58f,
+0xfee6e89d, 0x2b151853, 0x1443063a, 0x5fac1d45,
+0x30745bd0, 0x797bb172, 0x02b0cf12, 0xcc68713e,
+0xdb0fe2d4, 0x6c8451ce, 0x82449d08, 0x6da2ce2d,
+0x5a545c79, 0x0df420ff, 0xb58dc11f, 0x89b6fbff,
+0x50d829e8, 0x475bc016, 0xe8060174, 0x3d26d698,
+0x6f621bd0, 0xdd75f339, 0xd15e18d8, 0x8bf294ec,
+0x61eaca6c, 0x8c2851e1, 0x36e838fe, 0x99cc2ee1,
+0x4848304c, 0x401ce989, 0xeb1407f0, 0x95df11ce,
+0x7d9ece43, 0x70f87839, 0x74560b70, 0xbd2912ac,
+0x6768df01, 0x06435fc5, 0x94e8033c, 0x267987fe,
+0x97aa4145, 0x46fa3510, 0x835a09e1, 0xff03e01d,
+0x22ab4c40, 0x4f648fd5, 0xe02c85b8, 0x83ba07b7,
+0x02471c7a, 0xc7784288, 0xdf007442, 0xc3f42c3b,
+0x0a5ca8c5, 0xff361f26, 0x9f42e668, 0x8295b40e,
+0x122d7866, 0x0cede037, 0x4920aa7a, 0x1734de30,
+0x8c3751de, 0x380e5f74, 0x10b93c61, 0xc9ba2a00,
+0x3c382a82, 0x801e253c, 0x392841df, 0x2a2476c1,
+0xed0a4c41, 0x6051dbd4, 0xd283f045, 0xb72b1f1c,
+0x20a6d86d, 0x8c3dda11, 0xe8d13840, 0x63e2b84a,
+0x8174512a, 0xa39a48e2, 0x45ee0b06, 0x50d02934,
+0xee15f618, 0xe887c513, 0x50226dbe, 0x0729aa9f,
+0x89cfa520, 0x5409bf62, 0xfef88327, 0x2f2d2274,
+0xec745203, 0x10902168, 0x575d10c5, 0x91a5a931,
+0x4c6248d8, 0xb70549d0, 0xc5c02652, 0xf13631c5,
+0x91ea22a2, 0x8da18865, 0x83a3144e, 0x9ea759d8,
+0xe1945a23, 0xc7b34358, 0x3a3f7b5e, 0x93e83fb9,
+0x30ab88fd, 0xe1d557b4, 0x90d87926, 0x3234ec83,
+0xea1e7060, 0x2d7437e1, 0x1886fe68, 0x0d750cfa,
+0x2c7a0065, 0x75488544, 0xa9bb2ef5, 0x78ab206a,
+0x6a20b33c, 0xef91ea84, 0x54020fa0, 0xc98b0d50,
+0x5cbe109e, 0x82e06d8a, 0x44922ba1, 0xee0f995e,
+0xa1087198, 0x0487730c, 0x0e4040eb, 0x3025211b,
+0x41fb7325, 0x0602641c, 0x9610cdeb, 0x497149ac,
+0x7e0c6bb5, 0xde1d910c, 0x920addb1, 0x8c3f5028,
+0x6844e7dc, 0xca45fdb0, 0x0405742b, 0x7836722d,
+0x08f4f720, 0x36a8f00c, 0xdec86741, 0x20244424,
+0x28a9513a, 0x2e789b10, 0x406a01bd, 0x25ea9b7e,
+0x930bf278, 0x8cef901c, 0xd8194326, 0x20d17ceb,
+0x9f001b14, 0xd8a27c2b, 0xa1159a19, 0x2005c012,
+0xcfed0877, 0x14b59f4c, 0x141d6009, 0x102d6e1f,
+0x0a5149fc, 0x3dbf075e, 0xa36b95e8, 0xf7fe3120,
+0x94749931, 0x72381d39, 0x783589d9, 0x548af79f,
+0xa308f603, 0x9f309f74, 0xb3d27094, 0x1718a64b,
+0x909ab548, 0xf0f1d114, 0x7cdf8b9c, 0x9b776c1a,
+0xbab38e02, 0x34fa361c, 0x39567305, 0xea36944a,
+0x8b477532, 0x75af4b0b, 0x5c91ec63, 0xd3b938eb,
+0x2d7ed27a, 0x16a97dbf, 0xc83c2d46, 0x6c051e75,
+0x177502c8, 0x513ee6c1, 0x161c503a, 0xc446c809,
+0x0ddfedff, 0x6beb0842, 0x104a3941, 0xd87ad37f,
+0x55b3d108, 0x539caa72, 0x37ba4169, 0x187a461d,
+0x7008e9c1, 0xedc45630, 0x39212893, 0x1b749454,
+0x89592ca9, 0xb1cd14d2, 0x04065f63, 0x590b9b2e,
+0x352c1bc1, 0x76097061, 0x1013002b, 0x835b002f,
+0x1ca9441e, 0x1b78808d, 0x6dc37047, 0xdb464085,
+0x741d1c52, 0x1a3c6edc, 0x031a5808, 0x2b001970,
+0x6c043546, 0xf8cc0eed, 0x1adbfbf6, 0x8723dbe9,
+0x441cbc54, 0x031a42c6, 0xa0c60ac4, 0xe7df8619,
+0x5b1177a1, 0xf3e6b1fa, 0xe8fefe81, 0xf5477b04,
+0xc32d9187, 0x49137507, 0x1bc67173, 0x2396e84e,
+0x9a510b0d, 0x7a8600c0, 0x4859890f, 0x49a0b9a9,
+0xf31db357, 0x1e82e6c6, 0xc43ddf4d, 0x1e060ad1,
+0x3dc28098, 0xf759cdd7, 0x0406e881, 0x380a0466,
+0x0ae5ba08, 0xe89b7a64, 0x021b1826, 0x54d64d4e,
+0x5022be9f, 0x6c0f7702, 0x2cc0f505, 0x0ce86403,
+0x819d76c0, 0x92f22837, 0x88aad75a, 0xda22ed5a,
+0x88f8dc25, 0x0289e5d0, 0xa96c774b, 0x638b9d5b,
+0x20620642, 0xd0703e30, 0xf2c15734, 0x5fba3026,
+0x1d071db1, 0x146a8f14, 0x6071391d, 0x3c80cee9,
+0x1c0c6418, 0x0cb1ba4e, 0x1f56115c, 0xe80e2819,
+0x83e2247f, 0x1174fce2, 0x0d7401a8, 0xd6c1becc,
+0x8bd089de, 0x24c6f533, 0xcc7e24fe, 0x86f03a1b,
+0x6a531705, 0x1902163d, 0x0b448850, 0x6e1a0474,
+0x6486395d, 0x1736685b, 0x3c1f19b1, 0x2bdbe13d,
+0x4f448a4f, 0x27eb18cc, 0x4770f043, 0x909e0c28,
+0x8dfc6f86, 0x09c78470, 0xb0ff8147, 0x2c0e4f82,
+0x4206eb40, 0xd506b400, 0x2df34d77, 0x435c43a7,
+0x16be661d, 0xb51cc883, 0xc405826b, 0x18742139,
+0x6cdd6c20, 0x83ac26c2, 0x0d18053f, 0x80ec3f02,
+0x05bc21a0, 0x4016771f, 0xb09b3110, 0x0c353b1c,
+0x6f82a041, 0x67cdf80e, 0x571723ea, 0xd3462a41,
+0x661c3500, 0x073ea647, 0xdc11618d, 0x5bebfc0d,
+0xd072a730, 0xbf068a17, 0x578d4175, 0x01935429,
+0x3a529fdb, 0x8a9ea998, 0x104c2a20, 0xd80a4984,
+0x0f9b04f5, 0x7003072d, 0xebd9e276, 0x09f04c1b,
+0x10783ed6, 0xbfd80049, 0xac84d801, 0x45593630,
+0xe510a774, 0xcd4ac0d2, 0x276c2b06, 0xd8b03c14,
+0x17d4c9e4, 0x1d9a20fe, 0x168b8bd8, 0x46db2e9a,
+0x3dc600cc, 0xcd05ea0c, 0x067c63f1, 0xf7c2a5f0,
+0x3fc221da, 0x90c3c909, 0x3af4d080, 0x8c2d805c,
+0x0030bef4, 0x06880e58, 0xa0841a54, 0x0a6b54d9,
+0x674cc00e, 0xd3847d97, 0x289f0d28, 0x7520b82d,
+0x19cd1fee, 0x3b017f09, 0x25c751d6, 0x25346ab9,
+0x93dfd9ba, 0x2723ebc8, 0x4a88e90c, 0xe35b1424,
+0x4ea34064, 0xce64e2dc, 0x021df7b5, 0x5d763f0c,
+0xbe1ece80, 0x064c032f, 0x52500bec, 0x630a742e,
+0x2f36f02f, 0xf8095834, 0x40619e74, 0xbb603603,
+0x5052318d, 0x075c462d, 0x23830c38, 0xa772a377,
+0xa8f81d28, 0x0319bbdf, 0x11047c4b, 0x7d73b365,
+0x3633d9d7, 0x05371955, 0x1d10c314, 0xe20b0c04,
+0x83afe272, 0xcdc25c5f, 0x32245ed0, 0x58cd5968,
+0x0aec1808, 0x15be7e2c, 0x21c0dbdb, 0x244651a7,
+0x6a0c0637, 0x3b18b42b, 0x7b20aa1a, 0xa5f60b84,
+0x03830a85, 0xfb2a1510, 0xd5fb1f52, 0x617f3b81,
+0x3a8b038b, 0xd2751046, 0x6e9db42d, 0x20462b14,
+0x02700776, 0x095afb85, 0x9d58a366, 0xdcfc0420,
+0x0c158902, 0x0bf6bc56, 0x1474ed68, 0xc0f15031,
+0x82b15389, 0x176e8a91, 0x48dc30f1, 0xdbd54cc1,
+0x21c66f7a, 0x01501f67, 0x5c1cff90, 0x041c8324,
+0x6ef87118, 0x1d048c97, 0xff0120d4, 0x9a508143,
+0x43430b33, 0x10228507, 0xa7201ccb, 0xc25ec13f,
+0x9f1076d6, 0x10c42620, 0xb092e03e, 0x691c226c,
+0x41dbf608, 0xda2551ad, 0x09044618, 0xa46c613a,
+0x08b20606, 0x0843841e, 0x08bd87b7, 0x19531c1b,
+0x39392120, 0x68d43221, 0x127e28fd, 0xb48b6c21,
+0x24bcea24, 0x53008d4b, 0xe81086b7, 0xbea85661,
+0xfa250802, 0x0ebacc14, 0x068abf15, 0xe9470788,
+0xddbe1061, 0x1d0512d9, 0xb156d30c, 0x1b0f4613,
+0xb01e68ab, 0xf676090a, 0x6f605fe9, 0x01752e40,
+0x45757318, 0x2b24848b, 0xecc1bdd7, 0x186c0683,
+0x65783b80, 0xf9b6315f, 0x8a0773b0, 0x700feb03,
+0xceefa603, 0x43701a4a, 0xe9da7529, 0x4669023a,
+0x8c0701a8, 0x1c5128e0, 0xc7bc3dbd, 0x097523bd,
+0x0d465a11, 0xb708756c, 0x178f6fd9, 0x0c13eb46,
+0xb90e7568, 0x030a170c, 0xe17d94b1, 0xc89104bf,
+0x75783c20, 0x7e1cf97e, 0xa1639113, 0x11ebeca5,
+0xe2cd8712, 0xffb76fad, 0x74727c6e, 0x0045c60e,
+0xd0884530, 0x09885843, 0x40c98545, 0xa752c4f0,
+0xf7d8fb79, 0xcffc36ff, 0xab84808a, 0x831ad009,
+0xe87904e9, 0x9f015ce9, 0xfbdd6462, 0xa4850f64,
+0x5e177152, 0x0fd8120b, 0x1615eb70, 0x711b8131,
+0x730979f7, 0x4ff7452d, 0x3603eb89, 0xb9f70250,
+0x05c8210a, 0x6f6e8a1c, 0x0403e42f, 0x70558830,
+0x006667b8, 0x896e6cf7, 0xf725e04c, 0x11038b79,
+0xc1ef4170, 0x5d3202fa, 0x2589f035, 0x8dbe75fe,
+0xda39ff55, 0xbe18c312, 0x6f847b0a, 0x88026ddf,
+0x124a430b, 0xafe9f177, 0x4675404c, 0xe261118c,
+0x049f2c00, 0xdacadee4, 0x2276d88b, 0xbba0500f,
+0xa1b62bf0, 0x55f29568, 0x0e805f12, 0xa9c5631d,
+0xe277240b, 0xc253dd4d, 0x4a64ebdb, 0x4d3d7521,
+0x8806538d, 0xa787d820, 0x0492e542, 0x419968e3,
+0xc93035d2, 0x72cc3b86, 0x0fef2241, 0x7563e12b,
+0x06eb5d30, 0x9c07068a, 0x947378c2, 0x2573eb90,
+0x03d12a3f, 0x249b78fc, 0xe746db72, 0x17671885,
+0x2e30f12a, 0x0200c603, 0x0c11842b, 0x270e62d8,
+0x6010d46c, 0x51c07888, 0x87a0b0c4, 0xb4fcc4aa,
+0x4cc1145d, 0xaa081b5e, 0x60828c95, 0x40dbcb19,
+0x5c563dbc, 0xb200b01b, 0x938a30cd, 0x7d2ff46e,
+0x84464716, 0xd28426ae, 0xd0382274, 0x2ec188d1,
+0xc626ffdf, 0x20488d03, 0xd188c888, 0x4a0bc2f6,
+0xcd4138ca, 0x034fa5f4, 0xcdd0754b, 0x2a4c1f02,
+0x5f5eb576, 0xafcbeeed, 0x8afc56c6, 0x01884202,
+0x6df6ed41, 0x72a9c3ab, 0xe6320315, 0x7da15bdd,
+0x834ade89, 0x20ce8ffa, 0x23430388, 0xa6827bf0,
+0x53edbd46, 0xa63d4c49, 0xd3a0a5e0, 0x4206742e,
+0xac05c834, 0x4b24fabd, 0x82365e48, 0x4c5fafba,
+0x2769d648, 0xc0dac7f4, 0x742c4e2c, 0x05754912,
+0x0f60b0c6, 0x0aeb7ebb, 0x63ee7511, 0xedb5f0a1,
+0xc388565b, 0xdb181a2a, 0xc1f0a527, 0x7eb1562f,
+0x38845fc3, 0x154a0910, 0x793f20a0, 0x5a08cefb,
+0x200f401b, 0x201f5c30, 0x21c2cc02, 0x0cf2df00,
+0xaefeec6e, 0x8d49d1f7, 0x0a351904, 0xf7736f48,
+0x17201bda, 0x89394510, 0x1a2384c8, 0x11f2537b,
+0x6fefe805, 0x050b20ac, 0xc829f461, 0x102474d3,
+0x4900dc11, 0x8925b81f, 0xf63dedf2, 0x8a136c37,
+0x740a3a08, 0xebf6db08, 0xe04d0605, 0xd8fbfb10,
+0x404309eb, 0xd889db3b, 0xda2359d1, 0x72cf83d1,
+0xd862da89, 0x0cac64d8, 0xe72b1137, 0x2fb7d193,
+0x326b5bd8, 0x8b0ff985, 0xa816741d, 0xfa036086,
+0xbb708640, 0xd1e456da, 0xc14dc4c5, 0x1ee8c711,
+0x1f05bc42, 0x211eeb04, 0x8099f08c, 0x98089d11,
+0xb1400471, 0xa36755d7, 0x743b8d26, 0x1ecb19d8,
+0x34301953, 0x64963b24, 0x06892f57, 0x2b8230ba,
+0x1361f022, 0x5e143d0c, 0x0bf0aee1, 0x4d5b0c1a,
+0x24812316, 0x60082437, 0xd6821318, 0x6da26894,
+0x11a1a963, 0x01021398, 0xb82fc24c, 0x4143e56e,
+0x2fef754e, 0xd1b70554, 0xe2904062, 0x45b4210f,
+0x570d4adc, 0x7578a5c8, 0x3e1034f1, 0x5c6ea6c0,
+0x8ed1d8e5, 0xe71829d0, 0x74bacd89, 0x7fd3eb3a,
+0x348878ca, 0x39ce8906, 0x4e187ce9, 0x462e8555,
+0xa824a054, 0xe13452f6, 0xeed2d2a5, 0x5784e87d,
+0x2c1815b1, 0x2b6649a6, 0xdfde3417, 0x428a208f,
+0x89384201, 0x160bebd0, 0x8a8e8ab2, 0x0c8fb420,
+0xac87f457, 0x7277011f, 0x8f803d83, 0xc5525c83,
+0xeb02fd16, 0xf101d858, 0xbf3d8053, 0xc60c7567,
+0xc1820d94, 0x9911572a, 0x788def10, 0x01c8e414,
+0xab3116a3, 0x8d943a03, 0x80627b0a, 0x14d9560d,
+0x0595d554, 0x768d52ab, 0x72ebb70a, 0x45305f40,
+0x82041ae8, 0xfaac0140, 0x2741590c, 0x01bb60a9,
+0x01186f88, 0xb82d0828, 0xa229e807, 0x6db6fbed,
+0xfe682141, 0xffe80957, 0x14eb0bfe, 0xde0895b9,
+0x4e08ff84, 0x80a2bd0a, 0x89f15084, 0x8037e2d8,
+0xbb3eddd7, 0xd0bfcba4, 0xd1ff9549, 0x99208a96,
+0x0a009d06, 0x571006c5, 0xf163e396, 0xc1667c37,
+0xc58908ea, 0x53380ad9, 0x00ed1e1a, 0x1838685f,
+0x47c73174, 0xa4250688, 0xad18b18a, 0x5ad69cc7,
+0x420e0828, 0x81323b1b, 0x89f2bb15, 0x005588e8,
+0xe9036200, 0x1c71ab06, 0x93b2177d, 0x0a0391b9,
+0x5b083008, 0xec0adb2d, 0xfee938c2, 0x71bb5b2d,
+0x2d611325, 0x844d248d, 0x7382008d, 0x6cad4547,
+0x5b2d840b, 0xd81d2d17, 0x47ee08b7, 0xffffcf0b,
+0xa9001037, 0xdc6891e4, 0xfb2641fd, 0xad694882,
+0xaa9e0c2e, 0xcde9c45f, 0xd20a43ef, 0xf447f053,
+0x89d0b18d, 0x66032bc1, 0x04587983, 0x0fee06dd,
+0xa8796c27, 0xe9ec7239, 0x04412aa2, 0x42c60251,
+0xd70916f0, 0xc9ba090d, 0x6dd277fc, 0x037b80f0,
+0x064d15f4, 0x94112204, 0x2bc2722a, 0x02651115,
+0x173475da, 0x5e067f04, 0xa01851c0, 0xfeb78614,
+0x43ddb4dd, 0x08af28eb, 0x06b82d75, 0x35b82606,
+0x14741080, 0x84dc1f68, 0xbecbf00c, 0x29c63c8d,
+0x0ceb0ee9, 0x5616eb8e, 0xb84a4751, 0xcda23a44,
+0x0a13e922, 0xc7f182fe, 0x9a340300, 0x6d080e12,
+0x2c32fca9, 0x0b38a169, 0xdc5f029c, 0x1d8845e2,
+0x23fad5f6, 0x5c545b07, 0x4b821161, 0x204a5e54,
+0x7495f107, 0x6ef4e8a1, 0x109814b6, 0x3e0bec75,
+0x0b146c2a, 0x43c1dc26, 0x7d8b3673, 0x0006d00a,
+0x2e8b8185, 0x70a25b1b, 0x130c852a, 0xb403be1c,
+0xd8a11659, 0xb62c4535, 0x39eb1e32, 0x01303f2e,
+0x03a62900, 0x0e42c8b6, 0x6fb285c4, 0x91fb8c0b,
+0xffcc7919, 0xd62d67ff, 0xbe72a464, 0x7d01355f,
+0xfb35c653, 0x7e3e8777, 0x2fad8a8d, 0x4e8d4ec5,
+0x1d022a24, 0x1aeba685, 0x0703d159, 0x42f90506,
+0x2488d5b7, 0x08073bff, 0x6d4a2488, 0x513985f8,
+0x08e2c11a, 0x8a194141, 0xeb6bafa0, 0x09340b20,
+0x0dfc0a63, 0xafb77775, 0xeb050fc9, 0x75025329,
+0x3503501f, 0x10b008dd, 0x0307cd03, 0x04240908,
+0x0b2af0d7, 0x2d1e04cd, 0x05e901d9, 0xfa852749,
+0x15daacff, 0x9fc2374c, 0xe0368696, 0xf5b0f04d,
+0x96801209, 0x9c163498, 0xab20c1c0, 0x10071a7b,
+0x9b116600, 0x1881de61, 0x6bed1241, 0x0c26c5c3,
+0x0fa70e06, 0xe884056b, 0x01c06b27, 0xa93e0000,
+0xec1022db, 0x0f030eb7, 0xeed3f4b0, 0x513d02e9,
+0x570a7f04, 0x6872e913, 0xf603a036, 0x18643704,
+0xc58843d5, 0x1122ca6b, 0x18367339, 0xd94eb610,
+0x6023b34a, 0xcd684de9, 0x86d84233, 0x3756056d,
+0x76e94d33, 0xdea90e0b, 0x157631ea, 0x906c1639,
+0x1606a96e, 0x877ceb40, 0xe4a1e305, 0xb50608da,
+0xd7d8b10e, 0x12c1d778, 0x7df3fcff, 0x05c54f11,
+0xf147d490, 0x8a101b10, 0x0c9d1296, 0x100e1516,
+0x7df1a523, 0x1464d7ec, 0x1f742d3d, 0x3d097f06,
+0xbc2e1800, 0xeb0b0dfe, 0x5b3d3d1b, 0x872e12eb,
+0xb82dd4ae, 0xc0020510, 0xfbf80305, 0x8e628b57,
+0xe856af89, 0xe0e8f6ec, 0x950e1767, 0xfd44eb56,
+0xffffc995, 0x8b070874, 0x3dc92d5d, 0x984da10d,
+0x1078009d, 0x460e6206, 0x952561c6, 0x181c570a,
+0x2eba0c07, 0x530456f8, 0xad08063d, 0xa60bf885,
+0x6a3c5da4, 0xdd35f7ff, 0xeb786c66, 0x8bf802e8,
+0xea053b77, 0xf11a74eb, 0x645594ba, 0xdc1ba31c,
+0xabb10705, 0x8330b60a, 0x5b62188a, 0xe8a120c5,
+0x22931154, 0x13733d07, 0x88c14508, 0x0200086e,
+0xec0e7a14, 0xcdf41018, 0x82613bad, 0x3606ec45,
+0x3c89660e, 0xd0d63db8, 0x54669e1f, 0x189a5078,
+0x94908912, 0x46360c11, 0x980e1ce3, 0x8804d9e1,
+0x052474aa, 0x7ac0ff9c, 0x4ef53aca, 0x8a5f5b24,
+0xf120068a, 0x934af6fa, 0xb26ba490, 0x32cc2d2c,
+0x0c1d87a0, 0x817800a2, 0x7875abba, 0x31ef110d,
+0x4780828d, 0x7553ad82, 0x82dc89f6, 0xff0c0998,
+0x08fd1066, 0x2790820f, 0x0d09e1b0, 0x50081b8b,
+0x15ccdbc6, 0x1894d122, 0x1c76613e, 0x2c4e8814,
+0xd102fde3, 0x04f93449, 0x720b4306, 0x2a044c05,
+0x520013ff, 0xf5f45176, 0xcce44276, 0x83ac6001,
+0x52b152dd, 0xa2d438c4, 0x388afb3d, 0x73a33b36,
+0x2b743939, 0x0ec59b74, 0x5d26a78b, 0x48e8f3f3,
+0x015397c1, 0x1cfc9498, 0x11603000, 0x74145cac,
+0x8e84a680, 0xfcf59861, 0xe46c5b79, 0x025efa43,
+0xa0559d53, 0x0cb08b86, 0xdf4586a8, 0x30c2637c,
+0x82968b1e, 0x0b1df012, 0x94061078, 0x7e086840,
+0x861b49e4, 0x4ecb24b4, 0x3301069f, 0x72058692,
+0xbbf4ff06, 0x7698c06c, 0x986a0079, 0x6181de0e,
+0x7cb7790b, 0x982c093a, 0x0ca41b0b, 0x8d87c716,
+0x8e134510, 0x841b8903, 0x3c632362, 0xb620898b,
+0x2bb2ba46, 0x9b189960, 0x6615c908, 0x3be07e9e,
+0xca417a24, 0x0276095a, 0x6a89100a, 0x504ed962,
+0x0fc961c7, 0x4a0666a4, 0x1162b58d, 0x8d3b1551,
+0x281115a0, 0x808d63ff, 0x94186117, 0x08b162f7,
+0x24c44813, 0x00df17e0, 0x478b686b, 0x018b840c,
+0x4c4afedc, 0xf01e6f45, 0x47b0ee83, 0xe038ef10,
+0x7630ad0e, 0xf0390ebb, 0x548a1573, 0x6a06414f,
+0x9c80fc98, 0xcf1213d1, 0x518d5610, 0x6eac5208,
+0x81552ea2, 0x0e73aff1, 0x9d21bbbe, 0x5bf03e90,
+0xf335c45e, 0x11845596, 0x782a7860, 0x28a963b8,
+0x6d17c32a, 0xc1d502e8, 0x02292514, 0x7ab01131,
+0x00ba1c02, 0xbf5b084f, 0x31422ec8, 0xf2d95b26,
+0x08c708ed, 0x0b8de9be, 0xeade0a46, 0x89d7fb10,
+0xbf05dec7, 0x1d110815, 0x99b46f83, 0x4e5ec66a,
+0xfb811cc3, 0x060c50d3, 0xcd377eef, 0x7206e8eb,
+0xe846b1b6, 0x450e0e56, 0x0c22da1b, 0xf0948145,
+0x4f54d2d1, 0x1e8d5388, 0xe084d2c7, 0x857634b6,
+0x4449c7bc, 0x3082ac8d, 0x72f4d001, 0x7625a80d,
+0x7234b778, 0xfce00976, 0x05dbbea8, 0x846c9501,
+0xd9293911, 0x81788e3d, 0xdbfdfcc3, 0x2dd50bf1,
+0x0324530c, 0x12018802, 0xe7175a15, 0xdf440306,
+0x6a030d0b, 0x79803431, 0x7b5420b0, 0xeaa11007,
+0x1e4682cb, 0x18f4a114, 0xea03a8d5, 0xef9e7747,
+0x8a232c26, 0x145ea435, 0x3f34ed18, 0x1984e8b7,
+0xcc040015, 0xdca0163a, 0x186b8758, 0xf6e20a34,
+0x4148d054, 0x2d757a7e, 0xa7a8042e, 0x08247543,
+0xc3123ba5, 0x0646df0e, 0x0d270434, 0xb91f56ee,
+0x088f52ec, 0xbbbe0a06, 0x81040b21, 0x24731cfa,
+0x2a940f6e, 0xfd6d5356, 0x38c097ee, 0xb0491585,
+0xe3b684f0, 0x073d3adb, 0x7f7c2e86, 0x1b2188fe,
+0x2dde96b3, 0x3982fa09, 0x38ff239a, 0x2be8e0ab,
+0x4bd07601, 0x941be80d, 0x1f181a90, 0x589703ed,
+0x2c148084, 0xd50bbb12, 0xf3897d98, 0x89c01d03,
+0x168692ec, 0x640105bb, 0x980794a1, 0xeebbbb35,
+0x11bc25e8, 0x4ee85ea9, 0xa6e10486, 0xddd502b2,
+0x09d713f7, 0x13e82a39, 0x5ba138be, 0xd68f0aa0,
+0x1d1c0e48, 0x2495033b, 0x518f0550, 0x62cbc034,
+0xf02324ab, 0x47efbbbf, 0xdc94d406, 0x6712c358,
+0x11602130, 0x6c833d83, 0xc0c20761, 0x1416a760,
+0x23056629, 0x3b7114e1, 0x299b7622, 0x2f021afc,
+0xcf6c12f8, 0x0210b763, 0xc48f0800, 0x14110800,
+0x8f463467, 0xb3567f08, 0x227fbcb1, 0x6612a35b,
+0x8f810dcb, 0x08dea046, 0x9201898f, 0x0b67d25f,
+0x039cdf51, 0x01a00515, 0x6d8c8c08, 0xe98ca8b1,
+0x0708a511, 0xb7c8db63, 0x0d7328ad, 0x0d16ff0d,
+0xab69762d, 0xf2f8147f, 0x080dc184, 0xc8db62b7,
+0x110baa8c, 0x84ef08c0, 0x8dbb3cc5, 0x0f3c367c,
+0x0801e40d, 0xb1a8cd8c, 0xe0558aad, 0xdcc71108,
+0x284d57c8, 0xc3a73013, 0x1edb7f30, 0x0457b6d9,
+0x201e0d20, 0x1404207f, 0xb7236d0d, 0x0801ee73,
+0x1115d48c, 0x36d83ced, 0x24d73bf6, 0x08120d22,
+0xba01f88c, 0x23f6c8db, 0x08251111, 0xae280219,
+0xc6a136be, 0x0847710d, 0xe46832c4, 0x2d0dd916,
+0x33168c08, 0x8d632df6, 0x2e700815, 0x3a0d7736,
+0x7532d9aa, 0x7318084a, 0xc1b1b6ed, 0x76125b1b,
+0x3d08390d, 0xcd4b234d, 0xf80aa55c, 0xb0f25202,
+0xdce8ea31, 0x103b07ed, 0x8321ee56, 0x732a721c,
+0x321c8319, 0xad0890c8, 0x64190ff7, 0xe6e40190,
+0xc832ef01, 0x2bd52721, 0x833369c4, 0x0db3481c,
+0xc9c8b830, 0xe9041ec3, 0xf02e1ea5, 0x321c8394,
+0x6e8670c8, 0x20d8c875, 0x0d67f823, 0x320d87f9,
+0x4bfa5932, 0xe4e4f83a, 0x1e3a20d8, 0x202cf125,
+0x233c9d87, 0xc7101bf1, 0xc8793c83, 0xf9f2130a,
+0xf272fd00, 0xe8f39390, 0x90d7f41a, 0x0f1e4e43,
+0x872cc6f5, 0xb5643c9c, 0xdca4f64e, 0x20c87939,
+0x82f76593, 0x0e4f6393, 0x0d74eb90, 0x6472f871,
+0xb6669190, 0x8ef96858, 0x4a72320c, 0xfabe3c94,
+0x4ed82702, 0xc2190a2e, 0x20d8e495, 0x1d0a23db,
+0xfb1e2318, 0xc1d020a2, 0x0c0002b2, 0xdc310042,
+0x43ae0433, 0xc4a85127, 0x57561959, 0x09e8edf8,
+0xff0e317e, 0xc8fcfad6, 0x25c58909, 0xb6c01682,
+0x506e5d41, 0x58fa83fc, 0x20eb0774, 0xbb38eb2b,
+0x5788c780, 0xd0246818, 0x7412e65c, 0x1d8f4159,
+0x67901476, 0x3d481e6c, 0x164a0d04, 0xa0ed8a17,
+0xe672c88d, 0xb108a30b, 0xf510db0e, 0x87cac885,
+0x8bac817d, 0x09ef57ed, 0xe4300272, 0x550a88ae,
+0x25c9b9c4, 0x093cd803, 0x0205644a, 0x3d0a6f32,
+0x0c9724c8, 0x07310c0a, 0x3c0b23f6, 0x1c244c8a,
+0x3c9b0b40, 0x7ccb25e4, 0x5c777cf0, 0x3a216432,
+0x1325900c, 0x0db59320, 0xc932160c, 0xa6dc7a55,
+0xa442f1a2, 0xc8494350, 0xa4e35c58, 0x2fa3c6de,
+0x410d4763, 0x35932088, 0x963e3b3a, 0xa9050a8a,
+0x44100c2f, 0x9e803b74, 0x203cfa81, 0x630fa89d,
+0x6fcd70b9, 0x8925dfe4, 0xca684524, 0x042d82aa,
+0x0016c468, 0x3db3504c, 0x82855527, 0xe6b882a6,
+0x4bea7ff1, 0x0fd83947, 0x3b810982, 0x5f32335f,
+0x75456a75, 0x09765b13, 0xb1617420, 0x9eb7b7fe,
+0xa87dc22e, 0x0742130c, 0xc984f87c, 0x7b804a75,
+0xb1b84508, 0x2953632a, 0xb7e33456, 0xef7fa402,
+0xefb9d1e3, 0x6db1fddb, 0x7b812375, 0x765fff04,
+0x23eca312, 0x90c04b78, 0x25a3e0cb, 0x21588b37,
+0x87a28375, 0x68399fa0, 0x41d67883, 0xd4e80574,
+0x7c0464ec, 0x305b08e4, 0xcde23d83, 0xbc540b62,
+0x0d0d2922, 0x628c05d6, 0x62681ba9, 0x9aafc413,
+0xf1b06140, 0x3e2058d8, 0xe4c30158, 0xfd7b8861,
+0x03bedc40, 0x61e601b5, 0xe608b0b2, 0x54c89543,
+0xe60430bc, 0x00b7a142, 0x10d7260b, 0x692a2542,
+0x3bb80b05, 0xc3c39d52, 0xc1e80445, 0x6dc22e39,
+0x08de7d14, 0x9680fb46, 0xd575831e, 0x7008d002,
+0x826d880d, 0x0889c202, 0x5b583153, 0x0410033c,
+0x1230a202, 0x4b836855, 0x1b073d77, 0x0456c112,
+0x98418202, 0xd23b17fd, 0xd3ba3e3b, 0x2810624d,
+0x0b6c1bb5, 0x5728a060, 0x13e0bfdd, 0x4c50878a,
+0x803903c4, 0x127fb667, 0x0e1fb007, 0x3016e409,
+0x0c25845d, 0xea08eae8, 0x50046b80, 0x74077aa7,
+0x254c008d, 0xe204097a, 0xf48c1729, 0x4f0a0b4c,
+0x9d9f1f40, 0xf0adf868, 0x80050caa, 0x01e74519,
+0xe286d879, 0x962a04a3, 0x0c402a08, 0xeb01cd2a,
+0x0609100e, 0xaf2a1440, 0x26029800, 0xd8c937a6,
+0x4020ba59, 0x65092824, 0x8c6229ef, 0x9d2a9d02,
+0x277c0140, 0x686e30cf, 0x33a26822, 0x681d4dbe,
+0xda57163c, 0x761dd52c, 0x2cccc990, 0x0209d04f,
+0x66c3b81a, 0x12d4482a, 0x49d98683, 0xe4e031c6,
+0xbe1eae2c, 0x097582a5, 0xc7a93103, 0x4dd1ec31,
+0xe3f37cf2, 0x0709f8f4, 0x548bac1e, 0x310109c9,
+0x0ecd6807, 0x007cd239, 0x2d08c12d, 0x4ecd480c,
+0x1c8009e8, 0xc9f66d2d, 0x224857c8, 0xe1948c34,
+0x98300521, 0x5b2d9ced, 0x37ea81b7, 0xdb680166,
+0x7031a068, 0x5ac63878, 0xde6808d0, 0x7070f168,
+0xaee0b005, 0x2081e786, 0x0991409c, 0x284ecef6,
+0x2d209ee8, 0x8720f55f, 0x03f56c04, 0xe8af76ee,
+0xc0118348, 0x18477f4c, 0xbc40641a, 0x1b7f9fec,
+0x4ff97da0, 0x7383d775, 0x588d1b8c, 0x3ae7e8c3,
+0x5b03a6aa, 0x7dbf114b, 0x090d8e77, 0x54754b62,
+0x9dfcda47, 0x77936ddb, 0xe8209e88, 0xf2990ed8,
+0x7d8121aa, 0x2000004e, 0xb06421cb, 0x03c606ad,
+0x6c44dbcb, 0xbd0b1f60, 0x8b3f4a14, 0x90b644fc,
+0x45e40000, 0x1fff6874, 0x02fa17fe, 0xc5010135,
+0x1161dc05, 0xbeadde00, 0xe3ba97ef, 0x505d03c0,
+0x8401035e, 0x7fdd203c, 0x5850ffff, 0x696c4345,
+0x3a746e65, 0x68637241, 0x3a00303a, 0x49444e55,
+0xfb0b320a, 0x31026fff, 0x03010d37, 0x803c2b0c,
+0x84838281, 0x5f878685, 0xc07d8b00, 0x323e3603,
+0x02586b05, 0x110e067b, 0x56c8df6c, 0x73031365,
+0xc594585f, 0x47062bbe, 0xffe063db, 0x46a44fff,
+0x4c415441, 0x6f4e203a, 0x61657220, 0x6f6d2d6c,
+0x73206564, 0xdd2dd77f, 0xe76b6380, 0x03004121,
+0x002b564e, 0x676e6143, 0x6eee6cae, 0x2023746f,
+0x21241476, 0x6edfb7fd, 0x17725025, 0x6c6f636f,
+0x48444473, 0x54205043, 0x02fe5446, 0x1604adff,
+0x0063696e, 0x6b736964, 0x706f6c10, 0xba007970,
+0x153bdbed, 0x656e7265, 0x64646142, 0x39252a72,
+0xdefbad56, 0x64696fde, 0x6b6e0320, 0x51655b20,
+0xdb630d62, 0x2773b6d6, 0x31181b64, 0x330639a4,
+0xfb7fb5bb, 0x32380030, 0x6163af38, 0x6565006d,
+0x30126e70, 0x4264162d, 0x0d32ac26, 0x64263433,
+0x36352642, 0x6ed67237, 0x353863ce, 0x0e9f3236,
+0x84d84c61, 0x632c621d, 0x0aff640d, 0x006584ee,
+0x35381b0b, 0x2c6d7131, 0x07636bf6, 0x36bbf239,
+0x58780d35, 0x5db60d9b, 0x073d076d, 0x360d81b5,
+0x587a1732, 0x0cc25b4c, 0xb7350d97, 0x17451b0d,
+0x45f7f85e, 0x524f5250, 0x75736e55, 0x74726f68,
+0x6d41203e, 0x508b7b61, 0x632522a1, 0x57492201,
+0x42db0a2c, 0x20676ee1, 0x0c78d764, 0xf85b613c,
+0x3e21eb7f, 0x74667408, 0x2f3a0070, 0x6f4c002f,
+0x00206990, 0x25bb2f7a, 0x400b2073, 0x15800e3a,
+0x422d5c28, 0x23f1986f, 0xb7b435b6, 0x697372e0,
+0x4473c050, 0x17ed0864, 0xd065d46e, 0x7aba6c69,
+0x6d203e20, 0x6e12dbd0, 0x280f076b, 0x002e9637,
+0x85856b20, 0x72671b1f, 0x40d220b6, 0xadf77b38,
+0x204d3450, 0x22676962, 0x2949424e, 0x35ad1c05,
+0x17054647, 0x8fbb1024, 0x61013ed1, 0x6d69125e,
+0x3c586761, 0x5cdee873, 0x7baceb2b, 0x435f7469,
+0xfedb5d70, 0x2008a7c5, 0xd1756f66, 0x530f1a2e,
+0x6b99b7bb, 0x10119541, 0x9c654d0a, 0xf75c0040,
+0x8d2c8c58, 0x2628200a, 0x0e122906, 0x9b3d83f6,
+0x6c65521d, 0x470b7961, 0xd7851d61, 0x0d773416,
+0x6583450c, 0x70d75ecd, 0x20f497a9, 0xadb165db,
+0x1b09edb9, 0xa025966d, 0xb47caf73, 0xf3976b5b,
+0x8e726135, 0x2ec565b9, 0xfcd270c4, 0x3d6e7716,
+0x2ed6b7ba, 0x16706d15, 0x7562615b, 0x6c733874,
+0x90152b6d, 0x06740e29, 0xcc226b2d, 0x7a462e1a,
+0x3364a265, 0xdb6b0705, 0x283380d6, 0x1f2a2925,
+0x67495200, 0x4346d68d, 0x001e147f, 0xd22143d1,
+0x5049902f, 0xc3887a4a, 0x0a5be193, 0x69656306,
+0x6299f976, 0xee876bb4, 0x756e8c06, 0xb564733a,
+0x6b7609b2, 0x445576ad, 0x58270630, 0x044f6d75,
+0x0a748a7b, 0x7f64f7a0, 0x2fc7056b, 0x78302007,
+0x54286c25, 0x98682dd6, 0x66f443f0, 0xd190726f,
+0x6585dc0a, 0x311122c9, 0x34f06e6b, 0xf5dd286c,
+0x39f27665, 0x4a237079, 0x2b6dbdad, 0x7927588b,
+0x5f895227, 0xec7876ad, 0x6c20666f, 0x4e6c7275,
+0x5ae70e14, 0x44197361, 0xb9c33f6e, 0xb1dcc6c4,
+0x5a622c0e, 0x5bb36173, 0x2790c65b, 0x175d07db,
+0xf7696370, 0xd2a50bfd, 0x1929e232, 0x43424139,
+0x3d464544, 0xe6d6facc, 0x6868032e, 0x01673a58,
+0xe3e37500, 0x395f2fd1, 0x4f6f205b, 0x0a187753,
+0x7ea431ae, 0x2e352781, 0x52bd9734, 0xca6f2ea5,
+0xd2203418, 0x166217c6, 0x4c504784, 0x23746829,
+0xa6b0e146, 0x2e1c6522, 0xa078bb09, 0xad44de95,
+0x20805403, 0x50ee1d1c, 0xd00d0785, 0x9f60f720,
+0x007f116e, 0x73887845, 0xd6db0e3a, 0x6d27b6de,
+0x775f6ffc, 0x57287a3a, 0x186b6d74, 0xaea93c0a,
+0x2110776d, 0x688fdbd8, 0xd93d20f3, 0x270a2e58,
+0x12051a90, 0x588d26d9, 0x1835b6c6, 0xac32da3a,
+0x8e611e78, 0x0dd1d1d0, 0xcb69306d, 0x3063946c,
+0x8bb747b4, 0x532ce870, 0xdd26f549, 0x3a9de592,
+0x6a6e4998, 0xb18cbc2d, 0x25184d3e, 0x0a2c4423,
+0x0e9815ad, 0x7839f9e1, 0xdc75cd6b, 0x0465625c,
+0x350e5365, 0x6105ed12, 0x7369bdc3, 0x0ae257f1,
+0x5c1b02ed, 0x30344338, 0xeb6cfd33, 0x2b76152d,
+0x2c8e3c63, 0xd6b46843, 0x31676431, 0x58bd4a8f,
+0x5cb854e1, 0x377ac7ab, 0x21b1d7b5, 0x7974ab67,
+0x746763ca, 0xd4b70c68, 0x44320b66, 0x6b8d0a63,
+0x3852b46b, 0x70d791ee, 0xe0706051, 0x4e5e7206,
+0x422c9402, 0x86ffcbc3, 0xd2303bc5, 0x213fd6ce,
+0x1075803d, 0x6b0c6d19, 0x5f733009, 0x0a061a6c,
+0x6d04edce, 0x25809aba, 0xd558b5a1, 0x06b11dee,
+0x33f3a3d9, 0x6d612c92, 0x30932e61, 0xc261562f,
+0xa9651856, 0xd7073c20, 0x34fd23c0, 0x041fd76f,
+0xe26bc781, 0x462f4538, 0xfb32d133, 0x702e8f05,
+0xb61b630b, 0x6b0e6230, 0xf1621f0a, 0x6d0bb165,
+0xc707fd48, 0xde696e67, 0x96582946, 0x3e777d3e,
+0x96c01621, 0x222f3273, 0x8a75eec7, 0xe96c6975,
+0xc2b86ade, 0x64b18709, 0xe57652b7, 0x33a63a5f,
+0xac78dc14, 0x78c53772, 0xc3b27590, 0x0cbe2978,
+0x0f29000a, 0x73c09c0e, 0x037c288c, 0x0cdac536,
+0x326e2007, 0x3e7978c7, 0x222c5bdc, 0x65757186,
+0x084008d1, 0x24f0cdb1, 0x73638a2b, 0xb92c1879,
+0x646d27a6, 0x2d4620fc, 0x00c5bdb6, 0x545245a1,
+0x8fdc6783, 0x844345c2, 0x70d65861, 0x8705c782,
+0x512d52eb, 0x75672620, 0xb0df70a6, 0x87367942,
+0x0d074fd0, 0x83ba1ee7, 0x8a767077, 0xb62549a4,
+0x4674b40b, 0x19666692, 0x63ac2b21, 0x791113b9,
+0xe1000058, 0x9e058668, 0x974f4f42, 0x3a33002d,
+0xf13c1883, 0x6e00f600, 0xf3ea6bb8, 0x816c7e68,
+0xcb623436, 0x82524142, 0x19df7b9b, 0x3a783830,
+0x6f132004, 0xa602c273, 0x2184d057, 0x6c3564d2,
+0xe1833867, 0x0aba8170, 0x7dce2300, 0x23d62119,
+0x28003f58, 0x6a5d6181, 0x3a5225f9, 0x73c11bc0,
+0xc1796141, 0x1b050f80, 0xdd578af6, 0x2e8b3210,
+0x5efa7bd6, 0x1a7555fe, 0x016b58ae, 0x17cf6e61,
+0xa71d1c06, 0x6db37561, 0xcd6e860c, 0x400312d0,
+0x6fff26c7, 0x85b5c32e, 0x0a7529dd, 0xa9b84647,
+0x8305c60b, 0x6867ed46, 0xb4223cb8, 0x76b746c3,
+0xc83d602e, 0x00dabb75, 0x1f1d278f, 0x51079d08,
+0xbfc0142d, 0xd9c84070, 0x1ff17ab1, 0x9307cf9f,
+0x360d95b0, 0x1f93179b, 0xb6016e00, 0x27021009,
+0xb2032bc0, 0x30d81760, 0x03082292, 0xfd468d00,
+0x8024168e, 0xfb9f9e32, 0x60f6f04b, 0xb648f200,
+0xba3f80f2, 0x10298086, 0x91079266, 0x30f91e47,
+0x10316d10, 0x7d103274, 0xe4791e47, 0x348b1033,
+0x10359910, 0x1e1036a7, 0xb591e479, 0x38c31037,
+0x1039d110, 0x91e479d8, 0xe0103a47, 0x3ce7103b,
+0xcfc8f010, 0x103d1e47, 0x0c103efe, 0x1a105193,
+0xf23c8f23, 0x09201059, 0x12272812, 0x3d9e2830,
+0x3612c8f2, 0x493c1229, 0x242f4524, 0x91ec1b4d,
+0x245d07c7, 0x5d105055, 0x1007654f, 0xfa14b63e,
+0x52010773, 0x40179381, 0x01ae1284, 0x14b50537,
+0x41be43d5, 0x2a1a0240, 0x037ef8b7, 0x664693f1,
+0xb0daadba, 0xbf0fce03, 0x4ffd9609, 0x803f0405,
+0x63538263, 0x51800b96, 0x05afd8f6, 0x0302b16b,
+0x9615ec87, 0xb8006dc2, 0x86550344, 0x2200b7aa,
+0xdb2bec0a, 0x2bbfd23f, 0x7f4507d0, 0x9d957842,
+0xc0375e54, 0x00006d05, 0x2000c000, 0xffff0001,
+0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
diff --git a/tools/firmware/etherboot/make-eb-rom-list b/tools/firmware/etherboot/make-eb-rom-list
deleted file mode 100755
index 276affc554..0000000000
--- a/tools/firmware/etherboot/make-eb-rom-list
+++ /dev/null
@@ -1,11 +0,0 @@
-#!/bin/bash
-set -e
-roms=$1; shift
-echo "/* autogenerated - do not edit */"
-echo "#define ETHERBOOT_ROM_LIST \\"
-for nic in "$@"; do
- makerom=`grep "^MAKEROM_ID_$nic *= *-p *" <$roms`
- echo " ETHERBOOT_ROM($nic,${makerom#*-p}) \\"
-done
-echo
-echo "/*end.*/"
diff --git a/tools/firmware/extboot/Makefile b/tools/firmware/extboot/Makefile
index fa2b0de17b..eec5831c3a 100644
--- a/tools/firmware/extboot/Makefile
+++ b/tools/firmware/extboot/Makefile
@@ -1,15 +1,7 @@
-
-override XEN_TARGET_ARCH = x86_32
XEN_ROOT = ../../..
-CFLAGS := -I$(XEN_ROOT)/tools/libxc -I.
-include $(XEN_ROOT)/tools/Rules.mk
-
-# Disable PIE/SSP if GCC supports them. They can break us.
-CFLAGS += $(call cc-option,$(CC),-nopie,)
-CFLAGS += $(call cc-option,$(CC),-fno-stack-protector,)
-CFLAGS += $(call cc-option,$(CC),-fno-stack-protector-all,)
+include $(XEN_ROOT)/tools/firmware/Rules.mk
-CFLAGS += -fno-builtin -O2 -msoft-float
+CFLAGS += -I$(XEN_ROOT)/tools/libxc -I.
.PHONY: all
all: extboot.bin
diff --git a/tools/firmware/hvmloader/Makefile b/tools/firmware/hvmloader/Makefile
index eca4c7cbdf..ae1fdc869d 100644
--- a/tools/firmware/hvmloader/Makefile
+++ b/tools/firmware/hvmloader/Makefile
@@ -18,33 +18,26 @@
# Place - Suite 330, Boston, MA 02111-1307 USA.
#
-override XEN_TARGET_ARCH = x86_32
XEN_ROOT = ../../..
-CFLAGS :=
-include $(XEN_ROOT)/tools/Rules.mk
+include $(XEN_ROOT)/tools/firmware/Rules.mk
SUBDIRS := acpi
# The HVM loader is started in 32-bit mode at the address below:
LOADADDR = 0x100000
-# Disable PIE/SSP if GCC supports them. They can break us.
-CFLAGS += $(call cc-option,$(CC),-nopie,)
-CFLAGS += $(call cc-option,$(CC),-fno-stack-protector,)
-CFLAGS += $(call cc-option,$(CC),-fno-stack-protector-all,)
+CFLAGS += $(CFLAGS_include) -I.
-CFLAGS += -fno-builtin -O2 -msoft-float
-CFLAGS += $(CFLAGS_include) -I.
-
-SRCS = hvmloader.c mp_tables.c util.c smbios.c 32bitbios_support.c
+SRCS = hvmloader.c mp_tables.c util.c smbios.c 32bitbios_support.c smp.c
OBJS = $(patsubst %.c,%.o,$(SRCS))
.PHONY: all
all: hvmloader
+hvmloader.o: roms.h
smbios.o: CFLAGS += -D__SMBIOS_DATE__="\"$(shell date +%m/%d/%Y)\""
-hvmloader: roms.h subdirs-all $(OBJS)
+hvmloader: subdirs-all $(OBJS)
$(LD) $(LDFLAGS_DIRECT) -N -Ttext $(LOADADDR) \
-o hvmloader.tmp $(OBJS) acpi/acpi.a
$(OBJCOPY) hvmloader.tmp hvmloader
diff --git a/tools/firmware/hvmloader/acpi/Makefile b/tools/firmware/hvmloader/acpi/Makefile
index 79a49541ce..8ef4d58a7a 100644
--- a/tools/firmware/hvmloader/acpi/Makefile
+++ b/tools/firmware/hvmloader/acpi/Makefile
@@ -15,10 +15,8 @@
# Place - Suite 330, Boston, MA 02111-1307 USA.
#
-override XEN_TARGET_ARCH = x86_32
XEN_ROOT = ../../../..
-CFLAGS :=
-include $(XEN_ROOT)/tools/Rules.mk
+include $(XEN_ROOT)/tools/firmware/Rules.mk
C_SRC = build.c dsdt.c static_tables.c
H_SRC = $(wildcard *.h)
@@ -27,13 +25,7 @@ OBJS = $(patsubst %.c,%.o,$(C_SRC))
IASL_VER = acpica-unix-20060707
IASL_URL = http://developer.intel.com/technology/iapc/acpi/downloads/$(IASL_VER).tar.gz
-# Disable PIE/SSP if GCC supports them. They can break us.
-CFLAGS += $(call cc-option,$(CC),-nopie,)
-CFLAGS += $(call cc-option,$(CC),-fno-stack-protector,)
-CFLAGS += $(call cc-option,$(CC),-fno-stack-protector-all,)
-
-CFLAGS += -fno-builtin -O2 -msoft-float
-CFLAGS += -I. -I.. $(CFLAGS_include)
+CFLAGS += -I. -I.. $(CFLAGS_include)
vpath iasl $(PATH)
all: acpi.a
diff --git a/tools/firmware/hvmloader/hvmloader.c b/tools/firmware/hvmloader/hvmloader.c
index 8bbcf6d6d0..3bad1120ba 100644
--- a/tools/firmware/hvmloader/hvmloader.c
+++ b/tools/firmware/hvmloader/hvmloader.c
@@ -28,10 +28,11 @@
#include "apic_regs.h"
#include "pci_regs.h"
#include "e820.h"
+#include "option_rom.h"
#include <xen/version.h>
#include <xen/hvm/params.h>
-asm(
+asm (
" .text \n"
" .globl _start \n"
"_start: \n"
@@ -97,6 +98,7 @@ asm(
"stack_top: \n"
);
+void smp_initialise(void);
void create_mp_tables(void);
int hvm_write_smbios_tables(void);
@@ -108,14 +110,6 @@ cirrus_check(void)
}
static void
-wrmsr(uint32_t idx, uint64_t v)
-{
- __asm__ __volatile__ (
- "wrmsr"
- : : "c" (idx), "a" ((uint32_t)v), "d" ((uint32_t)(v>>32)) );
-}
-
-static void
init_hypercalls(void)
{
uint32_t eax, ebx, ecx, edx;
@@ -130,11 +124,7 @@ init_hypercalls(void)
*(uint32_t *)(signature + 8) = edx;
signature[12] = '\0';
- if ( strcmp("XenVMMXenVMM", signature) || (eax < 0x40000002) )
- {
- printf("FATAL: Xen hypervisor not detected\n");
- __asm__ __volatile__( "ud2" );
- }
+ BUG_ON(strcmp("XenVMMXenVMM", signature) || (eax < 0x40000002));
/* Fill in hypercall transfer pages. */
cpuid(0x40000002, &eax, &ebx, &ecx, &edx);
@@ -334,21 +324,13 @@ static int must_load_extboot(void)
*/
static int scan_etherboot_nic(void *copy_rom_dest)
{
- static struct etherboots_table_entry {
- char *name;
- void *etherboot_rom;
- int etherboot_sz;
- uint16_t vendor, device;
- } etherboots_table[] = {
-#define ETHERBOOT_ROM(name, vendor, device) \
- { #name, etherboot_##name, sizeof(etherboot_##name), vendor, device },
- ETHERBOOT_ROM_LIST
- { 0 }
- };
-
+ struct option_rom_header *rom;
+ struct option_rom_pnp_header *pnph;
+ struct option_rom_pci_header *pcih;
uint32_t devfn;
uint16_t class, vendor_id, device_id;
- struct etherboots_table_entry *eb;
+ uint8_t csum;
+ int i;
for ( devfn = 0; devfn < 128; devfn++ )
{
@@ -359,21 +341,62 @@ static int scan_etherboot_nic(void *copy_rom_dest)
if ( (vendor_id == 0xffff) && (device_id == 0xffff) )
continue;
- if ( class != 0x0200 ) /* Not a NIC */
+ /* We're only interested in NICs. */
+ if ( class != 0x0200 )
continue;
- for ( eb = etherboots_table; eb->name; eb++ )
- if (eb->vendor == vendor_id &&
- eb->device == device_id)
+ rom = (struct option_rom_header *)etherboot;
+ for ( ; ; )
+ {
+ /* Invalid signature means we're out of option ROMs. */
+ if ( strncmp((char *)rom->signature, "\x55\xaa", 2) ||
+ (rom->rom_size == 0) )
+ break;
+
+ /* Invalid checksum means we're out of option ROMs. */
+ csum = 0;
+ for ( i = 0; i < (rom->rom_size * 512); i++ )
+ csum += ((uint8_t *)rom)[i];
+ if ( csum != 0 )
+ break;
+
+ /* Check the PCI PnP header (if any) for a match. */
+ pcih = (struct option_rom_pci_header *)
+ ((char *)rom + rom->pci_header_offset);
+ if ( (rom->pci_header_offset != 0) &&
+ !strncmp((char *)pcih->signature, "PCIR", 4) &&
+ (pcih->vendor_id == vendor_id) &&
+ (pcih->device_id == device_id) )
goto found;
+
+ rom = (struct option_rom_header *)
+ ((char *)rom + rom->rom_size * 512);
+ }
}
return 0;
found:
- printf("Loading %s Etherboot PXE ROM ...\n", eb->name);
- memcpy(copy_rom_dest, eb->etherboot_rom, eb->etherboot_sz);
- return eb->etherboot_sz;
+ /* Find the PnP expansion header (if any). */
+ pnph = ((rom->expansion_header_offset != 0)
+ ? ((struct option_rom_pnp_header *)
+ ((char *)rom + rom->expansion_header_offset))
+ : ((struct option_rom_pnp_header *)NULL));
+ while ( (pnph != NULL) && strncmp((char *)pnph->signature, "$PnP", 4) )
+ pnph = ((pnph->next_header_offset != 0)
+ ? ((struct option_rom_pnp_header *)
+ ((char *)rom + pnph->next_header_offset))
+ : ((struct option_rom_pnp_header *)NULL));
+
+ printf("Loading PXE ROM ...\n");
+ if ( (pnph != NULL) && (pnph->manufacturer_name_offset != 0) )
+ printf(" - Manufacturer: %s\n",
+ (char *)rom + pnph->manufacturer_name_offset);
+ if ( (pnph != NULL) && (pnph->product_name_offset != 0) )
+ printf(" - Product name: %s\n",
+ (char *)rom + pnph->product_name_offset);
+ memcpy(copy_rom_dest, rom, rom->rom_size * 512);
+ return rom->rom_size * 512;
}
/* Replace possibly erroneous memory-size CMOS fields with correct values. */
@@ -422,6 +445,8 @@ int main(void)
printf("CPU speed is %u MHz\n", get_cpu_mhz());
+ smp_initialise();
+
printf("Writing SMBIOS tables ...\n");
smbios_sz = hvm_write_smbios_tables();
diff --git a/tools/firmware/hvmloader/option_rom.h b/tools/firmware/hvmloader/option_rom.h
new file mode 100644
index 0000000000..a56030ba06
--- /dev/null
+++ b/tools/firmware/hvmloader/option_rom.h
@@ -0,0 +1,50 @@
+#ifndef __HVMLOADER_OPTION_ROM_H__
+#define __HVMLOADER_OPTION_ROM_H__
+
+#include <stdint.h>
+
+struct option_rom_header {
+ uint8_t signature[2]; /* "\x55\xaa" */
+ uint8_t rom_size; /* 512-byte increments */
+ uint32_t entry_point;
+ uint8_t reserved[17];
+ uint16_t pci_header_offset;
+ uint16_t expansion_header_offset;
+} __attribute__ ((packed));
+
+struct option_rom_pnp_header {
+ uint8_t signature[4]; /* "$PnP" */
+ uint8_t structure_revision;
+ uint8_t structure_length; /* 16-byte increments */
+ uint16_t next_header_offset;
+ uint8_t reserved;
+ uint8_t checksum;
+ uint32_t device_id;
+ uint16_t manufacturer_name_offset;
+ uint16_t product_name_offset;
+ uint8_t device_type_code[3];
+ uint8_t device_indicators;
+ uint16_t boot_connection_vector;
+ uint16_t disconnect_vector;
+ uint16_t bootstap_entry_vector;
+ uint16_t reserved2;
+ uint16_t static_resource_information_vector;
+} __attribute__ ((packed));
+
+
+struct option_rom_pci_header {
+ uint8_t signature[4]; /* "PCIR" */
+ uint16_t vendor_id;
+ uint16_t device_id;
+ uint16_t vital_product_data_offset;
+ uint16_t structure_length;
+ uint8_t structure_revision;
+ uint8_t class_code[3];
+ uint16_t image_length;
+ uint16_t image_revision;
+ uint8_t code_type;
+ uint8_t indicator;
+ uint16_t reserved;
+} __attribute__ ((packed));
+
+#endif /* __HVMLOADER_OPTION_ROM_H__ */
diff --git a/tools/firmware/hvmloader/smp.c b/tools/firmware/hvmloader/smp.c
new file mode 100644
index 0000000000..85f2a99103
--- /dev/null
+++ b/tools/firmware/hvmloader/smp.c
@@ -0,0 +1,132 @@
+/*
+ * smp.c: Secondary processor bringup and initialisation.
+ *
+ * Copyright (c) 2008, Citrix Systems, Inc.
+ *
+ * Authors:
+ * Keir Fraser <keir.fraser@citrix.com>
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along with
+ * this program; if not, write to the Free Software Foundation, Inc., 59 Temple
+ * Place - Suite 330, Boston, MA 02111-1307 USA.
+ */
+
+#include "util.h"
+#include "config.h"
+#include "apic_regs.h"
+
+#define AP_BOOT_EIP 0x1000
+extern char ap_boot_start[], ap_boot_end[];
+
+static int ap_callin, ap_cpuid;
+
+asm (
+ " .text \n"
+ " .code16 \n"
+ "ap_boot_start: .code16 \n"
+ " mov %cs,%ax \n"
+ " mov %ax,%ds \n"
+ " lgdt gdt_desr-ap_boot_start\n"
+ " xor %ax, %ax \n"
+ " inc %ax \n"
+ " lmsw %ax \n"
+ " ljmpl $0x08,$1f \n"
+ "gdt_desr: \n"
+ " .word gdt_end - gdt - 1 \n"
+ " .long gdt \n"
+ "ap_boot_end: .code32 \n"
+ "1: mov $0x10,%eax \n"
+ " mov %eax,%ds \n"
+ " mov %eax,%es \n"
+ " mov %eax,%ss \n"
+ " movl $stack_top,%esp \n"
+ " movl %esp,%ebp \n"
+ " call ap_start \n"
+ "1: hlt \n"
+ " jmp 1b \n"
+ " \n"
+ " .align 8 \n"
+ "gdt: \n"
+ " .quad 0x0000000000000000 \n"
+ " .quad 0x00cf9a000000ffff \n" /* 0x08: Flat code segment */
+ " .quad 0x00cf92000000ffff \n" /* 0x10: Flat data segment */
+ "gdt_end: \n"
+ " \n"
+ " .bss \n"
+ " .align 8 \n"
+ "stack: \n"
+ " .skip 0x4000 \n"
+ "stack_top: \n"
+ );
+
+/*static*/ void ap_start(void)
+{
+ printf(" - CPU%d ... ", ap_cpuid);
+
+ printf("done.\n");
+ wmb();
+ ap_callin = 1;
+}
+
+static void lapic_wait_ready(void)
+{
+ while ( lapic_read(APIC_ICR) & APIC_ICR_BUSY )
+ cpu_relax();
+}
+
+static void boot_cpu(unsigned int cpu)
+{
+ unsigned int icr2 = SET_APIC_DEST_FIELD(LAPIC_ID(cpu));
+
+ /* Initialise shared variables. */
+ ap_cpuid = cpu;
+ ap_callin = 0;
+ wmb();
+
+ /* Wake up the secondary processor: INIT-SIPI-SIPI... */
+ lapic_wait_ready();
+ lapic_write(APIC_ICR2, icr2);
+ lapic_write(APIC_ICR, APIC_DM_INIT);
+ lapic_wait_ready();
+ lapic_write(APIC_ICR2, icr2);
+ lapic_write(APIC_ICR, APIC_DM_STARTUP | (AP_BOOT_EIP >> 12));
+ lapic_wait_ready();
+ lapic_write(APIC_ICR2, icr2);
+ lapic_write(APIC_ICR, APIC_DM_STARTUP | (AP_BOOT_EIP >> 12));
+ lapic_wait_ready();
+
+ /*
+ * Wait for the secondary processor to complete initialisation.
+ * Do not touch shared resources meanwhile.
+ */
+ while ( !ap_callin )
+ cpu_relax();
+
+ /* Take the secondary processor offline. */
+ lapic_write(APIC_ICR2, icr2);
+ lapic_write(APIC_ICR, APIC_DM_INIT);
+ lapic_wait_ready();
+}
+
+void smp_initialise(void)
+{
+ unsigned int i, nr_cpus = get_vcpu_nr();
+
+ if ( nr_cpus <= 1 )
+ return;
+
+ memcpy((void *)AP_BOOT_EIP, ap_boot_start, ap_boot_end - ap_boot_start);
+
+ printf("Multiprocessor initialisation:\n");
+ for ( i = 1; i < nr_cpus; i++ )
+ boot_cpu(i);
+}
diff --git a/tools/firmware/hvmloader/util.c b/tools/firmware/hvmloader/util.c
index b57575fe9a..37f40ef2fa 100644
--- a/tools/firmware/hvmloader/util.c
+++ b/tools/firmware/hvmloader/util.c
@@ -27,39 +27,57 @@
#include <xen/memory.h>
#include <xen/hvm/hvm_info_table.h>
+void wrmsr(uint32_t idx, uint64_t v)
+{
+ asm volatile (
+ "wrmsr"
+ : : "c" (idx), "a" ((uint32_t)v), "d" ((uint32_t)(v>>32)) );
+}
+
+uint64_t rdmsr(uint32_t idx)
+{
+ uint32_t lo, hi;
+
+ asm volatile (
+ "rdmsr"
+ : "=a" (lo), "=d" (hi) : "c" (idx) );
+
+ return (lo | ((uint64_t)hi << 32));
+}
+
void outb(uint16_t addr, uint8_t val)
{
- __asm__ __volatile__ ( "outb %%al, %%dx" : : "d" (addr), "a" (val) );
+ asm volatile ( "outb %%al, %%dx" : : "d" (addr), "a" (val) );
}
void outw(uint16_t addr, uint16_t val)
{
- __asm__ __volatile__ ( "outw %%ax, %%dx" : : "d" (addr), "a" (val) );
+ asm volatile ( "outw %%ax, %%dx" : : "d" (addr), "a" (val) );
}
void outl(uint16_t addr, uint32_t val)
{
- __asm__ __volatile__ ( "outl %%eax, %%dx" : : "d" (addr), "a" (val) );
+ asm volatile ( "outl %%eax, %%dx" : : "d" (addr), "a" (val) );
}
uint8_t inb(uint16_t addr)
{
uint8_t val;
- __asm__ __volatile__ ( "inb %%dx,%%al" : "=a" (val) : "d" (addr) );
+ asm volatile ( "inb %%dx,%%al" : "=a" (val) : "d" (addr) );
return val;
}
uint16_t inw(uint16_t addr)
{
uint16_t val;
- __asm__ __volatile__ ( "inw %%dx,%%ax" : "=a" (val) : "d" (addr) );
+ asm volatile ( "inw %%dx,%%ax" : "=a" (val) : "d" (addr) );
return val;
}
uint32_t inl(uint16_t addr)
{
uint32_t val;
- __asm__ __volatile__ ( "inl %%dx,%%eax" : "=a" (val) : "d" (addr) );
+ asm volatile ( "inl %%dx,%%eax" : "=a" (val) : "d" (addr) );
return val;
}
@@ -118,7 +136,7 @@ void *memcpy(void *dest, const void *src, unsigned n)
{
int t0, t1, t2;
- __asm__ __volatile__ (
+ asm volatile (
"cld\n"
"rep; movsl\n"
"testb $2,%b4\n"
@@ -219,7 +237,7 @@ memcmp(const void *s1, const void *s2, unsigned n)
void
cpuid(uint32_t idx, uint32_t *eax, uint32_t *ebx, uint32_t *ecx, uint32_t *edx)
{
- __asm__ __volatile__ (
+ asm volatile (
"cpuid"
: "=a" (*eax), "=b" (*ebx), "=c" (*ecx), "=d" (*edx)
: "0" (idx) );
@@ -516,14 +534,14 @@ void __assert_failed(char *assertion, char *file, int line)
printf("HVMLoader assertion '%s' failed at %s:%d\n",
assertion, file, line);
for ( ; ; )
- __asm__ __volatile__ ( "ud2" );
+ asm volatile ( "ud2" );
}
void __bug(char *file, int line)
{
printf("HVMLoader bug at %s:%d\n", file, line);
for ( ; ; )
- __asm__ __volatile__ ( "ud2" );
+ asm volatile ( "ud2" );
}
static int validate_hvm_info(struct hvm_info_table *t)
diff --git a/tools/firmware/hvmloader/util.h b/tools/firmware/hvmloader/util.h
index ac06983d9b..1d310c64e4 100644
--- a/tools/firmware/hvmloader/util.h
+++ b/tools/firmware/hvmloader/util.h
@@ -19,6 +19,10 @@ void __bug(char *file, int line) __attribute__((noreturn));
#define BUG_ON(p) do { if (p) BUG(); } while (0)
#define BUILD_BUG_ON(p) ((void)sizeof(char[1 - 2 * !!(p)]))
+/* MSR access */
+void wrmsr(uint32_t idx, uint64_t v);
+uint64_t rdmsr(uint32_t idx);
+
/* I/O output */
void outb(uint16_t addr, uint8_t val);
void outw(uint16_t addr, uint16_t val);
@@ -74,6 +78,7 @@ static inline void cpu_relax(void)
#define barrier() asm volatile ( "" : : : "memory" )
#define rmb() barrier()
#define wmb() barrier()
+#define mb() asm volatile ( "lock; addl $0,0(%%esp)" : : : "memory" )
/*
* Divide a 64-bit dividend by a 32-bit divisor.
diff --git a/tools/firmware/rombios/32bit/Makefile b/tools/firmware/rombios/32bit/Makefile
index 90d86db0a9..f42d7f39b5 100644
--- a/tools/firmware/rombios/32bit/Makefile
+++ b/tools/firmware/rombios/32bit/Makefile
@@ -1,16 +1,10 @@
-
-override XEN_TARGET_ARCH = x86_32
XEN_ROOT = ../../../..
-CFLAGS :=
-include $(XEN_ROOT)/tools/Rules.mk
+include $(XEN_ROOT)/tools/firmware/Rules.mk
SOURCES = util.c
TARGET = 32bitbios_flat.h
-CFLAGS += -fno-builtin -O2 -msoft-float -nostdlib
CFLAGS += -I../ -DGCC_PROTOS
-CFLAGS += $(call cc-option,$(CC),-fno-stack-protector,)
-CFLAGS += $(call cc-option,$(CC),-fno-stack-protector-all,)
SUBDIRS = tcgbios
diff --git a/tools/firmware/rombios/32bit/tcgbios/Makefile b/tools/firmware/rombios/32bit/tcgbios/Makefile
index 9d0aa5ed0c..e272f288f6 100644
--- a/tools/firmware/rombios/32bit/tcgbios/Makefile
+++ b/tools/firmware/rombios/32bit/tcgbios/Makefile
@@ -1,16 +1,10 @@
-
-override XEN_TARGET_ARCH = x86_32
XEN_ROOT = ../../../../..
-CFLAGS :=
-include $(XEN_ROOT)/tools/Rules.mk
+include $(XEN_ROOT)/tools/firmware/Rules.mk
TARGET = tcgbiosext.o
FILES = tcgbios tpm_drivers
OBJECTS = $(foreach f,$(FILES),$(f).o)
-CFLAGS += -fno-builtin -O2 -msoft-float -nostdlib
-CFLAGS += $(call cc-option,$(CC),-fno-stack-protector,)
-CFLAGS += $(call cc-option,$(CC),-fno-stack-protector-all,)
CFLAGS += -I../ -I../../ -DGCC_PROTOS
.PHONY: all clean
diff --git a/tools/firmware/rombios/32bit/tcgbios/tcgbios.c b/tools/firmware/rombios/32bit/tcgbios/tcgbios.c
index 00f929f6c5..e36ca37845 100644
--- a/tools/firmware/rombios/32bit/tcgbios/tcgbios.c
+++ b/tools/firmware/rombios/32bit/tcgbios/tcgbios.c
@@ -923,7 +923,7 @@ uint32_t HashLogExtendEvent32(struct hleei_short *hleei_s, struct hleeo *hleeo,
struct hlei hlei ; /* HashLogEventInput block */
struct hleo hleo; /* HashLogEventOutput block */
struct hleei_long *hleei_l = (struct hleei_long *)hleei_s;
- int sh;
+ int sh = 0;
uint32_t logdataptr;
if (TCG_IsShutdownPreBootInterface() != 0) {
diff --git a/tools/ioemu/Makefile b/tools/ioemu/Makefile
index 76f6f9af99..053d214bd4 100644
--- a/tools/ioemu/Makefile
+++ b/tools/ioemu/Makefile
@@ -35,7 +35,7 @@ endif
endif
endif
-TOOLS=
+TOOLS=tapdisk-ioemu
all: $(TOOLS) $(DOCS) recurse-all
@@ -44,6 +44,13 @@ subdir-%:
recurse-all: $(patsubst %,subdir-%, $(TARGET_DIRS))
+tapdisk-ioemu: CPPFLAGS += -I$(XEN_ROOT)/tools/libxc
+tapdisk-ioemu: CPPFLAGS += -I$(XEN_ROOT)/tools/blktap/lib
+tapdisk-ioemu: CPPFLAGS += -I$(XEN_ROOT)/tools/xenstore
+tapdisk-ioemu: CPPFLAGS += -I$(XEN_ROOT)/tools/include
+tapdisk-ioemu: tapdisk-ioemu.c cutils.c block.c block-raw.c block-cow.c block-qcow.c aes.c block-vmdk.c block-cloop.c block-dmg.c block-bochs.c block-vpc.c block-vvfat.c block-qcow2.c hw/xen_blktap.c osdep.c
+ $(CC) -DQEMU_TOOL $(CFLAGS) $(CPPFLAGS) $(BASE_CFLAGS) $(LDFLAGS) $(BASE_LDFLAGS) -o $@ $^ -lz $(LIBS)
+
qemu-img$(EXESUF): qemu-img.c cutils.c block.c block-raw.c block-cow.c block-qcow.c aes.c block-vmdk.c block-cloop.c block-dmg.c block-bochs.c block-vpc.c block-vvfat.c block-qcow2.c
$(CC) -DQEMU_TOOL $(CFLAGS) $(CPPFLAGS) $(BASE_CFLAGS) $(LDFLAGS) $(BASE_LDFLAGS) -o $@ $^ -lz $(LIBS)
@@ -80,7 +87,7 @@ endif
install: all $(if $(BUILD_DOCS),install-doc)
mkdir -p "$(DESTDIR)$(bindir)"
-# $(INSTALL) -m 755 -s $(TOOLS) "$(DESTDIR)$(bindir)"
+ $(INSTALL) -m 755 -s $(TOOLS) "$(DESTDIR)$(prefix)/sbin"
# mkdir -p "$(DESTDIR)$(datadir)"
# for x in bios.bin vgabios.bin vgabios-cirrus.bin ppc_rom.bin \
# video.x openbios-sparc32 linux_boot.bin pxe-ne2k_pci.bin \
diff --git a/tools/ioemu/block-cow.c b/tools/ioemu/block-cow.c
index 07c8a7bf16..eeee9a1cc4 100644
--- a/tools/ioemu/block-cow.c
+++ b/tools/ioemu/block-cow.c
@@ -246,10 +246,11 @@ static int cow_create(const char *filename, int64_t image_sectors,
return 0;
}
-static void cow_flush(BlockDriverState *bs)
+static int cow_flush(BlockDriverState *bs)
{
BDRVCowState *s = bs->opaque;
fsync(s->fd);
+ return 0;
}
BlockDriver bdrv_cow = {
diff --git a/tools/ioemu/block-vbd.c b/tools/ioemu/block-vbd.c
index 53c62484a5..a3465b748a 100644
--- a/tools/ioemu/block-vbd.c
+++ b/tools/ioemu/block-vbd.c
@@ -49,11 +49,7 @@
typedef struct BDRVVbdState {
struct blkfront_dev *dev;
int fd;
- int type;
- int mode;
- int info;
- uint64_t sectors;
- unsigned sector_size;
+ struct blkfront_info info;
QEMU_LIST_ENTRY(BDRVVbdState) list;
} BDRVVbdState;
@@ -81,13 +77,13 @@ static int vbd_open(BlockDriverState *bs, const char *filename, int flags)
//handy to test posix access
//return -EIO;
- s->dev = init_blkfront((char *) filename, &s->sectors, &s->sector_size, &s->mode, &s->info);
+ s->dev = init_blkfront((char *) filename, &s->info);
if (!s->dev)
return -EIO;
- if (SECTOR_SIZE % s->sector_size) {
- printf("sector size is %d, we only support sector sizes that divide %d\n", s->sector_size, SECTOR_SIZE);
+ if (SECTOR_SIZE % s->info.sector_size) {
+ printf("sector size is %d, we only support sector sizes that divide %d\n", s->info.sector_size, SECTOR_SIZE);
return -EIO;
}
@@ -267,6 +263,32 @@ static void vbd_aio_cancel(BlockDriverAIOCB *blockacb)
// Try to cancel. If can't, wait for it, drop the callback and call qemu_aio_release(acb)
}
+static void vbd_nop_cb(void *opaque, int ret)
+{
+}
+
+static BlockDriverAIOCB *vbd_aio_flush(BlockDriverState *bs,
+ BlockDriverCompletionFunc *cb, void *opaque)
+{
+ BDRVVbdState *s = bs->opaque;
+ VbdAIOCB *acb = NULL;
+
+ if (s->info.barrier == 1) {
+ acb = vbd_aio_setup(bs, 0, NULL, 0,
+ s->info.flush == 1 ? vbd_nop_cb : cb, opaque);
+ if (!acb)
+ return NULL;
+ blkfront_aio_push_operation(&acb->aiocb, BLKIF_OP_WRITE_BARRIER);
+ }
+ if (s->info.flush == 1) {
+ acb = vbd_aio_setup(bs, 0, NULL, 0, cb, opaque);
+ if (!acb)
+ return NULL;
+ blkfront_aio_push_operation(&acb->aiocb, BLKIF_OP_FLUSH_DISKCACHE);
+ }
+ return &acb->common;
+}
+
static void vbd_close(BlockDriverState *bs)
{
BDRVVbdState *s = bs->opaque;
@@ -282,13 +304,14 @@ static void vbd_close(BlockDriverState *bs)
static int64_t vbd_getlength(BlockDriverState *bs)
{
BDRVVbdState *s = bs->opaque;
- return s->sectors * s->sector_size;
+ return s->info.sectors * s->info.sector_size;
}
-static void vbd_flush(BlockDriverState *bs)
+static int vbd_flush(BlockDriverState *bs)
{
BDRVVbdState *s = bs->opaque;
blkfront_sync(s->dev);
+ return 0;
}
/***********************************************/
@@ -333,6 +356,7 @@ BlockDriver bdrv_vbd = {
.bdrv_aio_read = vbd_aio_read,
.bdrv_aio_write = vbd_aio_write,
.bdrv_aio_cancel = vbd_aio_cancel,
+ .bdrv_aio_flush = vbd_aio_flush,
.aiocb_size = sizeof(VbdAIOCB),
.bdrv_read = vbd_read,
.bdrv_write = vbd_write,
diff --git a/tools/ioemu/block.c b/tools/ioemu/block.c
index 8a730bd754..16ddd1805b 100644
--- a/tools/ioemu/block.c
+++ b/tools/ioemu/block.c
@@ -347,8 +347,8 @@ int bdrv_open2(BlockDriverState *bs, const char *filename, int flags,
BlockDriver *drv)
{
int ret, open_flags;
- char tmp_filename[1024];
- char backing_filename[1024];
+ char tmp_filename[PATH_MAX];
+ char backing_filename[PATH_MAX];
bs->read_only = 0;
bs->is_temporary = 0;
diff --git a/tools/ioemu/hw/ide.c b/tools/ioemu/hw/ide.c
index cfe3e8a5b2..45136bbef3 100644
--- a/tools/ioemu/hw/ide.c
+++ b/tools/ioemu/hw/ide.c
@@ -655,12 +655,13 @@ static void ide_identify(IDEState *s)
put_le16(p + 68, 120);
put_le16(p + 80, 0xf0); /* ata3 -> ata6 supported */
put_le16(p + 81, 0x16); /* conforms to ata5 */
- put_le16(p + 82, (1 << 14));
+ /* 14=nop 5=write_cache */
+ put_le16(p + 82, (1 << 14) | (1 << 5));
/* 13=flush_cache_ext,12=flush_cache,10=lba48 */
put_le16(p + 83, (1 << 14) | (1 << 13) | (1 <<12) | (1 << 10));
put_le16(p + 84, (1 << 14));
/* 14=nop 5=write_cache */
- put_le16(p + 85, (1 << 14) | (1 << 5));
+ put_le16(p + 85, (1 << 14) | (s->write_cache << 5));
/* 13=flush_cache_ext,12=flush_cache,10=lba48 */
put_le16(p + 86, (1 << 14) | (1 << 13) | (1 <<12) | (1 << 10));
put_le16(p + 87, (1 << 14));
diff --git a/tools/ioemu/hw/rtl8139.c b/tools/ioemu/hw/rtl8139.c
index 42e25e8855..f0414edc91 100644
--- a/tools/ioemu/hw/rtl8139.c
+++ b/tools/ioemu/hw/rtl8139.c
@@ -1416,6 +1416,8 @@ static uint32_t rtl8139_ChipCmd_read(RTL8139State *s)
static void rtl8139_CpCmd_write(RTL8139State *s, uint32_t val)
{
+ int i;
+
val &= 0xffff;
DEBUG_PRINT(("RTL8139C+ command register write(w) val=0x%04x\n", val));
@@ -1423,6 +1425,20 @@ static void rtl8139_CpCmd_write(RTL8139State *s, uint32_t val)
/* mask unwriteable bits */
val = SET_MASKED(val, 0xff84, s->CpCmd);
+ if ( (s->CpCmd & CPlusTxEnb) &&
+ !(val & CPlusTxEnb) )
+ {
+ /* Reset TX status when the transmitter drops from C+ to
+ non-C+ mode. Windows has a habit of turning off C+ and
+ then waiting for the TX requests to clear as part of shut
+ down, and you get stuck forever if there are old DTCRs in
+ the registers. */
+ for (i = 0; i < 4; i++)
+ {
+ s->TxStatus[i] = TxHostOwns;
+ }
+ }
+
s->CpCmd = val;
}
@@ -1765,6 +1781,7 @@ static int rtl8139_transmit_one(RTL8139State *s, int descriptor)
{
DEBUG_PRINT(("RTL8139: +++ cannot transmit from descriptor %d: transmitter disabled\n",
descriptor));
+ s->TxStatus[descriptor] = TxAborted | TxHostOwns;
return 0;
}
@@ -1772,6 +1789,7 @@ static int rtl8139_transmit_one(RTL8139State *s, int descriptor)
{
DEBUG_PRINT(("RTL8139: +++ cannot transmit from descriptor %d: owned by host (%08x)\n",
descriptor, s->TxStatus[descriptor]));
+ s->TxStatus[descriptor] = TxAborted | TxHostOwns;
return 0;
}
diff --git a/tools/ioemu/hw/xen_machine_fv.c b/tools/ioemu/hw/xen_machine_fv.c
index 5fc9dda42f..448a8fecf6 100644
--- a/tools/ioemu/hw/xen_machine_fv.c
+++ b/tools/ioemu/hw/xen_machine_fv.c
@@ -205,6 +205,7 @@ static void xen_init_fv(uint64_t ram_size, int vga_ram_size, char *boot_device,
}
#endif
+ xc_set_hvm_param(xc_handle, domid, HVM_PARAM_DM_DOMAIN, DOMID_SELF);
xc_get_hvm_param(xc_handle, domid, HVM_PARAM_IOREQ_PFN, &ioreq_pfn);
fprintf(logfile, "shared page at pfn %lx\n", ioreq_pfn);
shared_page = xc_map_foreign_range(xc_handle, domid, XC_PAGE_SIZE,
diff --git a/tools/ioemu/osdep.c b/tools/ioemu/osdep.c
index a25d03fe58..e3a870154a 100644
--- a/tools/ioemu/osdep.c
+++ b/tools/ioemu/osdep.c
@@ -21,6 +21,8 @@
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
+
+#include "config-host.h"
#include <stdlib.h>
#include <stdio.h>
#include <stdarg.h>
@@ -32,7 +34,6 @@
#include <sys/statvfs.h>
#endif
-#include "cpu.h"
#if defined(USE_KQEMU)
#include "vl.h"
#endif
diff --git a/tools/ioemu/qemu-img.c b/tools/ioemu/qemu-img.c
index a25954649b..0fdd58a136 100644
--- a/tools/ioemu/qemu-img.c
+++ b/tools/ioemu/qemu-img.c
@@ -594,8 +594,8 @@ static int img_info(int argc, char **argv)
BlockDriverState *bs;
char fmt_name[128], size_buf[128], dsize_buf[128];
int64_t total_sectors, allocated_size;
- char backing_filename[1024];
- char backing_filename2[1024];
+ char backing_filename[PATH_MAX];
+ char backing_filename2[PATH_MAX];
BlockDriverInfo bdi;
fmt = NULL;
diff --git a/tools/ioemu/tapdisk-ioemu.c b/tools/ioemu/tapdisk-ioemu.c
new file mode 100644
index 0000000000..272b277abb
--- /dev/null
+++ b/tools/ioemu/tapdisk-ioemu.c
@@ -0,0 +1,142 @@
+#include <stdlib.h>
+#include <stdarg.h>
+#include <stdio.h>
+#include <string.h>
+#include <stdint.h>
+#include <signal.h>
+#include <sys/time.h>
+
+#include <assert.h>
+
+extern int init_blktap(void);
+extern void qemu_aio_init(void);
+extern void qemu_aio_poll(void);
+extern void bdrv_init(void);
+
+extern void *qemu_mallocz(size_t size);
+extern void qemu_free(void *ptr);
+
+int domid = 0;
+FILE* logfile;
+
+void term_printf(const char *fmt, ...)
+{
+ va_list ap;
+ va_start(ap, fmt);
+ vprintf(fmt, ap);
+ va_end(ap);
+}
+
+void term_print_filename(const char *filename)
+{
+ term_printf(filename);
+}
+
+
+typedef void IOReadHandler(void *opaque, const uint8_t *buf, int size);
+typedef int IOCanRWHandler(void *opaque);
+typedef void IOHandler(void *opaque);
+
+typedef struct IOHandlerRecord {
+ int fd;
+ IOCanRWHandler *fd_read_poll;
+ IOHandler *fd_read;
+ IOHandler *fd_write;
+ int deleted;
+ void *opaque;
+ /* temporary data */
+ struct pollfd *ufd;
+ struct IOHandlerRecord *next;
+} IOHandlerRecord;
+
+static IOHandlerRecord *first_io_handler;
+
+int qemu_set_fd_handler2(int fd,
+ IOCanRWHandler *fd_read_poll,
+ IOHandler *fd_read,
+ IOHandler *fd_write,
+ void *opaque)
+{
+ IOHandlerRecord *ioh;
+
+ /* This is a stripped down version of fd handling */
+ assert(fd_read_poll == NULL);
+ assert(fd_write == NULL);
+
+ for(ioh = first_io_handler; ioh != NULL; ioh = ioh->next)
+ if (ioh->fd == fd)
+ goto found;
+
+ if (!fd_read && !fd_write)
+ return 0;
+
+ ioh = qemu_mallocz(sizeof(IOHandlerRecord));
+ if (!ioh)
+ return -1;
+ ioh->next = first_io_handler;
+ first_io_handler = ioh;
+
+found:
+ if (!fd_read && !fd_write) {
+ ioh->deleted = 1;
+ } else {
+ ioh->fd = fd;
+ ioh->fd_read = fd_read;
+ ioh->opaque = opaque;
+ ioh->deleted = 0;
+ }
+
+ return 0;
+}
+
+int main(void)
+{
+ IOHandlerRecord *ioh, **pioh;
+ int max_fd;
+ fd_set rfds;
+ struct timeval tv;
+
+ logfile = stderr;
+
+ bdrv_init();
+ qemu_aio_init();
+ init_blktap();
+
+ /*
+ * Main loop: Pass events to the corrsponding handlers and check for
+ * completed aio operations.
+ */
+ while (1) {
+ qemu_aio_poll();
+
+ max_fd = -1;
+ FD_ZERO(&rfds);
+ for(ioh = first_io_handler; ioh != NULL; ioh = ioh->next)
+ if (!ioh->deleted) {
+ FD_SET(ioh->fd, &rfds);
+ max_fd = max_fd > ioh->fd ? max_fd : ioh->fd;
+ }
+
+ tv.tv_sec = 0;
+ tv.tv_usec = 10000;
+ if (select(max_fd + 1, &rfds, NULL, NULL, &tv) <= 0)
+ continue;
+
+ /* Call handlers */
+ for(ioh = first_io_handler; ioh != NULL; ioh = ioh->next)
+ if (FD_ISSET(ioh->fd, &rfds))
+ ioh->fd_read(ioh->opaque);
+
+ /* Remove deleted IO handlers */
+ pioh = &first_io_handler;
+ while (*pioh) {
+ ioh = *pioh;
+ if (ioh->deleted) {
+ *pioh = ioh->next;
+ qemu_free(ioh);
+ } else
+ pioh = &ioh->next;
+ }
+ }
+ return 0;
+}
diff --git a/tools/ioemu/target-i386-dm/helper2.c b/tools/ioemu/target-i386-dm/helper2.c
index 45c8fe0e86..46fe5433a1 100644
--- a/tools/ioemu/target-i386-dm/helper2.c
+++ b/tools/ioemu/target-i386-dm/helper2.c
@@ -392,8 +392,6 @@ void timeoffset_get(void)
else
time_offset = 0;
- xc_domain_set_time_offset(xc_handle, domid, time_offset);
-
free(p);
}
diff --git a/tools/ioemu/vl.c b/tools/ioemu/vl.c
index 1cbe3a99e4..6b708c2d29 100644
--- a/tools/ioemu/vl.c
+++ b/tools/ioemu/vl.c
@@ -1762,7 +1762,8 @@ static int store_dev_info(char *devName, int domid,
CharDriverState *cState, char *storeString)
{
#ifdef CONFIG_STUBDOM
- return 0;
+ fprintf(logfile, "can't store dev %s name for domid %d in %s from a stub domain\n", devName, domid, storeString);
+ return ENOSYS;
#else
int xc_handle;
struct xs_handle *xs;
@@ -7017,26 +7018,12 @@ int unset_mm_mapping(int xc_handle, uint32_t domid,
xen_pfn_t *extent_start)
{
int err = 0;
- xc_dominfo_t info;
-
- xc_domain_getinfo(xc_handle, domid, 1, &info);
- if ((info.nr_pages - nr_pages) <= 0) {
- fprintf(stderr, "unset_mm_mapping: error nr_pages\n");
- err = -1;
- }
err = xc_domain_memory_decrease_reservation(xc_handle, domid,
nr_pages, 0, extent_start);
if (err)
fprintf(stderr, "Failed to decrease physmap\n");
-
- if (xc_domain_setmaxmem(xc_handle, domid, (info.nr_pages - nr_pages) *
- PAGE_SIZE/1024) != 0) {
- fprintf(logfile, "set maxmem returned error %d\n", errno);
- err = -1;
- }
-
return err;
}
@@ -7044,17 +7031,8 @@ int set_mm_mapping(int xc_handle, uint32_t domid,
unsigned long nr_pages, unsigned int address_bits,
xen_pfn_t *extent_start)
{
- xc_dominfo_t info;
int err = 0;
- xc_domain_getinfo(xc_handle, domid, 1, &info);
-
- if (xc_domain_setmaxmem(xc_handle, domid, info.max_memkb +
- nr_pages * PAGE_SIZE/1024) != 0) {
- fprintf(logfile, "set maxmem returned error %d\n", errno);
- return -1;
- }
-
err = xc_domain_memory_populate_physmap(xc_handle, domid, nr_pages, 0,
address_bits, extent_start);
if (err) {
@@ -7688,11 +7666,13 @@ int main(int argc, char **argv)
bdrv_init();
xc_handle = xc_interface_open();
#ifdef CONFIG_STUBDOM
- char *domid_s, *msg;
- if ((msg = xenbus_read(XBT_NIL, "domid", &domid_s)))
- fprintf(stderr,"Can not read our own domid\n", msg);
- else
- xenstore_parse_domain_config(atoi(domid_s));
+ {
+ char *domid_s, *msg;
+ if ((msg = xenbus_read(XBT_NIL, "domid", &domid_s)))
+ fprintf(stderr,"Can not read our own domid: %s\n", msg);
+ else
+ xenstore_parse_domain_config(atoi(domid_s));
+ }
#else /* CONFIG_STUBDOM */
xenstore_parse_domain_config(domid);
#endif /* CONFIG_STUBDOM */
diff --git a/tools/ioemu/vl.h b/tools/ioemu/vl.h
index f3ad84bbd1..7ccd256a31 100644
--- a/tools/ioemu/vl.h
+++ b/tools/ioemu/vl.h
@@ -159,7 +159,7 @@ extern void *shared_vram;
extern FILE *logfile;
-#if defined(__i386__) || defined(__x86_64__)
+#if (defined(__i386__) || defined(__x86_64__)) && !defined(QEMU_TOOL)
#define MAPCACHE
uint8_t *qemu_map_cache(target_phys_addr_t phys_addr);
void qemu_invalidate_map_cache(void);
@@ -1553,7 +1553,9 @@ extern long time_offset;
void timeoffset_get(void);
/* xen_platform.c */
+#ifndef QEMU_TOOL
void pci_xen_platform_init(PCIBus *bus);
+#endif
void kqemu_record_dump(void);
diff --git a/tools/ioemu/xenstore.c b/tools/ioemu/xenstore.c
index 01ace34ada..117cc3ea1f 100644
--- a/tools/ioemu/xenstore.c
+++ b/tools/ioemu/xenstore.c
@@ -347,10 +347,6 @@ extern int vga_ram_size, bios_size;
void xenstore_process_logdirty_event(void)
{
-#ifdef CONFIG_STUBDOM
- /* XXX we just can't use shm. */
- return;
-#else
char *act;
static char *active_path = NULL;
static char *next_active_path = NULL;
@@ -392,6 +388,12 @@ void xenstore_process_logdirty_event(void)
/* Map the shared-memory segment */
fprintf(logfile, "%s: key=%16.16llx size=%lu\n", __FUNCTION__,
(unsigned long long)key, logdirty_bitmap_size);
+
+#ifdef CONFIG_STUBDOM
+ /* XXX we just can't use shm. */
+ fprintf(logfile, "Log dirty is not implemented in stub domains!\n");
+ return;
+#else
shmid = shmget(key, 2 * logdirty_bitmap_size, S_IRUSR|S_IWUSR);
if (shmid == -1) {
fprintf(logfile, "Log-dirty: shmget failed: segment %16.16llx "
@@ -417,6 +419,7 @@ void xenstore_process_logdirty_event(void)
seg = NULL;
return;
}
+#endif
/* Remember the paths for the next-active and active entries */
if (pasprintf(&active_path,
@@ -453,7 +456,6 @@ void xenstore_process_logdirty_event(void)
/* Ack that we've switched */
xs_write(xsh, XBT_NULL, active_path, act, len);
free(act);
-#endif
}
diff --git a/tools/libxc/xc_domain.c b/tools/libxc/xc_domain.c
index 073fe95175..a39f73071f 100644
--- a/tools/libxc/xc_domain.c
+++ b/tools/libxc/xc_domain.c
@@ -7,6 +7,7 @@
*/
#include "xc_private.h"
+#include "xg_save_restore.h"
#include <xen/memory.h>
#include <xen/hvm/hvm_op.h>
@@ -301,18 +302,27 @@ int xc_vcpu_getcontext(int xc_handle,
{
int rc;
DECLARE_DOMCTL;
+ size_t sz = sizeof(vcpu_guest_context_either_t);
domctl.cmd = XEN_DOMCTL_getvcpucontext;
domctl.domain = (domid_t)domid;
domctl.u.vcpucontext.vcpu = (uint16_t)vcpu;
set_xen_guest_handle(domctl.u.vcpucontext.ctxt, ctxt);
- if ( (rc = lock_pages(ctxt, sizeof(*ctxt))) != 0 )
- return rc;
+ /*
+ * We may be asked to lock either a 32-bit or a 64-bit context. Lock the
+ * larger of the two if possible, otherwise fall back to native size.
+ */
+ if ( (rc = lock_pages(ctxt, sz)) != 0 )
+ {
+ sz = sizeof(*ctxt);
+ if ( (rc = lock_pages(ctxt, sz)) != 0 )
+ return rc;
+ }
rc = do_domctl(xc_handle, &domctl);
- unlock_pages(ctxt, sizeof(*ctxt));
+ unlock_pages(ctxt, sz);
return rc;
}
@@ -620,19 +630,28 @@ int xc_vcpu_setcontext(int xc_handle,
{
DECLARE_DOMCTL;
int rc;
+ size_t sz = sizeof(vcpu_guest_context_either_t);
domctl.cmd = XEN_DOMCTL_setvcpucontext;
domctl.domain = domid;
domctl.u.vcpucontext.vcpu = vcpu;
set_xen_guest_handle(domctl.u.vcpucontext.ctxt, ctxt);
- if ( (ctxt != NULL) && ((rc = lock_pages(ctxt, sizeof(*ctxt))) != 0) )
- return rc;
+ /*
+ * We may be asked to lock either a 32-bit or a 64-bit context. Lock the
+ * larger of the two if possible, otherwise fall back to native size.
+ */
+ if ( (ctxt != NULL) && (rc = lock_pages(ctxt, sz)) != 0 )
+ {
+ sz = sizeof(*ctxt);
+ if ( (rc = lock_pages(ctxt, sz)) != 0 )
+ return rc;
+ }
rc = do_domctl(xc_handle, &domctl);
if ( ctxt != NULL )
- unlock_pages(ctxt, sizeof(*ctxt));
+ unlock_pages(ctxt, sz);
return rc;
}
diff --git a/tools/libxc/xc_domain_restore.c b/tools/libxc/xc_domain_restore.c
index 52fc1155d2..b7b74352e1 100644
--- a/tools/libxc/xc_domain_restore.c
+++ b/tools/libxc/xc_domain_restore.c
@@ -284,7 +284,8 @@ int xc_domain_restore(int xc_handle, int io_fd, uint32_t dom,
/* The new domain's shared-info frame number. */
unsigned long shared_info_frame;
unsigned char shared_info_page[PAGE_SIZE]; /* saved contents from file */
- shared_info_either_t *old_shared_info = (shared_info_either_t *)shared_info_page;
+ shared_info_either_t *old_shared_info =
+ (shared_info_either_t *)shared_info_page;
shared_info_either_t *new_shared_info;
/* A copy of the CPU context of the guest. */
@@ -349,13 +350,6 @@ int xc_domain_restore(int xc_handle, int io_fd, uint32_t dom,
guest_width = sizeof(unsigned long);
pt_levels = (guest_width == 8) ? 4 : (pt_levels == 2) ? 2 : 3;
- if ( lock_pages(&ctxt, sizeof(ctxt)) )
- {
- /* needed for build domctl, but might as well do early */
- ERROR("Unable to lock ctxt");
- return 1;
- }
-
if ( !hvm )
{
/* Load the p2m frame list, plus potential extended info chunk */
@@ -380,8 +374,11 @@ int xc_domain_restore(int xc_handle, int io_fd, uint32_t dom,
/* We want zeroed memory so use calloc rather than malloc. */
p2m = calloc(p2m_size, MAX(guest_width, sizeof (xen_pfn_t)));
pfn_type = calloc(p2m_size, sizeof(unsigned long));
- region_mfn = calloc(MAX_BATCH_SIZE, sizeof(xen_pfn_t));
- p2m_batch = calloc(MAX_BATCH_SIZE, sizeof(xen_pfn_t));
+
+ region_mfn = xg_memalign(PAGE_SIZE, ROUNDUP(
+ MAX_BATCH_SIZE * sizeof(xen_pfn_t), PAGE_SHIFT));
+ p2m_batch = xg_memalign(PAGE_SIZE, ROUNDUP(
+ MAX_BATCH_SIZE * sizeof(xen_pfn_t), PAGE_SHIFT));
if ( (p2m == NULL) || (pfn_type == NULL) ||
(region_mfn == NULL) || (p2m_batch == NULL) )
@@ -391,6 +388,11 @@ int xc_domain_restore(int xc_handle, int io_fd, uint32_t dom,
goto out;
}
+ memset(region_mfn, 0,
+ ROUNDUP(MAX_BATCH_SIZE * sizeof(xen_pfn_t), PAGE_SHIFT));
+ memset(p2m_batch, 0,
+ ROUNDUP(MAX_BATCH_SIZE * sizeof(xen_pfn_t), PAGE_SHIFT));
+
if ( lock_pages(region_mfn, sizeof(xen_pfn_t) * MAX_BATCH_SIZE) )
{
ERROR("Could not lock region_mfn");
@@ -976,6 +978,12 @@ int xc_domain_restore(int xc_handle, int io_fd, uint32_t dom,
}
}
+ if ( lock_pages(&ctxt, sizeof(ctxt)) )
+ {
+ ERROR("Unable to lock ctxt");
+ return 1;
+ }
+
for ( i = 0; i <= max_vcpu_id; i++ )
{
if ( !(vcpumap & (1ULL << i)) )
diff --git a/tools/libxc/xc_domain_save.c b/tools/libxc/xc_domain_save.c
index 34f554cb90..636bb78e7f 100644
--- a/tools/libxc/xc_domain_save.c
+++ b/tools/libxc/xc_domain_save.c
@@ -223,7 +223,7 @@ static int ratewrite(int io_fd, int live, void *buf, int n)
{
budget += BURST_BUDGET;
last_put.tv_usec += burst_time_us;
- if ( last_put.tv_usec > 1000000
+ if ( last_put.tv_usec > 1000000 )
{
last_put.tv_usec -= 1000000;
last_put.tv_sec++;
@@ -939,9 +939,9 @@ int xc_domain_save(int xc_handle, int io_fd, uint32_t dom, uint32_t max_iters,
sent_last_iter = p2m_size;
/* Setup to_send / to_fix and to_skip bitmaps */
- to_send = malloc(BITMAP_SIZE);
+ to_send = xg_memalign(PAGE_SIZE, ROUNDUP(BITMAP_SIZE, PAGE_SHIFT));
to_fix = calloc(1, BITMAP_SIZE);
- to_skip = malloc(BITMAP_SIZE);
+ to_skip = xg_memalign(PAGE_SIZE, ROUNDUP(BITMAP_SIZE, PAGE_SHIFT));
if ( !to_send || !to_fix || !to_skip )
{
@@ -983,8 +983,8 @@ int xc_domain_save(int xc_handle, int io_fd, uint32_t dom, uint32_t max_iters,
analysis_phase(xc_handle, dom, p2m_size, to_skip, 0);
- /* We want zeroed memory so use calloc rather than malloc. */
- pfn_type = calloc(MAX_BATCH_SIZE, sizeof(*pfn_type));
+ pfn_type = xg_memalign(PAGE_SIZE, ROUNDUP(
+ MAX_BATCH_SIZE * sizeof(*pfn_type), PAGE_SHIFT));
pfn_batch = calloc(MAX_BATCH_SIZE, sizeof(*pfn_batch));
if ( (pfn_type == NULL) || (pfn_batch == NULL) )
{
@@ -992,10 +992,12 @@ int xc_domain_save(int xc_handle, int io_fd, uint32_t dom, uint32_t max_iters,
errno = ENOMEM;
goto out;
}
+ memset(pfn_type, 0,
+ ROUNDUP(MAX_BATCH_SIZE * sizeof(*pfn_type), PAGE_SHIFT));
if ( lock_pages(pfn_type, MAX_BATCH_SIZE * sizeof(*pfn_type)) )
{
- ERROR("Unable to lock");
+ ERROR("Unable to lock pfn_type array");
goto out;
}
@@ -1048,7 +1050,7 @@ int xc_domain_save(int xc_handle, int io_fd, uint32_t dom, uint32_t max_iters,
/* Now write out each data page, canonicalising page tables as we go... */
for ( ; ; )
{
- unsigned int prev_pc, sent_this_iter, N, batch;
+ unsigned int prev_pc, sent_this_iter, N, batch, run;
iter++;
sent_this_iter = 0;
@@ -1225,6 +1227,7 @@ int xc_domain_save(int xc_handle, int io_fd, uint32_t dom, uint32_t max_iters,
}
/* entering this loop, pfn_type is now in pfns (Not mfns) */
+ run = 0;
for ( j = 0; j < batch; j++ )
{
unsigned long pfn, pagetype;
@@ -1233,7 +1236,25 @@ int xc_domain_save(int xc_handle, int io_fd, uint32_t dom, uint32_t max_iters,
pfn = pfn_type[j] & ~XEN_DOMCTL_PFINFO_LTAB_MASK;
pagetype = pfn_type[j] & XEN_DOMCTL_PFINFO_LTAB_MASK;
- /* write out pages in batch */
+ if ( pagetype != 0 )
+ {
+ /* If the page is not a normal data page, write out any
+ run of pages we may have previously acumulated */
+ if ( run )
+ {
+ if ( ratewrite(io_fd, live,
+ (char*)region_base+(PAGE_SIZE*(j-run)),
+ PAGE_SIZE*run) != PAGE_SIZE*run )
+ {
+ ERROR("Error when writing to state file (4a)"
+ " (errno %d)", errno);
+ goto out;
+ }
+ run = 0;
+ }
+ }
+
+ /* skip pages that aren't present */
if ( pagetype == XEN_DOMCTL_PFINFO_XTAB )
continue;
@@ -1255,24 +1276,31 @@ int xc_domain_save(int xc_handle, int io_fd, uint32_t dom, uint32_t max_iters,
if ( ratewrite(io_fd, live, page, PAGE_SIZE) != PAGE_SIZE )
{
- ERROR("Error when writing to state file (4)"
+ ERROR("Error when writing to state file (4b)"
" (errno %d)", errno);
goto out;
}
}
else
{
- /* We have a normal page: just write it directly. */
- if ( ratewrite(io_fd, live, spage, PAGE_SIZE) !=
- PAGE_SIZE )
- {
- ERROR("Error when writing to state file (5)"
- " (errno %d)", errno);
- goto out;
- }
+ /* We have a normal page: accumulate it for writing. */
+ run++;
}
} /* end of the write out for this batch */
+ if ( run )
+ {
+ /* write out the last accumulated run of pages */
+ if ( ratewrite(io_fd, live,
+ (char*)region_base+(PAGE_SIZE*(j-run)),
+ PAGE_SIZE*run) != PAGE_SIZE*run )
+ {
+ ERROR("Error when writing to state file (4c)"
+ " (errno %d)", errno);
+ goto out;
+ }
+ }
+
sent_this_iter += batch;
munmap(region_base, batch*PAGE_SIZE);
diff --git a/tools/libxc/xc_evtchn.c b/tools/libxc/xc_evtchn.c
index 0992a7bdbb..5e1ca26502 100644
--- a/tools/libxc/xc_evtchn.c
+++ b/tools/libxc/xc_evtchn.c
@@ -9,7 +9,8 @@
#include "xc_private.h"
-static int do_evtchn_op(int xc_handle, int cmd, void *arg, size_t arg_size)
+static int do_evtchn_op(int xc_handle, int cmd, void *arg,
+ size_t arg_size, int silently_fail)
{
int ret = -1;
DECLARE_HYPERCALL;
@@ -24,7 +25,7 @@ static int do_evtchn_op(int xc_handle, int cmd, void *arg, size_t arg_size)
goto out;
}
- if ((ret = do_xen_hypercall(xc_handle, &hypercall)) < 0)
+ if ((ret = do_xen_hypercall(xc_handle, &hypercall)) < 0 && !silently_fail)
ERROR("do_evtchn_op: HYPERVISOR_event_channel_op failed: %d", ret);
unlock_pages(arg, arg_size);
@@ -44,7 +45,7 @@ xc_evtchn_alloc_unbound(int xc_handle,
.remote_dom = (domid_t)remote_dom
};
- rc = do_evtchn_op(xc_handle, EVTCHNOP_alloc_unbound, &arg, sizeof(arg));
+ rc = do_evtchn_op(xc_handle, EVTCHNOP_alloc_unbound, &arg, sizeof(arg), 0);
if ( rc == 0 )
rc = arg.port;
@@ -55,5 +56,20 @@ int xc_evtchn_reset(int xc_handle,
uint32_t dom)
{
struct evtchn_reset arg = { .dom = (domid_t)dom };
- return do_evtchn_op(xc_handle, EVTCHNOP_reset, &arg, sizeof(arg));
+ return do_evtchn_op(xc_handle, EVTCHNOP_reset, &arg, sizeof(arg), 0);
+}
+
+int xc_evtchn_status(int xc_handle,
+ uint32_t dom,
+ uint32_t port)
+{
+ int rc;
+ struct evtchn_status arg = { .dom = (domid_t)dom,
+ .port = (evtchn_port_t)port };
+
+ rc = do_evtchn_op(xc_handle, EVTCHNOP_status, &arg, sizeof(arg), 1);
+ if ( rc == 0 )
+ rc = arg.status;
+
+ return rc;
}
diff --git a/tools/libxc/xc_hvm_build.c b/tools/libxc/xc_hvm_build.c
index 296648a436..ae3178b0e1 100644
--- a/tools/libxc/xc_hvm_build.c
+++ b/tools/libxc/xc_hvm_build.c
@@ -21,6 +21,13 @@
#define SCRATCH_PFN 0xFFFFF
+#define SPECIALPAGE_GUARD 0
+#define SPECIALPAGE_BUFIOREQ 1
+#define SPECIALPAGE_XENSTORE 2
+#define SPECIALPAGE_IOREQ 3
+#define SPECIALPAGE_IDENT_PT 4
+#define NR_SPECIAL_PAGES 5
+
static void build_e820map(void *e820_page, unsigned long long mem_size)
{
struct e820entry *e820entry =
@@ -77,21 +84,16 @@ static void build_e820map(void *e820_page, unsigned long long mem_size)
e820entry[nr_map].type = E820_RESERVED;
nr_map++;
- /*
- * Low RAM goes here. Remove 4 pages for: ioreq, bufioreq, and xenstore.
- * 1. Guard page.
- * 2. Buffered ioreq.
- * 3. Xenstore.
- * 4. Normal ioreq.
- */
+ /* Low RAM goes here. Reserve space for special pages. */
e820entry[nr_map].addr = 0x100000;
- e820entry[nr_map].size = mem_size - 0x100000 - PAGE_SIZE * 4;
+ e820entry[nr_map].size = (mem_size - 0x100000 -
+ PAGE_SIZE * NR_SPECIAL_PAGES);
e820entry[nr_map].type = E820_RAM;
nr_map++;
- /* Explicitly reserve space for special pages. */
- e820entry[nr_map].addr = mem_size - PAGE_SIZE * 3;
- e820entry[nr_map].size = PAGE_SIZE * 3;
+ /* Explicitly reserve space for special pages (excluding guard page). */
+ e820entry[nr_map].addr = mem_size - PAGE_SIZE * (NR_SPECIAL_PAGES - 1);
+ e820entry[nr_map].size = PAGE_SIZE * (NR_SPECIAL_PAGES - 1);
e820entry[nr_map].type = E820_RESERVED;
nr_map++;
@@ -156,10 +158,11 @@ static int setup_guest(int xc_handle,
{
xen_pfn_t *page_array = NULL;
unsigned long i, nr_pages = (unsigned long)memsize << (20 - PAGE_SHIFT);
- unsigned long shared_page_nr, entry_eip;
+ unsigned long special_page_nr, entry_eip, cur_pages;
struct xen_add_to_physmap xatp;
struct shared_info *shared_info;
void *e820_page;
+ uint32_t *ident_pt;
struct elf_binary elf;
uint64_t v_start, v_end;
int rc;
@@ -206,12 +209,23 @@ static int setup_guest(int xc_handle,
for ( i = HVM_BELOW_4G_RAM_END >> PAGE_SHIFT; i < nr_pages; i++ )
page_array[i] += HVM_BELOW_4G_MMIO_LENGTH >> PAGE_SHIFT;
- /* Allocate memory for HVM guest, skipping VGA hole 0xA0000-0xC0000. */
+ /*
+ * Allocate memory for HVM guest, skipping VGA hole 0xA0000-0xC0000.
+ * We allocate pages in batches of no more than 2048 to ensure that
+ * we can be preempted and hence dom0 remains responsive.
+ */
rc = xc_domain_memory_populate_physmap(
xc_handle, dom, 0xa0, 0, 0, &page_array[0x00]);
- if ( rc == 0 )
+ cur_pages = 0xc0;
+ while ( (rc == 0) && (nr_pages > cur_pages) )
+ {
+ unsigned long count = nr_pages - cur_pages;
+ if ( count > 2048 )
+ count = 2048;
rc = xc_domain_memory_populate_physmap(
- xc_handle, dom, nr_pages - 0xc0, 0, 0, &page_array[0xc0]);
+ xc_handle, dom, count, 0, 0, &page_array[cur_pages]);
+ cur_pages += count;
+ }
if ( rc != 0 )
{
PERROR("Could not allocate memory for HVM guest.\n");
@@ -245,29 +259,46 @@ static int setup_guest(int xc_handle,
sizeof(shared_info->evtchn_mask));
munmap(shared_info, PAGE_SIZE);
- if ( v_end > HVM_BELOW_4G_RAM_END )
- shared_page_nr = (HVM_BELOW_4G_RAM_END >> PAGE_SHIFT) - 1;
- else
- shared_page_nr = (v_end >> PAGE_SHIFT) - 1;
+ special_page_nr = (((v_end > HVM_BELOW_4G_RAM_END)
+ ? (HVM_BELOW_4G_RAM_END >> PAGE_SHIFT)
+ : (v_end >> PAGE_SHIFT))
+ - NR_SPECIAL_PAGES);
+
+ /* Paranoia: clean special pages. */
+ for ( i = 0; i < NR_SPECIAL_PAGES; i++ )
+ if ( xc_clear_domain_page(xc_handle, dom, special_page_nr + i) )
+ goto error_out;
/* Free the guard page that separates low RAM from special pages. */
rc = xc_domain_memory_decrease_reservation(
- xc_handle, dom, 1, 0, &page_array[shared_page_nr-3]);
+ xc_handle, dom, 1, 0, &page_array[special_page_nr]);
if ( rc != 0 )
{
PERROR("Could not deallocate guard page for HVM guest.\n");
goto error_out;
}
- /* Paranoia: clean pages. */
- if ( xc_clear_domain_page(xc_handle, dom, shared_page_nr) ||
- xc_clear_domain_page(xc_handle, dom, shared_page_nr-1) ||
- xc_clear_domain_page(xc_handle, dom, shared_page_nr-2) )
- goto error_out;
+ xc_set_hvm_param(xc_handle, dom, HVM_PARAM_STORE_PFN,
+ special_page_nr + SPECIALPAGE_XENSTORE);
+ xc_set_hvm_param(xc_handle, dom, HVM_PARAM_BUFIOREQ_PFN,
+ special_page_nr + SPECIALPAGE_BUFIOREQ);
+ xc_set_hvm_param(xc_handle, dom, HVM_PARAM_IOREQ_PFN,
+ special_page_nr + SPECIALPAGE_IOREQ);
- xc_set_hvm_param(xc_handle, dom, HVM_PARAM_STORE_PFN, shared_page_nr-1);
- xc_set_hvm_param(xc_handle, dom, HVM_PARAM_BUFIOREQ_PFN, shared_page_nr-2);
- xc_set_hvm_param(xc_handle, dom, HVM_PARAM_IOREQ_PFN, shared_page_nr);
+ /*
+ * Identity-map page table is required for running with CR0.PG=0 when
+ * using Intel EPT. Create a 32-bit non-PAE page directory of superpages.
+ */
+ if ( (ident_pt = xc_map_foreign_range(
+ xc_handle, dom, PAGE_SIZE, PROT_READ | PROT_WRITE,
+ special_page_nr + SPECIALPAGE_IDENT_PT)) == NULL )
+ goto error_out;
+ for ( i = 0; i < PAGE_SIZE / sizeof(*ident_pt); i++ )
+ ident_pt[i] = ((i << 22) | _PAGE_PRESENT | _PAGE_RW | _PAGE_USER |
+ _PAGE_ACCESSED | _PAGE_DIRTY | _PAGE_PSE);
+ munmap(ident_pt, PAGE_SIZE);
+ xc_set_hvm_param(xc_handle, dom, HVM_PARAM_IDENT_PT,
+ special_page_nr + SPECIALPAGE_IDENT_PT);
/* Insert JMP <rel32> instruction at address 0x0 to reach entry point. */
entry_eip = elf_uval(&elf, elf.ehdr, e_entry);
diff --git a/tools/libxc/xenctrl.h b/tools/libxc/xenctrl.h
index 8eb3f5ef6f..8bd5fb4fb8 100644
--- a/tools/libxc/xenctrl.h
+++ b/tools/libxc/xenctrl.h
@@ -470,6 +470,9 @@ xc_evtchn_alloc_unbound(int xc_handle,
int xc_evtchn_reset(int xc_handle,
uint32_t dom);
+int xc_evtchn_status(int xc_handle,
+ uint32_t dom,
+ uint32_t port);
/*
* Return a handle to the event channel driver, or -1 on failure, in which case
diff --git a/tools/libxc/xg_private.c b/tools/libxc/xg_private.c
index 37bc587477..224544a744 100644
--- a/tools/libxc/xg_private.c
+++ b/tools/libxc/xg_private.c
@@ -8,6 +8,7 @@
#include <unistd.h>
#include <zlib.h>
#include <strings.h>
+#include <malloc.h>
#include "xg_private.h"
@@ -198,6 +199,22 @@ __attribute__((weak))
return -1;
}
+void *xg_memalign(size_t alignment, size_t size)
+{
+#if defined(_POSIX_C_SOURCE) && !defined(__sun__)
+ int ret;
+ void *ptr;
+ ret = posix_memalign(&ptr, alignment, size);
+ if (ret != 0)
+ return NULL;
+ return ptr;
+#elif defined(__NetBSD__) || defined(__OpenBSD__)
+ return valloc(size);
+#else
+ return memalign(alignment, size);
+#endif
+}
+
/*
* Local variables:
* mode: C
diff --git a/tools/libxc/xg_private.h b/tools/libxc/xg_private.h
index 2ed3f55849..e4dedede6d 100644
--- a/tools/libxc/xg_private.h
+++ b/tools/libxc/xg_private.h
@@ -176,4 +176,6 @@ int xc_copy_to_domain_page(int xc_handle, uint32_t domid,
int pin_table(int xc_handle, unsigned int type, unsigned long mfn,
domid_t dom);
+void *xg_memalign(size_t alignment, size_t size);
+
#endif /* XG_PRIVATE_H */
diff --git a/tools/python/xen/util/acmpolicy.py b/tools/python/xen/util/acmpolicy.py
index ef31734ad3..89ee983600 100644
--- a/tools/python/xen/util/acmpolicy.py
+++ b/tools/python/xen/util/acmpolicy.py
@@ -76,6 +76,7 @@ DEFAULT_policy = \
" <SimpleTypeEnforcement>\n" +\
" <SimpleTypeEnforcementTypes>\n" +\
" <Type>SystemManagement</Type>\n" +\
+" <Type>__UNLABELED__</Type>\n" +\
" </SimpleTypeEnforcementTypes>\n" +\
" </SimpleTypeEnforcement>\n" +\
" <ChineseWall>\n" +\
@@ -89,12 +90,30 @@ DEFAULT_policy = \
" <Name%s>SystemManagement</Name>\n" +\
" <SimpleTypeEnforcementTypes>\n" +\
" <Type>SystemManagement</Type>\n" +\
+" <Type>__UNLABELED__</Type>\n" +\
+" </SimpleTypeEnforcementTypes>\n" +\
+" <ChineseWallTypes>\n" +\
+" <Type/>\n" +\
+" </ChineseWallTypes>\n" +\
+" </VirtualMachineLabel>\n" +\
+" <VirtualMachineLabel>\n" +\
+" <Name>__UNLABELED__</Name>\n" +\
+" <SimpleTypeEnforcementTypes>\n" +\
+" <Type>__UNLABELED__</Type>\n" +\
" </SimpleTypeEnforcementTypes>\n" +\
" <ChineseWallTypes>\n" +\
" <Type/>\n" +\
" </ChineseWallTypes>\n" +\
" </VirtualMachineLabel>\n" +\
" </SubjectLabels>\n" +\
+" <ObjectLabels>\n" +\
+" <ResourceLabel>\n" +\
+" <Name>__UNLABELED__</Name>\n" +\
+" <SimpleTypeEnforcementTypes>\n" +\
+" <Type>__UNLABELED__</Type>\n" +\
+" </SimpleTypeEnforcementTypes>\n" +\
+" </ResourceLabel>\n" +\
+" </ObjectLabels>\n" +\
" </SecurityLabelTemplate>\n" +\
"</SecurityPolicyDefinition>\n"
@@ -231,13 +250,14 @@ class ACMPolicy(XSPolicy):
"""
Determine whether this is the default policy
"""
- default = ['SystemManagement']
+ default = ['SystemManagement', ACM_LABEL_UNLABELED ]
if self.policy_get_virtualmachinelabel_names() == default and \
self.policy_get_bootstrap_vmlabel() == default[0] and \
self.policy_get_stetypes_types() == default and \
self.policy_get_stes_of_vmlabel(default[0]) == default and \
- self.policy_get_resourcelabel_names() == [] and \
- self.policy_get_chwall_types() == default and \
+ self.policy_get_stes_of_vmlabel(default[1]) == [default[1]] and \
+ self.policy_get_resourcelabel_names() == [default[1]] and \
+ self.policy_get_chwall_types() == [ default[0] ] and \
self.get_name() == "DEFAULT":
return True
return False
diff --git a/tools/python/xen/util/xsm/acm/acm.py b/tools/python/xen/util/xsm/acm/acm.py
index e8de0fa60c..e3ec15c806 100644
--- a/tools/python/xen/util/xsm/acm/acm.py
+++ b/tools/python/xen/util/xsm/acm/acm.py
@@ -1146,11 +1146,13 @@ def __resources_compatible_with_vmlabel(xspol, dominfo, vmlabel,
for key, value in resources.items():
if key in [ 'vbd', 'tap' ]:
for res in resources[key]:
- try:
+ if not res in access_control:
+ label = [xsconstants.ACM_POLICY_ID,
+ xspol.get_name(),
+ ACM_LABEL_UNLABELED]
+ else:
label = access_control[res]
- if not collect_labels(reslabels, label, polname):
- return False
- except:
+ if not collect_labels(reslabels, label, polname):
return False
elif key in [ 'vif' ]:
for xapi_label in value:
@@ -1220,6 +1222,11 @@ def set_resource_label(resource, policytype, policyref, reslabel, \
return -xsconstants.XSERR_BAD_LABEL
if tmp[2] != oreslabel:
return -xsconstants.XSERR_BAD_LABEL
+ if resource.startswith('vlan:'):
+ for key, value in access_control.items():
+ if value == tuple([policytype, policyref, reslabel]) and \
+ key.startswith('vlan:'):
+ return -xsconstants.XSERR_BAD_LABEL
if reslabel != "":
new_entry = { resource : tuple([policytype, policyref, reslabel])}
access_control.update(new_entry)
@@ -1402,6 +1409,8 @@ def change_acm_policy(bin_pol, del_array, chg_array,
dominfos = XendDomain.instance().list('all')
log.info("----------------------------------------------")
+
+ label_changes = []
# relabel resources
access_control = {}
@@ -1433,7 +1442,7 @@ def change_acm_policy(bin_pol, del_array, chg_array,
elif label not in polnew_reslabels:
# label been removed
policytype = xsconstants.INVALID_POLICY_PREFIX + policytype
- run_resource_label_change_script(key, "", "remove")
+ label_changes.append(key)
polname = policy
else:
# no change to label
@@ -1501,6 +1510,8 @@ def change_acm_policy(bin_pol, del_array, chg_array,
rc, errors = hv_chg_policy(bin_pol, del_array, chg_array)
if rc == 0:
+ for key in label_changes:
+ run_resource_label_change_script(key, "", "remove")
# Write the relabeled resources back into the file
dictio.dict_write(access_control, "resources", res_label_filename)
# Properly update all VMs to their new labels
diff --git a/tools/python/xen/xend/XendConstants.py b/tools/python/xen/xend/XendConstants.py
index bca3ee7dd1..75f9d98c43 100644
--- a/tools/python/xen/xend/XendConstants.py
+++ b/tools/python/xen/xend/XendConstants.py
@@ -96,6 +96,7 @@ ZOMBIE_PREFIX = 'Zombie-'
MINIMUM_RESTART_TIME = 20
RESTART_IN_PROGRESS = 'xend/restart_in_progress'
+DUMPCORE_IN_PROGRESS = 'xend/dumpcore_in_progress'
LAST_SHUTDOWN_REASON = 'xend/last_shutdown_reason'
TRIGGER_NMI = 0
diff --git a/tools/python/xen/xend/XendDomainInfo.py b/tools/python/xen/xend/XendDomainInfo.py
index 5bfc9fa185..a88dfb4a3f 100644
--- a/tools/python/xen/xend/XendDomainInfo.py
+++ b/tools/python/xen/xend/XendDomainInfo.py
@@ -986,6 +986,13 @@ class XendDomainInfo:
self.info['name_label'], str(self.domid), target)
MiB = 1024 * 1024
+
+ if self.domid == 0:
+ dom0_min_mem = xoptions.get_dom0_min_mem()
+ memory_cur = self.get_memory_dynamic_max() / MiB
+ if target < memory_cur and dom0_min_mem > target:
+ raise XendError("memory_dynamic_max too small")
+
self._safe_set_memory('memory_dynamic_min', target * MiB)
self._safe_set_memory('memory_dynamic_max', target * MiB)
@@ -1792,10 +1799,13 @@ class XendDomainInfo:
raise XendError("Cannot dump core in a directory: %s" %
corefile)
+ self._writeVm(DUMPCORE_IN_PROGRESS, 'True')
xc.domain_dumpcore(self.domid, corefile)
+ self._removeVm(DUMPCORE_IN_PROGRESS)
except RuntimeError, ex:
corefile_incomp = corefile+'-incomplete'
os.rename(corefile, corefile_incomp)
+ self._removeVm(DUMPCORE_IN_PROGRESS)
log.exception("XendDomainInfo.dumpCore failed: id = %s name = %s",
self.domid, self.info['name_label'])
raise XendError("Failed to dump core: %s" % str(ex))
diff --git a/tools/python/xen/xend/XendOptions.py b/tools/python/xen/xend/XendOptions.py
index 8895c5bb8c..cae9a4d19a 100644
--- a/tools/python/xen/xend/XendOptions.py
+++ b/tools/python/xen/xend/XendOptions.py
@@ -279,6 +279,13 @@ class XendOptions:
def get_dom0_min_mem(self):
return self.get_config_int('dom0-min-mem', self.dom0_min_mem_default)
+ def get_enable_dom0_ballooning(self):
+ enable_dom0_ballooning_default = 'yes'
+ if self.get_dom0_min_mem() == 0:
+ enable_dom0_ballooning_default = 'no'
+ return self.get_config_bool('enable-dom0-ballooning',
+ enable_dom0_ballooning_default)
+
def get_dom0_vcpus(self):
return self.get_config_int('dom0-cpus', self.dom0_vcpus_default)
diff --git a/tools/python/xen/xend/balloon.py b/tools/python/xen/xend/balloon.py
index 168070ea13..5f2c41915e 100644
--- a/tools/python/xen/xend/balloon.py
+++ b/tools/python/xen/xend/balloon.py
@@ -81,8 +81,8 @@ def free(need_mem):
# needs to balloon. No matter where we expect the free memory to come
# from, we need to wait for it to become available.
#
- # We are not allowed to balloon below dom0_min_mem, or if dom0_min_mem
- # is 0, we cannot balloon at all. Memory can still become available
+ # We are not allowed to balloon below dom0_min_mem, or if dom0_ballooning
+ # is False, we cannot balloon at all. Memory can still become available
# through a rebooting domain, however.
#
# Eventually, we time out (presumably because there really isn't enough
@@ -100,6 +100,7 @@ def free(need_mem):
try:
dom0_min_mem = xoptions.get_dom0_min_mem() * 1024
+ dom0_ballooning = xoptions.get_enable_dom0_ballooning()
dom0_alloc = get_dom0_current_alloc()
retries = 0
@@ -115,7 +116,7 @@ def free(need_mem):
free_mem = physinfo['free_memory']
scrub_mem = physinfo['scrub_memory']
total_mem = physinfo['total_memory']
- if dom0_min_mem > 0:
+ if dom0_ballooning:
max_free_mem = total_mem - dom0_min_mem
else:
max_free_mem = total_mem - dom0_alloc
@@ -137,7 +138,7 @@ def free(need_mem):
log.debug("Balloon: %d KiB free; %d to scrub; need %d; retries: %d.",
free_mem, scrub_mem, need_mem, rlimit)
- if dom0_min_mem > 0:
+ if dom0_ballooning:
dom0_alloc = get_dom0_current_alloc()
new_alloc = dom0_alloc - (need_mem - free_mem - scrub_mem)
@@ -163,10 +164,10 @@ def free(need_mem):
last_free = free_mem + scrub_mem
# Not enough memory; diagnose the problem.
- if dom0_min_mem == 0:
- raise VmError(('Not enough free memory and dom0_min_mem is 0, so '
- 'I cannot release any more. I need %d KiB but '
- 'only have %d.') %
+ if not dom0_ballooning:
+ raise VmError(('Not enough free memory and enable-dom0-ballooning '
+ 'is False, so I cannot release any more. '
+ 'I need %d KiB but only have %d.') %
(need_mem, free_mem))
elif new_alloc < dom0_min_mem:
raise VmError(
diff --git a/tools/python/xen/xend/image.py b/tools/python/xen/xend/image.py
index cf76e53c29..95a2f68a5a 100644
--- a/tools/python/xen/xend/image.py
+++ b/tools/python/xen/xend/image.py
@@ -99,7 +99,9 @@ class ImageHandler:
self.vncconsole = vmConfig['platform'].get('vncconsole')
self.dmargs = self.parseDeviceModelArgs(vmConfig)
self.pid = None
-
+ rtc_timeoffset = vmConfig['platform'].get('rtc_timeoffset')
+ if rtc_timeoffset is not None:
+ xc.domain_set_time_offset(self.vm.getDomid(), int(rtc_timeoffset))
def cleanupBootloading(self):
@@ -419,9 +421,6 @@ class LinuxImageHandler(ImageHandler):
def configure(self, vmConfig):
ImageHandler.configure(self, vmConfig)
- rtc_timeoffset = vmConfig['platform'].get('rtc_timeoffset')
- if rtc_timeoffset is not None:
- xc.domain_set_time_offset(self.vm.getDomid(), int(rtc_timeoffset))
def buildDomain(self):
store_evtchn = self.vm.getStorePort()
diff --git a/tools/python/xen/xm/main.py b/tools/python/xen/xm/main.py
index 8a161e6f7f..f5ad85d381 100644
--- a/tools/python/xen/xm/main.py
+++ b/tools/python/xen/xm/main.py
@@ -1294,14 +1294,14 @@ def xm_dump_core(args):
try:
print "Dumping core of domain: %s ..." % str(dom)
server.xend.domain.dump(dom, filename, live, crash)
+
+ if crash:
+ print "Destroying domain: %s ..." % str(dom)
+ server.xend.domain.destroy(dom)
finally:
- if not live and ds == DOM_STATE_RUNNING:
+ if not live and not crash and ds == DOM_STATE_RUNNING:
server.xend.domain.unpause(dom)
- if crash:
- print "Destroying domain: %s ..." % str(dom)
- server.xend.domain.destroy(dom)
-
def xm_rename(args):
arg_check(args, "rename", 2)
diff --git a/tools/python/xen/xm/shutdown.py b/tools/python/xen/xm/shutdown.py
index 6903183e9a..2e6294a979 100644
--- a/tools/python/xen/xm/shutdown.py
+++ b/tools/python/xen/xm/shutdown.py
@@ -144,7 +144,7 @@ def main_all(opts, args):
def main_dom(opts, args):
if len(args) == 0: opts.err('No domain parameter given')
if len(args) > 1: opts.err('No multiple domain parameters allowed')
- dom = args[0]
+ dom = sxp.child_value(server.xend.domain(args[0]), 'name')
if serverType == SERVER_XEN_API:
dom = get_single_vm(dom)
mode = shutdown_mode(opts)
diff --git a/tools/security/Makefile b/tools/security/Makefile
index 81da019485..61062715a2 100644
--- a/tools/security/Makefile
+++ b/tools/security/Makefile
@@ -32,7 +32,7 @@ ACM_SECGEN_CGIDIR = $(ACM_SECGEN_HTMLDIR)/cgi-bin
ACM_SCHEMA = security_policy.xsd
ACM_EXAMPLES = client_v1 test
-ACM_DEF_POLICIES = DEFAULT-UL
+ACM_DEF_POLICIES =
ACM_POLICY_SUFFIX = security_policy.xml
ifeq ($(ACM_SECURITY),y)
diff --git a/tools/security/policies/DEFAULT-UL-security_policy.xml b/tools/security/policies/DEFAULT-UL-security_policy.xml
deleted file mode 100644
index 1dad2d19c0..0000000000
--- a/tools/security/policies/DEFAULT-UL-security_policy.xml
+++ /dev/null
@@ -1,41 +0,0 @@
-<?xml version="1.0" ?>
-<SecurityPolicyDefinition xmlns="http://www.ibm.com" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.ibm.com ../../security_policy.xsd">
- <PolicyHeader>
- <PolicyName>DEFAULT-UL</PolicyName>
- <Version>1.0</Version>
- </PolicyHeader>
- <SimpleTypeEnforcement>
- <SimpleTypeEnforcementTypes>
- <Type>SystemManagement</Type>
- <Type>__UNLABELED__</Type>
- </SimpleTypeEnforcementTypes>
- </SimpleTypeEnforcement>
- <ChineseWall>
- <ChineseWallTypes>
- <Type>SystemManagement</Type>
- </ChineseWallTypes>
- </ChineseWall>
- <SecurityLabelTemplate>
- <SubjectLabels bootstrap="SystemManagement">
- <VirtualMachineLabel>
- <Name>SystemManagement</Name>
- <SimpleTypeEnforcementTypes>
- <Type>SystemManagement</Type>
- <Type>__UNLABELED__</Type>
- </SimpleTypeEnforcementTypes>
- <ChineseWallTypes>
- <Type/>
- </ChineseWallTypes>
- </VirtualMachineLabel>
- <VirtualMachineLabel>
- <Name>__UNLABELED__</Name>
- <SimpleTypeEnforcementTypes>
- <Type>__UNLABELED__</Type>
- </SimpleTypeEnforcementTypes>
- <ChineseWallTypes>
- <Type/>
- </ChineseWallTypes>
- </VirtualMachineLabel>
- </SubjectLabels>
- </SecurityLabelTemplate>
-</SecurityPolicyDefinition>
diff --git a/tools/tests/blowfish.mk b/tools/tests/blowfish.mk
index ecad7836a4..dfd7bd2be8 100644
--- a/tools/tests/blowfish.mk
+++ b/tools/tests/blowfish.mk
@@ -5,11 +5,11 @@ CFLAGS :=
include $(XEN_ROOT)/tools/Rules.mk
# Disable PIE/SSP if GCC supports them. They can break us.
-CFLAGS += $(call cc-option,$(CC),-nopie,)
-CFLAGS += $(call cc-option,$(CC),-fno-stack-protector,)
-CFLAGS += $(call cc-option,$(CC),-fno-stack-protector-all,)
+CFLAGS += $(call cc-option,$(CC),-nopie,)
+CFLAGS += $(call cc-option,$(CC),-fno-stack-protector,)
+CFLAGS += $(call cc-option,$(CC),-fno-stack-protector-all,)
-CFLAGS += -fno-builtin -O2 -msoft-float
+CFLAGS += -fno-builtin -msoft-float
.PHONY: all
all: blowfish.bin
diff --git a/tools/xcutils/Makefile b/tools/xcutils/Makefile
index d38e8ac07d..15c0c9758e 100644
--- a/tools/xcutils/Makefile
+++ b/tools/xcutils/Makefile
@@ -18,7 +18,7 @@ CFLAGS += $(CFLAGS_libxenctrl) $(CFLAGS_libxenguest) $(CFLAGS_libxenstore)
CFLAGS += -Wp,-MD,.$(@F).d
PROG_DEP = .*.d
-PROGRAMS = xc_restore xc_save readnotes
+PROGRAMS = xc_restore xc_save readnotes lsevtchn
LDLIBS = $(LDFLAGS_libxenctrl) $(LDFLAGS_libxenguest) $(LDFLAGS_libxenstore)
diff --git a/tools/xcutils/lsevtchn.c b/tools/xcutils/lsevtchn.c
new file mode 100644
index 0000000000..3dc3cb3c42
--- /dev/null
+++ b/tools/xcutils/lsevtchn.c
@@ -0,0 +1,59 @@
+#include <err.h>
+#include <stdlib.h>
+#include <stdint.h>
+#include <string.h>
+#include <stdio.h>
+
+#include <xs.h>
+#include <xenctrl.h>
+#include <xenguest.h>
+
+int
+main(int argc, char **argv)
+{
+ int xc_fd;
+ int domid = 0, port = 0, status;
+ const char *msg;
+
+ if ( argc > 1 )
+ domid = strtol(argv[1], NULL, 10);
+
+ xc_fd = xc_interface_open();
+ if ( xc_fd < 0 )
+ errx(1, "failed to open control interface");
+
+ while ( (status = xc_evtchn_status(xc_fd, domid, port)) >= 0 )
+ {
+ switch ( status )
+ {
+ case EVTCHNSTAT_closed:
+ msg = "Channel is not in use.";
+ break;
+ case EVTCHNSTAT_unbound:
+ msg = "Channel is waiting interdom connection.";
+ break;
+ case EVTCHNSTAT_interdomain:
+ msg = "Channel is connected to remote domain.";
+ break;
+ case EVTCHNSTAT_pirq:
+ msg = "Channel is bound to a phys IRQ line.";
+ break;
+ case EVTCHNSTAT_virq:
+ msg = "Channel is bound to a virtual IRQ line.";
+ break;
+ case EVTCHNSTAT_ipi:
+ msg = "Channel is bound to a virtual IPI line.";
+ break;
+ default:
+ msg = "Unknown.";
+ break;
+
+ }
+ printf("%03d: %d: %s\n", port, status, msg);
+ port++;
+ }
+
+ xc_interface_close(xc_fd);
+
+ return 0;
+}
diff --git a/tools/xenstore/Makefile b/tools/xenstore/Makefile
index d0a0b518f1..9b7e9e89c6 100644
--- a/tools/xenstore/Makefile
+++ b/tools/xenstore/Makefile
@@ -13,8 +13,7 @@ CFLAGS += -Wp,-MD,.$(@F).d
DEP = .*.d
CLIENTS := xenstore-exists xenstore-list xenstore-read xenstore-rm xenstore-chmod
-CLIENTS += xenstore-write
-CLIENTS_OBJS := $(patsubst xenstore-%,xenstore_%.o,$(CLIENTS))
+CLIENTS += xenstore-write xenstore-ls
XENSTORED_OBJS = xenstored_core.o xenstored_watch.o xenstored_domain.o xenstored_transaction.o xs_lib.o talloc.o utils.o tdb.o hashtable.o
@@ -24,8 +23,18 @@ XENSTORED_OBJS_$(CONFIG_NetBSD) = xenstored_netbsd.o
XENSTORED_OBJS += $(XENSTORED_OBJS_y)
+ifneq ($(XENSTORE_STATIC_CLIENTS),y)
+LIBXENSTORE := libxenstore.so
+else
+LIBXENSTORE := libxenstore.a
+xenstore xenstore-control: CFLAGS += -static
+endif
+
.PHONY: all
-all: libxenstore.so libxenstore.a xenstored $(CLIENTS) xs_tdb_dump xenstore-control xenstore-ls
+all: libxenstore.so libxenstore.a xenstored clients xs_tdb_dump
+
+.PHONY: clients
+clients: xenstore $(CLIENTS) xenstore-control
ifeq ($(CONFIG_SunOS),y)
xenstored_probes.h: xenstored_probes.d
@@ -42,16 +51,13 @@ endif
xenstored: $(XENSTORED_OBJS)
$(CC) $(CFLAGS) $(LDFLAGS) $^ $(LDFLAGS_libxenctrl) $(SOCKET_LIBS) -o $@
-$(CLIENTS): xenstore-%: xenstore_%.o libxenstore.so
- $(CC) $(CFLAGS) $(LDFLAGS) $< -L. -lxenstore $(SOCKET_LIBS) -o $@
-
-$(CLIENTS_OBJS): xenstore_%.o: xenstore_client.c
- $(COMPILE.c) -DCLIENT_$(*F) -o $@ $<
+$(CLIENTS): xenstore
+ ln -f xenstore $@
-xenstore-control: xenstore_control.o libxenstore.so
+xenstore: xenstore_client.o $(LIBXENSTORE)
$(CC) $(CFLAGS) $(LDFLAGS) $< -L. -lxenstore $(SOCKET_LIBS) -o $@
-xenstore-ls: xsls.o libxenstore.so
+xenstore-control: xenstore_control.o $(LIBXENSTORE)
$(CC) $(CFLAGS) $(LDFLAGS) $< -L. -lxenstore $(SOCKET_LIBS) -o $@
xs_tdb_dump: xs_tdb_dump.o utils.o tdb.o talloc.o
@@ -62,6 +68,8 @@ libxenstore.so: libxenstore.so.$(MAJOR)
libxenstore.so.$(MAJOR): libxenstore.so.$(MAJOR).$(MINOR)
ln -sf $< $@
+xs.opic: CFLAGS += -DUSE_PTHREAD
+
libxenstore.so.$(MAJOR).$(MINOR): xs.opic xs_lib.opic
$(CC) $(CFLAGS) $(LDFLAGS) -Wl,$(SONAME_LDFLAG) -Wl,libxenstore.so.$(MAJOR) $(SHLIB_CFLAGS) -o $@ $^ $(SOCKET_LIBS) -lpthread
@@ -72,8 +80,8 @@ libxenstore.a: xs.o xs_lib.o
clean:
rm -f *.a *.o *.opic *.so* xenstored_probes.h
rm -f xenstored xs_random xs_stress xs_crashme
- rm -f xs_tdb_dump xenstore-control xenstore-ls
- rm -f $(CLIENTS)
+ rm -f xs_tdb_dump xenstore-control
+ rm -f xenstore $(CLIENTS)
$(RM) $(DEP)
.PHONY: TAGS
@@ -92,9 +100,11 @@ install: all
$(INSTALL_DIR) $(DESTDIR)$(SBINDIR)
$(INSTALL_DIR) $(DESTDIR)$(INCLUDEDIR)
$(INSTALL_PROG) xenstored $(DESTDIR)$(SBINDIR)
- $(INSTALL_PROG) $(CLIENTS) $(DESTDIR)$(BINDIR)
$(INSTALL_PROG) xenstore-control $(DESTDIR)$(BINDIR)
- $(INSTALL_PROG) xenstore-ls $(DESTDIR)$(BINDIR)
+ $(INSTALL_PROG) xenstore $(DESTDIR)/usr/bin
+ set -e ; for c in $(CLIENTS) ; do \
+ ln -f $(DESTDIR)/usr/bin/xenstore $(DESTDIR)/usr/bin/$${c} ; \
+ done
$(INSTALL_DIR) $(DESTDIR)$(LIBDIR)
$(INSTALL_PROG) libxenstore.so.$(MAJOR).$(MINOR) $(DESTDIR)$(LIBDIR)
ln -sf libxenstore.so.$(MAJOR).$(MINOR) $(DESTDIR)$(LIBDIR)/libxenstore.so.$(MAJOR)
diff --git a/tools/xenstore/xenstore_client.c b/tools/xenstore/xenstore_client.c
index e4c18ae8e9..762a014c26 100644
--- a/tools/xenstore/xenstore_client.c
+++ b/tools/xenstore/xenstore_client.c
@@ -16,12 +16,31 @@
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
+#include <termios.h>
+#include <unistd.h>
#include <xs.h>
+#include <sys/ioctl.h>
+
+#define PATH_SEP '/'
+#define MAX_PATH_LEN 256
+
+#define MAX_PERMS 16
+
+enum mode {
+ MODE_unknown,
+ MODE_chmod,
+ MODE_exists,
+ MODE_list,
+ MODE_ls,
+ MODE_read,
+ MODE_rm,
+ MODE_write,
+};
+
static char *output_buf = NULL;
static int output_pos = 0;
-#if defined(CLIENT_read) || defined(CLIENT_list)
static int output_size = 0;
static void
@@ -47,26 +66,39 @@ output(const char *fmt, ...) {
va_end(ap);
output_pos += len;
}
-#endif
static void
-usage(const char *progname)
+usage(enum mode mode, int incl_mode, const char *progname)
{
-#if defined(CLIENT_read)
- errx(1, "Usage: %s [-h] [-p] [-s] key [...]", progname);
-#elif defined(CLIENT_write)
- errx(1, "Usage: %s [-h] [-s] key value [...]", progname);
-#elif defined(CLIENT_rm)
- errx(1, "Usage: %s [-h] [-s] [-t] key [...]", progname);
-#elif defined(CLIENT_exists) || defined(CLIENT_list)
- errx(1, "Usage: %s [-h] [-s] key [...]", progname);
-#elif defined(CLIENT_chmod)
- errx(1, "Usage: %s [-h] [-s] key <mode [modes...]>", progname);
-#endif
+ const char *mstr = NULL;
+
+ switch (mode) {
+ case MODE_unknown:
+ errx(1, "Usage: %s <mode> [-h] [...]", progname);
+ case MODE_read:
+ mstr = incl_mode ? "read " : "";
+ errx(1, "Usage: %s %s[-h] [-p] [-s] key [...]", progname, mstr);
+ case MODE_write:
+ mstr = incl_mode ? "write " : "";
+ errx(1, "Usage: %s %s[-h] [-s] key value [...]", progname, mstr);
+ case MODE_rm:
+ mstr = incl_mode ? "rm " : "";
+ errx(1, "Usage: %s %s[-h] [-s] [-t] key [...]", progname, mstr);
+ case MODE_exists:
+ mstr = incl_mode ? "exists " : "";
+ case MODE_list:
+ mstr = mstr ? : incl_mode ? "list " : "";
+ errx(1, "Usage: %s %s[-h] [-s] key [...]", progname, mstr);
+ case MODE_ls:
+ mstr = mstr ? : incl_mode ? "ls " : "";
+ errx(1, "Usage: %s %s[-h] [-s] [path]", progname, mstr);
+ case MODE_chmod:
+ mstr = incl_mode ? "chmod " : "";
+ errx(1, "Usage: %s %s[-h] [-s] key <mode [modes...]>", progname, mstr);
+ }
}
-#if defined(CLIENT_rm)
static int
do_rm(char *path, struct xs_handle *xsh, xs_transaction_t xth)
{
@@ -78,11 +110,111 @@ do_rm(char *path, struct xs_handle *xsh, xs_transaction_t xth)
return 1;
}
}
-#endif
-#if defined(CLIENT_chmod)
-#define PATH_SEP '/'
-#define MAX_PATH_LEN 256
+#define STRING_MAX XENSTORE_ABS_PATH_MAX+1024
+static int max_width = 80;
+static int desired_width = 60;
+static int show_whole_path = 0;
+
+#define TAG " = \"...\""
+#define TAG_LEN strlen(TAG)
+
+#define MIN(a, b) (((a) < (b))? (a) : (b))
+
+void do_ls(struct xs_handle *h, char *path, int cur_depth, int show_perms)
+{
+ static struct expanding_buffer ebuf;
+ char **e;
+ char newpath[STRING_MAX], *val;
+ int newpath_len;
+ int i;
+ unsigned int num, len;
+
+ e = xs_directory(h, XBT_NULL, path, &num);
+ if (e == NULL)
+ err(1, "xs_directory (%s)", path);
+
+ for (i = 0; i<num; i++) {
+ char buf[MAX_STRLEN(unsigned int)+1];
+ struct xs_permissions *perms;
+ unsigned int nperms;
+ int linewid;
+
+ /* Compose fullpath */
+ newpath_len = snprintf(newpath, sizeof(newpath), "%s%s%s", path,
+ path[strlen(path)-1] == '/' ? "" : "/",
+ e[i]);
+
+ /* Print indent and path basename */
+ linewid = 0;
+ if (show_whole_path) {
+ fputs(newpath, stdout);
+ } else {
+ for (; linewid<cur_depth; linewid++) {
+ putchar(' ');
+ }
+ linewid += printf("%.*s",
+ (int) (max_width - TAG_LEN - linewid), e[i]);
+ }
+
+ /* Fetch value */
+ if ( newpath_len < sizeof(newpath) ) {
+ val = xs_read(h, XBT_NULL, newpath, &len);
+ }
+ else {
+ /* Path was truncated and thus invalid */
+ val = NULL;
+ len = 0;
+ }
+
+ /* Print value */
+ if (val == NULL) {
+ printf(":\n");
+ }
+ else {
+ if (max_width < (linewid + len + TAG_LEN)) {
+ printf(" = \"%.*s\\...\"",
+ (int)(max_width - TAG_LEN - linewid),
+ sanitise_value(&ebuf, val, len));
+ }
+ else {
+ linewid += printf(" = \"%s\"",
+ sanitise_value(&ebuf, val, len));
+ if (show_perms) {
+ putchar(' ');
+ for (linewid++;
+ linewid < MIN(desired_width, max_width);
+ linewid++)
+ putchar((linewid & 1)? '.' : ' ');
+ }
+ }
+ }
+ free(val);
+
+ if (show_perms) {
+ perms = xs_get_permissions(h, XBT_NULL, newpath, &nperms);
+ if (perms == NULL) {
+ warn("\ncould not access permissions for %s", e[i]);
+ }
+ else {
+ int i;
+ fputs(" (", stdout);
+ for (i = 0; i < nperms; i++) {
+ if (i)
+ putchar(',');
+ xs_perm_to_string(perms+i, buf, sizeof(buf));
+ fputs(buf, stdout);
+ }
+ putchar(')');
+ }
+ }
+
+ putchar('\n');
+
+ do_ls(h, newpath, cur_depth+1, show_perms);
+ }
+ free(e);
+}
static void
do_chmod(char *path, struct xs_permissions *perms, int nperms, int upto,
@@ -130,145 +262,197 @@ do_chmod(char *path, struct xs_permissions *perms, int nperms, int upto,
}
}
}
-#endif
static int
-perform(int optind, int argc, char **argv, struct xs_handle *xsh,
+perform(enum mode mode, int optind, int argc, char **argv, struct xs_handle *xsh,
xs_transaction_t xth, int prefix, int tidy, int upto, int recurse)
{
- while (optind < argc) {
-#if defined(CLIENT_read)
- static struct expanding_buffer ebuf;
- unsigned len;
- char *val = xs_read(xsh, xth, argv[optind], &len);
- if (val == NULL) {
- warnx("couldn't read path %s", argv[optind]);
- return 1;
- }
- if (prefix)
- output("%s: ", argv[optind]);
- output("%s\n", sanitise_value(&ebuf, val, len));
- free(val);
- optind++;
-#elif defined(CLIENT_write)
- static struct expanding_buffer ebuf;
- char *val_spec = argv[optind + 1];
- unsigned len;
- expanding_buffer_ensure(&ebuf, strlen(val_spec)+1);
- unsanitise_value(ebuf.buf, &len, val_spec);
- if (!xs_write(xsh, xth, argv[optind], ebuf.buf, len)) {
- warnx("could not write path %s", argv[optind]);
- return 1;
+ switch (mode) {
+ case MODE_ls:
+ if (optind == argc)
+ {
+ optind=0;
+ argc=1;
+ argv[0] = "/";
}
- optind += 2;
-#elif defined(CLIENT_rm)
- /* Remove the specified path. If the tidy flag is set, then also
- remove any containing directories that are both empty and have no
- value attached, and repeat, recursing all the way up to the root if
- necessary.
- */
-
- char *slash, *path = argv[optind];
-
- if (tidy) {
- /* Copy path, because we can't modify argv because we will need it
- again if xs_transaction_end gives us EAGAIN. */
- char *p = malloc(strlen(path) + 1);
- strcpy(p, path);
- path = p;
-
- again:
- if (do_rm(path, xsh, xth)) {
+ break;
+ default:
+ break;
+ }
+
+ while (optind < argc) {
+ switch (mode) {
+ case MODE_unknown:
+ /* CANNOT BE REACHED */
+ errx(1, "invalid mode %d", mode);
+ case MODE_read: {
+ static struct expanding_buffer ebuf;
+ unsigned len;
+ char *val = xs_read(xsh, xth, argv[optind], &len);
+ if (val == NULL) {
+ warnx("couldn't read path %s", argv[optind]);
+ return 1;
+ }
+ if (prefix)
+ output("%s: ", argv[optind]);
+ output("%s\n", sanitise_value(&ebuf, val, len));
+ free(val);
+ optind++;
+ break;
+ }
+ case MODE_write: {
+ static struct expanding_buffer ebuf;
+ char *val_spec = argv[optind + 1];
+ unsigned len;
+ expanding_buffer_ensure(&ebuf, strlen(val_spec)+1);
+ unsanitise_value(ebuf.buf, &len, val_spec);
+ if (!xs_write(xsh, xth, argv[optind], ebuf.buf, len)) {
+ warnx("could not write path %s", argv[optind]);
return 1;
}
+ optind += 2;
+ } break;
+ case MODE_rm: {
+ /* Remove the specified path. If the tidy flag is set, then also
+ remove any containing directories that are both empty and have no
+ value attached, and repeat, recursing all the way up to the root if
+ necessary.
+ */
+
+ char *slash, *path = argv[optind];
+
+ if (tidy) {
+ /* Copy path, because we can't modify argv because we will need it
+ again if xs_transaction_end gives us EAGAIN. */
+ char *p = malloc(strlen(path) + 1);
+ strcpy(p, path);
+ path = p;
+
+ again:
+ if (do_rm(path, xsh, xth)) {
+ return 1;
+ }
- slash = strrchr(p, '/');
- if (slash) {
- char *val;
- unsigned len;
- *slash = '\0';
- val = xs_read(xsh, xth, p, &len);
- if (val && len == 0) {
- unsigned int num;
- char ** list = xs_directory(xsh, xth, p, &num);
-
- if (list && num == 0) {
- goto again;
+ slash = strrchr(p, '/');
+ if (slash) {
+ char *val;
+ unsigned len;
+ *slash = '\0';
+ val = xs_read(xsh, xth, p, &len);
+ if (val && len == 0) {
+ unsigned int num;
+ char ** list = xs_directory(xsh, xth, p, &num);
+
+ if (list && num == 0) {
+ goto again;
+ }
}
}
+
+ free(path);
+ }
+ else {
+ if (do_rm(path, xsh, xth)) {
+ return 1;
+ }
}
- free(path);
+ optind++;
+ break;
}
- else {
- if (do_rm(path, xsh, xth)) {
+ case MODE_exists: {
+ char *val = xs_read(xsh, xth, argv[optind], NULL);
+ if (val == NULL) {
return 1;
}
+ free(val);
+ optind++;
+ break;
}
-
- optind++;
-#elif defined(CLIENT_exists)
- char *val = xs_read(xsh, xth, argv[optind], NULL);
- if (val == NULL) {
- return 1;
- }
- free(val);
- optind++;
-#elif defined(CLIENT_list)
- unsigned int i, num;
- char **list = xs_directory(xsh, xth, argv[optind], &num);
- if (list == NULL) {
- warnx("could not list path %s", argv[optind]);
- return 1;
- }
- for (i = 0; i < num; i++) {
- if (prefix)
- output("%s/", argv[optind]);
- output("%s\n", list[i]);
- }
- free(list);
- optind++;
-#elif defined(CLIENT_chmod)
-#define MAX_PERMS 16
- struct xs_permissions perms[MAX_PERMS];
- int nperms = 0;
- /* save path pointer: */
- char *path = argv[optind++];
- for (; argv[optind]; optind++, nperms++)
- {
- if (MAX_PERMS <= nperms)
- errx(1, "Too many permissions specified. "
- "Maximum per invocation is %d.", MAX_PERMS);
-
- perms[nperms].id = atoi(argv[optind]+1);
-
- switch (argv[optind][0])
- {
- case 'n':
- perms[nperms].perms = XS_PERM_NONE;
- break;
- case 'r':
- perms[nperms].perms = XS_PERM_READ;
- break;
- case 'w':
- perms[nperms].perms = XS_PERM_WRITE;
- break;
- case 'b':
- perms[nperms].perms = XS_PERM_READ | XS_PERM_WRITE;
- break;
- default:
- errx(1, "Invalid permission specification: '%c'",
- argv[optind][0]);
- }
+ case MODE_list: {
+ unsigned int i, num;
+ char **list = xs_directory(xsh, xth, argv[optind], &num);
+ if (list == NULL) {
+ warnx("could not list path %s", argv[optind]);
+ return 1;
+ }
+ for (i = 0; i < num; i++) {
+ if (prefix)
+ output("%s/", argv[optind]);
+ output("%s\n", list[i]);
+ }
+ free(list);
+ optind++;
+ break;
}
+ case MODE_ls: {
+ do_ls(xsh, argv[optind], 0, prefix);
+ optind++;
+ break;
+ }
+ case MODE_chmod: {
+ struct xs_permissions perms[MAX_PERMS];
+ int nperms = 0;
+ /* save path pointer: */
+ char *path = argv[optind++];
+ for (; argv[optind]; optind++, nperms++)
+ {
+ if (MAX_PERMS <= nperms)
+ errx(1, "Too many permissions specified. "
+ "Maximum per invocation is %d.", MAX_PERMS);
+
+ perms[nperms].id = atoi(argv[optind]+1);
+
+ switch (argv[optind][0])
+ {
+ case 'n':
+ perms[nperms].perms = XS_PERM_NONE;
+ break;
+ case 'r':
+ perms[nperms].perms = XS_PERM_READ;
+ break;
+ case 'w':
+ perms[nperms].perms = XS_PERM_WRITE;
+ break;
+ case 'b':
+ perms[nperms].perms = XS_PERM_READ | XS_PERM_WRITE;
+ break;
+ default:
+ errx(1, "Invalid permission specification: '%c'",
+ argv[optind][0]);
+ }
+ }
- do_chmod(path, perms, nperms, upto, recurse, xsh, xth);
-#endif
+ do_chmod(path, perms, nperms, upto, recurse, xsh, xth);
+ break;
+ }
+ }
}
return 0;
}
+static enum mode lookup_mode(const char *m)
+{
+ if (strcmp(m, "read") == 0)
+ return MODE_read;
+ else if (strcmp(m, "chmod") == 0)
+ return MODE_chmod;
+ else if (strcmp(m, "exists") == 0)
+ return MODE_exists;
+ else if (strcmp(m, "list") == 0)
+ return MODE_list;
+ else if (strcmp(m, "ls") == 0)
+ return MODE_ls;
+ else if (strcmp(m, "rm") == 0)
+ return MODE_rm;
+ else if (strcmp(m, "write") == 0)
+ return MODE_write;
+ else if (strcmp(m, "read") == 0)
+ return MODE_read;
+ else
+ errx(1, "unknown mode %s\n", m);
+}
int
main(int argc, char **argv)
@@ -281,92 +465,139 @@ main(int argc, char **argv)
int upto = 0;
int recurse = 0;
int transaction;
+ struct winsize ws;
+ enum mode mode;
+
+ const char *_command = strrchr(argv[0], '/');
+ const char *command = _command ? &_command[1] : argv[0];
+ int switch_argv = -1; /* which element of argv did we switch on */
+
+ if (strncmp(command, "xenstore-", strlen("xenstore-")) == 0)
+ {
+ switch_argv = 0;
+ command = command + strlen("xenstore-");
+ }
+ else if (argc < 2)
+ usage(MODE_unknown, 0, argv[0]);
+ else
+ {
+ command = argv[1];
+ switch_argv = 1;
+ }
+
+ mode = lookup_mode(command);
while (1) {
int c, index = 0;
static struct option long_options[] = {
- {"help", 0, 0, 'h'},
- {"socket", 0, 0, 's'},
-#if defined(CLIENT_read) || defined(CLIENT_list)
- {"prefix", 0, 0, 'p'},
-#elif defined(CLIENT_rm)
- {"tidy", 0, 0, 't'},
-#elif defined(CLIENT_chmod)
- {"upto", 0, 0, 'u'},
- {"recurse", 0, 0, 'r'},
-#endif
+ {"help", 0, 0, 'h'},
+ {"socket", 0, 0, 's'},
+ {"prefix", 0, 0, 'p'}, /* MODE_read || MODE_list */
+ {"tidy", 0, 0, 't'}, /* MODE_rm */
+ {"upto", 0, 0, 'u'}, /* MODE_chmod */
+ {"recurse", 0, 0, 'r'}, /* MODE_chmod */
{0, 0, 0, 0}
};
- c = getopt_long(argc, argv, "hs"
-#if defined(CLIENT_read) || defined(CLIENT_list)
- "p"
-#elif defined(CLIENT_rm)
- "t"
-#elif defined(CLIENT_chmod)
- "ur"
-#endif
- , long_options, &index);
+ c = getopt_long(argc - switch_argv, argv + switch_argv, "fhsptur",
+ long_options, &index);
if (c == -1)
break;
switch (c) {
case 'h':
- usage(argv[0]);
+ usage(mode, switch_argv, argv[0]);
/* NOTREACHED */
+ case 'f':
+ if ( mode == MODE_read || mode == MODE_list || mode == MODE_ls ) {
+ max_width = INT_MAX/2;
+ desired_width = 0;
+ show_whole_path = 1;
+ } else {
+ usage(mode, switch_argv, argv[0]);
+ }
+ break;
case 's':
socket = 1;
break;
-#if defined(CLIENT_read) || defined(CLIENT_list)
case 'p':
- prefix = 1;
+ if ( mode == MODE_read || mode == MODE_list || mode == MODE_ls )
+ prefix = 1;
+ else
+ usage(mode, switch_argv, argv[0]);
break;
-#elif defined(CLIENT_rm)
case 't':
- tidy = 1;
+ if ( mode == MODE_rm )
+ tidy = 1;
+ else
+ usage(mode, switch_argv, argv[0]);
break;
-#elif defined(CLIENT_chmod)
case 'u':
- upto = 1;
+ if ( mode == MODE_chmod )
+ upto = 1;
+ else
+ usage(mode, switch_argv, argv[0]);
break;
case 'r':
- recurse = 1;
+ if ( mode == MODE_chmod )
+ recurse = 1;
+ else
+ usage(mode, switch_argv, argv[0]);
break;
-#endif
}
}
- if (optind == argc) {
- usage(argv[0]);
- /* NOTREACHED */
+ switch (mode) {
+ case MODE_ls:
+ break;
+ case MODE_write:
+ if ((argc - switch_argv - optind) % 2 == 1) {
+ usage(mode, switch_argv, argv[0]);
+ /* NOTREACHED */
+ }
+ /* DROP-THRU */
+ default:
+ if (optind == argc - switch_argv) {
+ usage(mode, switch_argv, argv[0]);
+ /* NOTREACHED */
+ }
}
-#if defined(CLIENT_write)
- if ((argc - optind) % 2 == 1) {
- usage(argv[0]);
- /* NOTREACHED */
+
+ switch (mode) {
+ case MODE_read:
+ transaction = (argc - switch_argv - optind) > 1;
+ break;
+ case MODE_write:
+ transaction = (argc - switch_argv - optind) > 2;
+ break;
+ case MODE_ls:
+ transaction = 0;
+ break;
+ default:
+ transaction = 1;
+ break;
}
-#endif
-#if defined(CLIENT_read)
- transaction = (argc - optind) > 1;
-#elif defined(CLIENT_write)
- transaction = (argc - optind) > 2;
-#else
- transaction = 1;
-#endif
+ if ( mode == MODE_ls )
+ {
+ memset(&ws, 0, sizeof(ws));
+ ret = ioctl(STDOUT_FILENO, TIOCGWINSZ, &ws);
+ if (!ret)
+ max_width = ws.ws_col - 2;
+ }
xsh = socket ? xs_daemon_open() : xs_domain_open();
if (xsh == NULL)
err(1, socket ? "xs_daemon_open" : "xs_domain_open");
- again:
+again:
if (transaction) {
xth = xs_transaction_start(xsh);
if (xth == XBT_NULL)
errx(1, "couldn't start transaction");
}
- ret = perform(optind, argc, argv, xsh, xth, prefix, tidy, upto, recurse);
+ ret = perform(mode, optind, argc - switch_argv, argv + switch_argv, xsh, xth, prefix, tidy, upto, recurse);
if (transaction && !xs_transaction_end(xsh, xth, ret)) {
if (ret == 0 && errno == EAGAIN) {
diff --git a/tools/xenstore/xenstored_core.c b/tools/xenstore/xenstored_core.c
index a643f2d969..657322ab8c 100644
--- a/tools/xenstore/xenstored_core.c
+++ b/tools/xenstore/xenstored_core.c
@@ -722,7 +722,7 @@ char *canonicalize(struct connection *conn, const char *node)
{
const char *prefix;
- if (!node || strstarts(node, "/"))
+ if (!node || (node[0] == '/') || (node[0] == '@'))
return (char *)node;
prefix = get_implicit_path(conn);
if (prefix)
diff --git a/tools/xenstore/xenstored_solaris.c b/tools/xenstore/xenstored_solaris.c
index ef6b51533c..06052d124a 100644
--- a/tools/xenstore/xenstored_solaris.c
+++ b/tools/xenstore/xenstored_solaris.c
@@ -14,6 +14,7 @@
#include <fcntl.h>
#include <unistd.h>
#include <stdlib.h>
+#include <stdarg.h>
#include <sys/mman.h>
#include <strings.h>
#include <ucred.h>
diff --git a/tools/xenstore/xenstored_watch.c b/tools/xenstore/xenstored_watch.c
index 8e3e4f2b61..16d30899d4 100644
--- a/tools/xenstore/xenstored_watch.c
+++ b/tools/xenstore/xenstored_watch.c
@@ -183,7 +183,7 @@ void do_unwatch(struct connection *conn, struct buffered_data *in)
return;
}
- node = strstarts(vec[0], "@") ? vec[0] : canonicalize(conn, vec[0]);
+ node = canonicalize(conn, vec[0]);
list_for_each_entry(watch, &conn->watches, list) {
if (streq(watch->node, node) && streq(watch->token, vec[1])) {
list_del(&watch->list);
diff --git a/tools/xenstore/xs.c b/tools/xenstore/xs.c
index dbbf8ef394..94db1ce45e 100644
--- a/tools/xenstore/xs.c
+++ b/tools/xenstore/xs.c
@@ -32,7 +32,6 @@
#include <signal.h>
#include <stdint.h>
#include <errno.h>
-#include <pthread.h>
#include "xs.h"
#include "list.h"
#include "utils.h"
@@ -43,6 +42,10 @@ struct xs_stored_msg {
char *body;
};
+#ifdef USE_PTHREAD
+
+#include <pthread.h>
+
struct xs_handle {
/* Communications channel to xenstore daemon. */
int fd;
@@ -78,14 +81,37 @@ struct xs_handle {
pthread_mutex_t request_mutex;
};
-static int read_message(struct xs_handle *h);
+#define mutex_lock(m) pthread_mutex_lock(m)
+#define mutex_unlock(m) pthread_mutex_unlock(m)
+#define condvar_signal(c) pthread_cond_signal(c)
+#define condvar_wait(c,m,hnd) pthread_cond_wait(c,m)
+
static void *read_thread(void *arg);
+#else /* !defined(USE_PTHREAD) */
+
+struct xs_handle {
+ int fd;
+ struct list_head reply_list;
+ struct list_head watch_list;
+ /* Clients can select() on this pipe to wait for a watch to fire. */
+ int watch_pipe[2];
+};
+
+#define mutex_lock(m) ((void)0)
+#define mutex_unlock(m) ((void)0)
+#define condvar_signal(c) ((void)0)
+#define condvar_wait(c,m,hnd) read_message(hnd)
+
+#endif
+
+static int read_message(struct xs_handle *h);
+
int xs_fileno(struct xs_handle *h)
{
char c = 0;
- pthread_mutex_lock(&h->watch_mutex);
+ mutex_lock(&h->watch_mutex);
if ((h->watch_pipe[0] == -1) && (pipe(h->watch_pipe) != -1)) {
/* Kick things off if the watch list is already non-empty. */
@@ -94,7 +120,7 @@ int xs_fileno(struct xs_handle *h)
continue;
}
- pthread_mutex_unlock(&h->watch_mutex);
+ mutex_unlock(&h->watch_mutex);
return h->watch_pipe[0];
}
@@ -163,18 +189,21 @@ static struct xs_handle *get_handle(const char *connect_to)
h->fd = fd;
+ INIT_LIST_HEAD(&h->reply_list);
+ INIT_LIST_HEAD(&h->watch_list);
+
/* Watch pipe is allocated on demand in xs_fileno(). */
h->watch_pipe[0] = h->watch_pipe[1] = -1;
- INIT_LIST_HEAD(&h->watch_list);
+#ifdef USE_PTHREAD
pthread_mutex_init(&h->watch_mutex, NULL);
pthread_cond_init(&h->watch_condvar, NULL);
- INIT_LIST_HEAD(&h->reply_list);
pthread_mutex_init(&h->reply_mutex, NULL);
pthread_cond_init(&h->reply_condvar, NULL);
pthread_mutex_init(&h->request_mutex, NULL);
+#endif
return h;
}
@@ -198,15 +227,17 @@ void xs_daemon_close(struct xs_handle *h)
{
struct xs_stored_msg *msg, *tmsg;
- pthread_mutex_lock(&h->request_mutex);
- pthread_mutex_lock(&h->reply_mutex);
- pthread_mutex_lock(&h->watch_mutex);
+ mutex_lock(&h->request_mutex);
+ mutex_lock(&h->reply_mutex);
+ mutex_lock(&h->watch_mutex);
+#ifdef USE_PTHREAD
if (h->read_thr_exists) {
/* XXX FIXME: May leak an unpublished message buffer. */
pthread_cancel(h->read_thr);
pthread_join(h->read_thr, NULL);
}
+#endif
list_for_each_entry_safe(msg, tmsg, &h->reply_list, list) {
free(msg->body);
@@ -218,9 +249,9 @@ void xs_daemon_close(struct xs_handle *h)
free(msg);
}
- pthread_mutex_unlock(&h->request_mutex);
- pthread_mutex_unlock(&h->reply_mutex);
- pthread_mutex_unlock(&h->watch_mutex);
+ mutex_unlock(&h->request_mutex);
+ mutex_unlock(&h->reply_mutex);
+ mutex_unlock(&h->watch_mutex);
if (h->watch_pipe[0] != -1) {
close(h->watch_pipe[0]);
@@ -277,17 +308,19 @@ static void *read_reply(
struct xs_stored_msg *msg;
char *body;
+#ifdef USE_PTHREAD
/* Read from comms channel ourselves if there is no reader thread. */
if (!h->read_thr_exists && (read_message(h) == -1))
return NULL;
+#endif
- pthread_mutex_lock(&h->reply_mutex);
+ mutex_lock(&h->reply_mutex);
while (list_empty(&h->reply_list))
- pthread_cond_wait(&h->reply_condvar, &h->reply_mutex);
+ condvar_wait(&h->reply_condvar, &h->reply_mutex, h);
msg = list_top(&h->reply_list, struct xs_stored_msg, list);
list_del(&msg->list);
assert(list_empty(&h->reply_list));
- pthread_mutex_unlock(&h->reply_mutex);
+ mutex_unlock(&h->reply_mutex);
*type = msg->hdr.type;
if (len)
@@ -329,7 +362,7 @@ static void *xs_talkv(struct xs_handle *h, xs_transaction_t t,
ignorepipe.sa_flags = 0;
sigaction(SIGPIPE, &ignorepipe, &oldact);
- pthread_mutex_lock(&h->request_mutex);
+ mutex_lock(&h->request_mutex);
if (!xs_write_all(h->fd, &msg, sizeof(msg)))
goto fail;
@@ -342,7 +375,7 @@ static void *xs_talkv(struct xs_handle *h, xs_transaction_t t,
if (!ret)
goto fail;
- pthread_mutex_unlock(&h->request_mutex);
+ mutex_unlock(&h->request_mutex);
sigaction(SIGPIPE, &oldact, NULL);
if (msg.type == XS_ERROR) {
@@ -362,7 +395,7 @@ static void *xs_talkv(struct xs_handle *h, xs_transaction_t t,
fail:
/* We're in a bad state, so close fd. */
saved_errno = errno;
- pthread_mutex_unlock(&h->request_mutex);
+ mutex_unlock(&h->request_mutex);
sigaction(SIGPIPE, &oldact, NULL);
close_fd:
close(h->fd);
@@ -556,16 +589,18 @@ bool xs_watch(struct xs_handle *h, const char *path, const char *token)
{
struct iovec iov[2];
+#ifdef USE_PTHREAD
/* We dynamically create a reader thread on demand. */
- pthread_mutex_lock(&h->request_mutex);
+ mutex_lock(&h->request_mutex);
if (!h->read_thr_exists) {
if (pthread_create(&h->read_thr, NULL, read_thread, h) != 0) {
- pthread_mutex_unlock(&h->request_mutex);
+ mutex_unlock(&h->request_mutex);
return false;
}
h->read_thr_exists = 1;
}
- pthread_mutex_unlock(&h->request_mutex);
+ mutex_unlock(&h->request_mutex);
+#endif
iov[0].iov_base = (void *)path;
iov[0].iov_len = strlen(path) + 1;
@@ -586,11 +621,11 @@ char **xs_read_watch(struct xs_handle *h, unsigned int *num)
char **ret, *strings, c = 0;
unsigned int num_strings, i;
- pthread_mutex_lock(&h->watch_mutex);
+ mutex_lock(&h->watch_mutex);
/* Wait on the condition variable for a watch to fire. */
while (list_empty(&h->watch_list))
- pthread_cond_wait(&h->watch_condvar, &h->watch_mutex);
+ condvar_wait(&h->watch_condvar, &h->watch_mutex, h);
msg = list_top(&h->watch_list, struct xs_stored_msg, list);
list_del(&msg->list);
@@ -599,7 +634,7 @@ char **xs_read_watch(struct xs_handle *h, unsigned int *num)
while (read(h->watch_pipe[0], &c, 1) != 1)
continue;
- pthread_mutex_unlock(&h->watch_mutex);
+ mutex_unlock(&h->watch_mutex);
assert(msg->hdr.type == XS_WATCH_EVENT);
@@ -801,7 +836,7 @@ static int read_message(struct xs_handle *h)
body[msg->hdr.len] = '\0';
if (msg->hdr.type == XS_WATCH_EVENT) {
- pthread_mutex_lock(&h->watch_mutex);
+ mutex_lock(&h->watch_mutex);
/* Kick users out of their select() loop. */
if (list_empty(&h->watch_list) &&
@@ -810,22 +845,23 @@ static int read_message(struct xs_handle *h)
continue;
list_add_tail(&msg->list, &h->watch_list);
- pthread_cond_signal(&h->watch_condvar);
- pthread_mutex_unlock(&h->watch_mutex);
+ condvar_signal(&h->watch_condvar);
+
+ mutex_unlock(&h->watch_mutex);
} else {
- pthread_mutex_lock(&h->reply_mutex);
+ mutex_lock(&h->reply_mutex);
/* There should only ever be one response pending! */
if (!list_empty(&h->reply_list)) {
- pthread_mutex_unlock(&h->reply_mutex);
+ mutex_unlock(&h->reply_mutex);
goto error;
}
list_add_tail(&msg->list, &h->reply_list);
- pthread_cond_signal(&h->reply_condvar);
+ condvar_signal(&h->reply_condvar);
- pthread_mutex_unlock(&h->reply_mutex);
+ mutex_unlock(&h->reply_mutex);
}
return 0;
@@ -838,6 +874,7 @@ static int read_message(struct xs_handle *h)
return -1;
}
+#ifdef USE_PTHREAD
static void *read_thread(void *arg)
{
struct xs_handle *h = arg;
@@ -847,6 +884,7 @@ static void *read_thread(void *arg)
return NULL;
}
+#endif
/*
* Local variables:
diff --git a/tools/xenstore/xsls.c b/tools/xenstore/xsls.c
deleted file mode 100644
index 337e87cc5b..0000000000
--- a/tools/xenstore/xsls.c
+++ /dev/null
@@ -1,171 +0,0 @@
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <err.h>
-#include <xs.h>
-#include <getopt.h>
-#include <unistd.h>
-#include <sys/ioctl.h>
-#include <termios.h>
-
-#define STRING_MAX XENSTORE_ABS_PATH_MAX+1024
-static int max_width = 80;
-static int desired_width = 60;
-static int show_whole_path = 0;
-
-#define TAG " = \"...\""
-#define TAG_LEN strlen(TAG)
-
-#define MIN(a, b) (((a) < (b))? (a) : (b))
-
-void print_dir(struct xs_handle *h, char *path, int cur_depth, int show_perms)
-{
- static struct expanding_buffer ebuf;
- char **e;
- char newpath[STRING_MAX], *val;
- int newpath_len;
- int i;
- unsigned int num, len;
-
- e = xs_directory(h, XBT_NULL, path, &num);
- if (e == NULL)
- err(1, "xs_directory (%s)", path);
-
- for (i = 0; i<num; i++) {
- char buf[MAX_STRLEN(unsigned int)+1];
- struct xs_permissions *perms;
- unsigned int nperms;
- int linewid;
-
- /* Compose fullpath */
- newpath_len = snprintf(newpath, sizeof(newpath), "%s%s%s", path,
- path[strlen(path)-1] == '/' ? "" : "/",
- e[i]);
-
- /* Print indent and path basename */
- linewid = 0;
- if (show_whole_path) {
- fputs(newpath, stdout);
- } else {
- for (; linewid<cur_depth; linewid++) {
- putchar(' ');
- }
- linewid += printf("%.*s",
- (int) (max_width - TAG_LEN - linewid), e[i]);
- }
-
- /* Fetch value */
- if ( newpath_len < sizeof(newpath) ) {
- val = xs_read(h, XBT_NULL, newpath, &len);
- }
- else {
- /* Path was truncated and thus invalid */
- val = NULL;
- len = 0;
- }
-
- /* Print value */
- if (val == NULL) {
- printf(":\n");
- }
- else {
- if (max_width < (linewid + len + TAG_LEN)) {
- printf(" = \"%.*s\\...\"",
- (int)(max_width - TAG_LEN - linewid),
- sanitise_value(&ebuf, val, len));
- }
- else {
- linewid += printf(" = \"%s\"",
- sanitise_value(&ebuf, val, len));
- if (show_perms) {
- putchar(' ');
- for (linewid++;
- linewid < MIN(desired_width, max_width);
- linewid++)
- putchar((linewid & 1)? '.' : ' ');
- }
- }
- }
- free(val);
-
- if (show_perms) {
- perms = xs_get_permissions(h, XBT_NULL, newpath, &nperms);
- if (perms == NULL) {
- warn("\ncould not access permissions for %s", e[i]);
- }
- else {
- int i;
- fputs(" (", stdout);
- for (i = 0; i < nperms; i++) {
- if (i)
- putchar(',');
- xs_perm_to_string(perms+i, buf, sizeof(buf));
- fputs(buf, stdout);
- }
- putchar(')');
- }
- }
-
- putchar('\n');
-
- print_dir(h, newpath, cur_depth+1, show_perms);
- }
- free(e);
-}
-
-void usage(int argc, char *argv[])
-{
- fprintf(stderr, "Usage: %s [-w] [-p] [-f] [-s] [path]\n", argv[0]);
-}
-
-int main(int argc, char *argv[])
-{
- struct winsize ws;
- int ret, c, socket = 0, show_perm = 0;
- struct xs_handle *xsh;
-
-#define PAD 2
-
- memset(&ws, 0, sizeof(ws));
- ret = ioctl(STDOUT_FILENO, TIOCGWINSZ, &ws);
- if (!ret)
- max_width = ws.ws_col - PAD;
-
- while (0 < (c = getopt(argc, argv, "pswf"))) {
- switch (c) {
- case 'w':
- max_width= STRING_MAX - PAD;
- desired_width = 0;
- break;
- case 'p':
- show_perm = 1;
- break;
- case 's':
- socket = 1;
- break;
- case 'f':
- max_width = INT_MAX/2;
- desired_width = 0;
- show_whole_path = 1;
- break;
- case ':':
- case '?':
- default:
- usage(argc, argv);
- return 0;
- }
- }
-
- /* Adjust the width here to avoid argument order dependency */
- if ( show_perm ) {
- max_width -= 16;
- }
-
- xsh = socket ? xs_daemon_open() : xs_domain_open();
- if (xsh == NULL)
- err(1, socket ? "xs_daemon_open" : "xs_domain_open");
-
- print_dir(xsh, (argc - optind) == 1 ? argv[optind] : "/", 0, show_perm);
-
- return 0;
-}
diff --git a/xen/arch/ia64/linux-xen/sn/kernel/irq.c b/xen/arch/ia64/linux-xen/sn/kernel/irq.c
index 3feeccbd94..acdc996b4e 100644
--- a/xen/arch/ia64/linux-xen/sn/kernel/irq.c
+++ b/xen/arch/ia64/linux-xen/sn/kernel/irq.c
@@ -12,7 +12,7 @@
#include <linux/spinlock.h>
#include <linux/init.h>
#ifdef XEN
-#include <linux/pci.h>
+#include <linux/linux-pci.h>
#include <asm/hw_irq.h>
#endif
#include <asm/sn/addrs.h>
diff --git a/xen/arch/ia64/vmx/vmx_hypercall.c b/xen/arch/ia64/vmx/vmx_hypercall.c
index 97c8d5f990..84510d7b78 100644
--- a/xen/arch/ia64/vmx/vmx_hypercall.c
+++ b/xen/arch/ia64/vmx/vmx_hypercall.c
@@ -165,6 +165,11 @@ do_hvm_op(unsigned long op, XEN_GUEST_HANDLE(void) arg)
iorp = &d->arch.hvm_domain.buf_pioreq;
rc = vmx_set_ioreq_page(d, iorp, a.value);
break;
+ case HVM_PARAM_DM_DOMAIN:
+ if (a.value == DOMID_SELF)
+ a.value = current->domain->domain_id;
+ rc = a.value ? -EINVAL : 0; /* no stub domain support */
+ break;
default:
/* nothing */
break;
diff --git a/xen/arch/ia64/xen/mm.c b/xen/arch/ia64/xen/mm.c
index d51912fc21..5c8c6dd8de 100644
--- a/xen/arch/ia64/xen/mm.c
+++ b/xen/arch/ia64/xen/mm.c
@@ -820,7 +820,7 @@ __assign_new_domain_page(struct domain *d, unsigned long mpaddr,
BUG_ON(!pte_none(*pte));
- p = alloc_domheap_page(d);
+ p = alloc_domheap_page(d, 0);
if (unlikely(!p)) {
printk("assign_new_domain_page: Can't alloc!!!! Aaaargh!\n");
return(p);
@@ -2315,7 +2315,7 @@ steal_page(struct domain *d, struct page_info *page, unsigned int memflags)
unsigned long new_mfn;
int ret;
- new = alloc_domheap_page(d);
+ new = alloc_domheap_page(d, 0);
if (new == NULL) {
gdprintk(XENLOG_INFO, "alloc_domheap_page() failed\n");
return -1;
@@ -2602,7 +2602,7 @@ void *pgtable_quicklist_alloc(void)
BUG_ON(dom_p2m == NULL);
if (!opt_p2m_xenheap) {
- struct page_info *page = alloc_domheap_page(dom_p2m);
+ struct page_info *page = alloc_domheap_page(dom_p2m, 0);
if (page == NULL)
return NULL;
p = page_to_virt(page);
@@ -2827,7 +2827,7 @@ arch_memory_op(int op, XEN_GUEST_HANDLE(void) arg)
return -EINVAL;
}
- LOCK_BIGLOCK(d);
+ domain_lock(d);
/* Check remapping necessity */
prev_mfn = gmfn_to_mfn(d, xatp.gpfn);
@@ -2853,7 +2853,7 @@ arch_memory_op(int op, XEN_GUEST_HANDLE(void) arg)
guest_physmap_add_page(d, xatp.gpfn, mfn);
out:
- UNLOCK_BIGLOCK(d);
+ domain_unlock(d);
rcu_unlock_domain(d);
diff --git a/xen/arch/ia64/xen/tlb_track.c b/xen/arch/ia64/xen/tlb_track.c
index 50ef084818..d9e30a2db5 100644
--- a/xen/arch/ia64/xen/tlb_track.c
+++ b/xen/arch/ia64/xen/tlb_track.c
@@ -48,7 +48,7 @@ tlb_track_allocate_entries(struct tlb_track* tlb_track)
__func__, tlb_track->num_entries, tlb_track->limit);
return -ENOMEM;
}
- entry_page = alloc_domheap_page(NULL);
+ entry_page = alloc_domheap_page(NULL, 0);
if (entry_page == NULL) {
dprintk(XENLOG_WARNING,
"%s: domheap page failed. num_entries %d limit %d\n",
@@ -84,7 +84,7 @@ tlb_track_create(struct domain* d)
if (tlb_track == NULL)
goto out;
- hash_page = alloc_domheap_page(NULL);
+ hash_page = alloc_domheap_page(NULL, 0);
if (hash_page == NULL)
goto out;
diff --git a/xen/arch/ia64/xen/xensetup.c b/xen/arch/ia64/xen/xensetup.c
index c3aa6bfb46..d6aa79c246 100644
--- a/xen/arch/ia64/xen/xensetup.c
+++ b/xen/arch/ia64/xen/xensetup.c
@@ -576,6 +576,8 @@ skip_move:
end_boot_allocator();
+ softirq_init();
+
late_setup_arch(&cmdline);
scheduler_init();
diff --git a/xen/arch/x86/Makefile b/xen/arch/x86/Makefile
index 086a7b530f..334a996eb6 100644
--- a/xen/arch/x86/Makefile
+++ b/xen/arch/x86/Makefile
@@ -31,6 +31,7 @@ obj-y += mm.o
obj-y += mpparse.o
obj-y += nmi.o
obj-y += numa.o
+obj-y += pci.o
obj-y += physdev.o
obj-y += rwlock.o
obj-y += setup.o
diff --git a/xen/arch/x86/acpi/boot.c b/xen/arch/x86/acpi/boot.c
index cfe87671e9..9a17d61e3b 100644
--- a/xen/arch/x86/acpi/boot.c
+++ b/xen/arch/x86/acpi/boot.c
@@ -374,6 +374,18 @@ extern u32 pmtmr_ioport;
#endif
#ifdef CONFIG_ACPI_SLEEP
+#define acpi_fadt_copy_address(dst, src, len) do { \
+ if (fadt->header.revision >= FADT2_REVISION_ID) \
+ acpi_sinfo.dst##_blk = fadt->x##src##_block; \
+ if (!acpi_sinfo.dst##_blk.address) { \
+ acpi_sinfo.dst##_blk.address = fadt->src##_block; \
+ acpi_sinfo.dst##_blk.space_id = ACPI_ADR_SPACE_SYSTEM_IO; \
+ acpi_sinfo.dst##_blk.bit_width = fadt->len##_length << 3; \
+ acpi_sinfo.dst##_blk.bit_offset = 0; \
+ acpi_sinfo.dst##_blk.access_width = 0; \
+ } \
+} while (0)
+
/* Get pm1x_cnt and pm1x_evt information for ACPI sleep */
static void __init
acpi_fadt_parse_sleep_info(struct acpi_table_fadt *fadt)
@@ -388,37 +400,18 @@ acpi_fadt_parse_sleep_info(struct acpi_table_fadt *fadt)
goto bad;
rsdp = __va(rsdp_phys);
- if (fadt->header.revision >= FADT2_REVISION_ID) {
- memcpy(&acpi_sinfo.pm1a_cnt_blk, &fadt->xpm1a_control_block,
- sizeof(struct acpi_generic_address));
- memcpy(&acpi_sinfo.pm1b_cnt_blk, &fadt->xpm1b_control_block,
- sizeof(struct acpi_generic_address));
- memcpy(&acpi_sinfo.pm1a_evt_blk, &fadt->xpm1a_event_block,
- sizeof(struct acpi_generic_address));
- memcpy(&acpi_sinfo.pm1b_evt_blk, &fadt->xpm1b_event_block,
- sizeof(struct acpi_generic_address));
- } else {
- acpi_sinfo.pm1a_cnt_blk.address = fadt->pm1a_control_block;
- acpi_sinfo.pm1b_cnt_blk.address = fadt->pm1b_control_block;
- acpi_sinfo.pm1a_evt_blk.address = fadt->pm1a_event_block;
- acpi_sinfo.pm1b_evt_blk.address = fadt->pm1b_event_block;
- acpi_sinfo.pm1a_cnt_blk.space_id = ACPI_ADR_SPACE_SYSTEM_IO;
- acpi_sinfo.pm1b_cnt_blk.space_id = ACPI_ADR_SPACE_SYSTEM_IO;
- acpi_sinfo.pm1a_evt_blk.space_id = ACPI_ADR_SPACE_SYSTEM_IO;
- acpi_sinfo.pm1b_evt_blk.space_id = ACPI_ADR_SPACE_SYSTEM_IO;
- acpi_sinfo.pm1a_cnt_blk.bit_width = 16;
- acpi_sinfo.pm1b_cnt_blk.bit_width = 16;
- acpi_sinfo.pm1a_evt_blk.bit_width = 16;
- acpi_sinfo.pm1b_evt_blk.bit_width = 16;
- acpi_sinfo.pm1a_cnt_blk.bit_offset = 0;
- acpi_sinfo.pm1b_cnt_blk.bit_offset = 0;
- acpi_sinfo.pm1a_evt_blk.bit_offset = 0;
- acpi_sinfo.pm1b_evt_blk.bit_offset = 0;
- acpi_sinfo.pm1a_cnt_blk.access_width = 0;
- acpi_sinfo.pm1b_cnt_blk.access_width = 0;
- acpi_sinfo.pm1a_evt_blk.access_width = 0;
- acpi_sinfo.pm1b_evt_blk.access_width = 0;
- }
+ acpi_fadt_copy_address(pm1a_cnt, pm1a_control, pm1_control);
+ acpi_fadt_copy_address(pm1b_cnt, pm1b_control, pm1_control);
+ acpi_fadt_copy_address(pm1a_evt, pm1a_event, pm1_event);
+ acpi_fadt_copy_address(pm1b_evt, pm1b_event, pm1_event);
+
+ printk(KERN_INFO PREFIX
+ "ACPI SLEEP INFO: pm1x_cnt[%"PRIx64",%"PRIx64"], "
+ "pm1x_evt[%"PRIx64",%"PRIx64"]\n",
+ acpi_sinfo.pm1a_cnt_blk.address,
+ acpi_sinfo.pm1b_cnt_blk.address,
+ acpi_sinfo.pm1a_evt_blk.address,
+ acpi_sinfo.pm1b_evt_blk.address);
/* Now FACS... */
if (fadt->header.revision >= FADT2_REVISION_ID)
@@ -461,13 +454,6 @@ acpi_fadt_parse_sleep_info(struct acpi_table_fadt *fadt)
}
printk(KERN_INFO PREFIX
- "ACPI SLEEP INFO: pm1x_cnt[%"PRIx64",%"PRIx64"], "
- "pm1x_evt[%"PRIx64",%"PRIx64"]\n",
- acpi_sinfo.pm1a_cnt_blk.address,
- acpi_sinfo.pm1b_cnt_blk.address,
- acpi_sinfo.pm1a_evt_blk.address,
- acpi_sinfo.pm1b_evt_blk.address);
- printk(KERN_INFO PREFIX
" wakeup_vec[%"PRIx64"], vec_size[%x]\n",
acpi_sinfo.wakeup_vector, acpi_sinfo.vector_width);
return;
diff --git a/xen/arch/x86/cpu/amd.c b/xen/arch/x86/cpu/amd.c
index 909a73f3fa..f0253152bc 100644
--- a/xen/arch/x86/cpu/amd.c
+++ b/xen/arch/x86/cpu/amd.c
@@ -3,6 +3,7 @@
#include <xen/bitops.h>
#include <xen/mm.h>
#include <xen/smp.h>
+#include <xen/pci.h>
#include <asm/io.h>
#include <asm/msr.h>
#include <asm/processor.h>
@@ -66,19 +67,6 @@ static int c1_ramping_may_cause_clock_drift(struct cpuinfo_x86 *c)
return 1;
}
-/* PCI access functions. Should be safe to use 0xcf8/0xcfc port accesses here. */
-static u8 pci_read_byte(u32 bus, u32 dev, u32 fn, u32 reg)
-{
- outl((1U<<31) | (bus << 16) | (dev << 11) | (fn << 8) | (reg & ~3), 0xcf8);
- return inb(0xcfc + (reg & 3));
-}
-
-static void pci_write_byte(u32 bus, u32 dev, u32 fn, u32 reg, u8 val)
-{
- outl((1U<<31) | (bus << 16) | (dev << 11) | (fn << 8) | (reg & ~3), 0xcf8);
- outb(val, 0xcfc + (reg & 3));
-}
-
/*
* Disable C1-Clock ramping if enabled in PMM7.CpuLowPwrEnh on 8th-generation
* cores only. Assume BIOS has setup all Northbridges equivalently.
@@ -90,12 +78,12 @@ static void disable_c1_ramping(void)
for (node=0; node < NR_CPUS; node++) {
/* PMM7: bus=0, dev=0x18+node, function=0x3, register=0x87. */
- pmm7 = pci_read_byte(0, 0x18+node, 0x3, 0x87);
+ pmm7 = pci_conf_read8(0, 0x18+node, 0x3, 0x87);
/* Invalid read means we've updated every Northbridge. */
if (pmm7 == 0xFF)
break;
pmm7 &= 0xFC; /* clear pmm7[1:0] */
- pci_write_byte(0, 0x18+node, 0x3, 0x87, pmm7);
+ pci_conf_write8(0, 0x18+node, 0x3, 0x87, pmm7);
printk ("AMD: Disabling C1 Clock Ramping Node #%x\n", node);
}
}
diff --git a/xen/arch/x86/domain.c b/xen/arch/x86/domain.c
index c56db37b37..4418c51ff9 100644
--- a/xen/arch/x86/domain.c
+++ b/xen/arch/x86/domain.c
@@ -46,6 +46,7 @@
#include <asm/debugreg.h>
#include <asm/msr.h>
#include <asm/nmi.h>
+#include <xen/numa.h>
#include <xen/iommu.h>
#ifdef CONFIG_COMPAT
#include <compat/vcpu.h>
@@ -171,7 +172,7 @@ int setup_arg_xlat_area(struct vcpu *v, l4_pgentry_t *l4tab)
if ( !d->arch.mm_arg_xlat_l3 )
{
- pg = alloc_domheap_page(NULL);
+ pg = alloc_domheap_page(NULL, 0);
if ( !pg )
return -ENOMEM;
d->arch.mm_arg_xlat_l3 = page_to_virt(pg);
@@ -189,7 +190,7 @@ int setup_arg_xlat_area(struct vcpu *v, l4_pgentry_t *l4tab)
if ( !l3e_get_intpte(d->arch.mm_arg_xlat_l3[l3_table_offset(va)]) )
{
- pg = alloc_domheap_page(NULL);
+ pg = alloc_domheap_page(NULL, 0);
if ( !pg )
return -ENOMEM;
clear_page(page_to_virt(pg));
@@ -198,7 +199,7 @@ int setup_arg_xlat_area(struct vcpu *v, l4_pgentry_t *l4tab)
l2tab = l3e_to_l2e(d->arch.mm_arg_xlat_l3[l3_table_offset(va)]);
if ( !l2e_get_intpte(l2tab[l2_table_offset(va)]) )
{
- pg = alloc_domheap_page(NULL);
+ pg = alloc_domheap_page(NULL, 0);
if ( !pg )
return -ENOMEM;
clear_page(page_to_virt(pg));
@@ -206,7 +207,7 @@ int setup_arg_xlat_area(struct vcpu *v, l4_pgentry_t *l4tab)
}
l1tab = l2e_to_l1e(l2tab[l2_table_offset(va)]);
BUG_ON(l1e_get_intpte(l1tab[l1_table_offset(va)]));
- pg = alloc_domheap_page(NULL);
+ pg = alloc_domheap_page(NULL, 0);
if ( !pg )
return -ENOMEM;
l1tab[l1_table_offset(va)] = l1e_from_page(pg, PAGE_HYPERVISOR);
@@ -252,7 +253,7 @@ static void release_arg_xlat_area(struct domain *d)
static int setup_compat_l4(struct vcpu *v)
{
- struct page_info *pg = alloc_domheap_page(NULL);
+ struct page_info *pg = alloc_domheap_page(NULL, 0);
l4_pgentry_t *l4tab;
int rc;
@@ -477,7 +478,8 @@ int arch_domain_create(struct domain *d, unsigned int domcr_flags)
#else /* __x86_64__ */
- if ( (pg = alloc_domheap_page(NULL)) == NULL )
+ pg = alloc_domheap_page(NULL, MEMF_node(domain_to_node(d)));
+ if ( pg == NULL )
goto fail;
d->arch.mm_perdomain_l2 = page_to_virt(pg);
clear_page(d->arch.mm_perdomain_l2);
@@ -486,7 +488,8 @@ int arch_domain_create(struct domain *d, unsigned int domcr_flags)
l2e_from_page(virt_to_page(d->arch.mm_perdomain_pt)+i,
__PAGE_HYPERVISOR);
- if ( (pg = alloc_domheap_page(NULL)) == NULL )
+ pg = alloc_domheap_page(NULL, MEMF_node(domain_to_node(d)));
+ if ( pg == NULL )
goto fail;
d->arch.mm_perdomain_l3 = page_to_virt(pg);
clear_page(d->arch.mm_perdomain_l3);
@@ -500,13 +503,15 @@ int arch_domain_create(struct domain *d, unsigned int domcr_flags)
HYPERVISOR_COMPAT_VIRT_START(d) = __HYPERVISOR_COMPAT_VIRT_START;
#endif
- paging_domain_init(d);
+ if ( (rc = paging_domain_init(d)) != 0 )
+ goto fail;
paging_initialised = 1;
if ( !is_idle_domain(d) )
{
d->arch.ioport_caps =
rangeset_new(d, "I/O Ports", RANGESETF_prettyprint_hex);
+ rc = -ENOMEM;
if ( d->arch.ioport_caps == NULL )
goto fail;
@@ -946,9 +951,9 @@ arch_do_vcpu_op(
if ( copy_from_guest(&info, arg, 1) )
break;
- LOCK_BIGLOCK(d);
+ domain_lock(d);
rc = map_vcpu_info(v, info.mfn, info.offset);
- UNLOCK_BIGLOCK(d);
+ domain_unlock(d);
break;
}
diff --git a/xen/arch/x86/domain_build.c b/xen/arch/x86/domain_build.c
index dc8ee52f07..56106bae2f 100644
--- a/xen/arch/x86/domain_build.c
+++ b/xen/arch/x86/domain_build.c
@@ -630,7 +630,7 @@ int __init construct_dom0(
}
else
{
- page = alloc_domheap_page(NULL);
+ page = alloc_domheap_page(NULL, 0);
if ( !page )
panic("Not enough RAM for domain 0 PML4.\n");
l4start = l4tab = page_to_virt(page);
@@ -957,6 +957,8 @@ int __init construct_dom0(
rc |= ioports_deny_access(dom0, 0x40, 0x43);
/* PIT Channel 2 / PC Speaker Control. */
rc |= ioports_deny_access(dom0, 0x61, 0x61);
+ /* PCI configuration spaces. */
+ rc |= ioports_deny_access(dom0, 0xcf8, 0xcff);
/* Command-line I/O ranges. */
process_dom0_ioports_disable();
diff --git a/xen/arch/x86/hvm/emulate.c b/xen/arch/x86/hvm/emulate.c
index 57065f7625..d7bf9f3f2f 100644
--- a/xen/arch/x86/hvm/emulate.c
+++ b/xen/arch/x86/hvm/emulate.c
@@ -20,12 +20,13 @@
#include <asm/hvm/support.h>
static int hvmemul_do_io(
- int is_mmio, paddr_t addr, unsigned long count, int size,
+ int is_mmio, paddr_t addr, unsigned long *reps, int size,
paddr_t value, int dir, int df, int value_is_ptr, unsigned long *val)
{
struct vcpu *curr = current;
vcpu_iodata_t *vio = get_ioreq(curr);
ioreq_t *p = &vio->vp_ioreq;
+ int rc;
switch ( curr->arch.hvm_vcpu.io_state )
{
@@ -41,52 +42,72 @@ static int hvmemul_do_io(
return X86EMUL_UNHANDLEABLE;
}
- curr->arch.hvm_vcpu.io_state =
- (val == NULL) ? HVMIO_dispatched : HVMIO_awaiting_completion;
-
if ( p->state != STATE_IOREQ_NONE )
+ {
gdprintk(XENLOG_WARNING, "WARNING: io already pending (%d)?\n",
p->state);
+ return X86EMUL_UNHANDLEABLE;
+ }
+
+ curr->arch.hvm_vcpu.io_state =
+ (val == NULL) ? HVMIO_dispatched : HVMIO_awaiting_completion;
p->dir = dir;
p->data_is_ptr = value_is_ptr;
p->type = is_mmio ? IOREQ_TYPE_COPY : IOREQ_TYPE_PIO;
p->size = size;
p->addr = addr;
- p->count = count;
+ p->count = *reps;
p->df = df;
p->data = value;
p->io_count++;
- if ( is_mmio
- ? (hvm_mmio_intercept(p) || hvm_buffered_io_intercept(p))
- : hvm_portio_intercept(p) )
+ if ( is_mmio )
{
+ rc = hvm_mmio_intercept(p);
+ if ( rc == X86EMUL_UNHANDLEABLE )
+ rc = hvm_buffered_io_intercept(p);
+ }
+ else
+ {
+ rc = hvm_portio_intercept(p);
+ }
+
+ switch ( rc )
+ {
+ case X86EMUL_OKAY:
+ case X86EMUL_RETRY:
+ *reps = p->count;
p->state = STATE_IORESP_READY;
hvm_io_assist();
if ( val != NULL )
*val = curr->arch.hvm_vcpu.io_data;
curr->arch.hvm_vcpu.io_state = HVMIO_none;
- return X86EMUL_OKAY;
+ break;
+ case X86EMUL_UNHANDLEABLE:
+ hvm_send_assist_req(curr);
+ rc = (val != NULL) ? X86EMUL_RETRY : X86EMUL_OKAY;
+ break;
+ default:
+ BUG();
}
- hvm_send_assist_req(curr);
- return (val != NULL) ? X86EMUL_RETRY : X86EMUL_OKAY;
+ return rc;
}
static int hvmemul_do_pio(
- unsigned long port, unsigned long count, int size,
+ unsigned long port, unsigned long *reps, int size,
paddr_t value, int dir, int df, int value_is_ptr, unsigned long *val)
{
- return hvmemul_do_io(0, port, count, size, value,
+ return hvmemul_do_io(0, port, reps, size, value,
dir, df, value_is_ptr, val);
}
static int hvmemul_do_mmio(
- paddr_t gpa, unsigned long count, int size,
+ paddr_t gpa, unsigned long *reps, int size,
paddr_t value, int dir, int df, int value_is_ptr, unsigned long *val)
{
- return hvmemul_do_io(1, gpa, count, size, value,
+ return hvmemul_do_io(1, gpa, reps, size, value,
dir, df, value_is_ptr, val);
}
@@ -206,7 +227,7 @@ static int __hvmemul_read(
struct hvm_emulate_ctxt *hvmemul_ctxt)
{
struct vcpu *curr = current;
- unsigned long addr;
+ unsigned long addr, reps = 1;
uint32_t pfec = PFEC_page_present;
paddr_t gpa;
int rc;
@@ -226,7 +247,8 @@ static int __hvmemul_read(
return X86EMUL_UNHANDLEABLE;
gpa = (((paddr_t)curr->arch.hvm_vcpu.mmio_gpfn << PAGE_SHIFT) | off);
if ( (off + bytes) <= PAGE_SIZE )
- return hvmemul_do_mmio(gpa, 1, bytes, 0, IOREQ_READ, 0, 0, val);
+ return hvmemul_do_mmio(gpa, &reps, bytes, 0,
+ IOREQ_READ, 0, 0, val);
}
if ( (seg != x86_seg_none) &&
@@ -251,7 +273,7 @@ static int __hvmemul_read(
if ( rc != X86EMUL_OKAY )
return rc;
- return hvmemul_do_mmio(gpa, 1, bytes, 0, IOREQ_READ, 0, 0, val);
+ return hvmemul_do_mmio(gpa, &reps, bytes, 0, IOREQ_READ, 0, 0, val);
}
return X86EMUL_OKAY;
@@ -302,7 +324,7 @@ static int hvmemul_write(
struct hvm_emulate_ctxt *hvmemul_ctxt =
container_of(ctxt, struct hvm_emulate_ctxt, ctxt);
struct vcpu *curr = current;
- unsigned long addr;
+ unsigned long addr, reps = 1;
uint32_t pfec = PFEC_page_present | PFEC_write_access;
paddr_t gpa;
int rc;
@@ -318,8 +340,8 @@ static int hvmemul_write(
unsigned int off = addr & (PAGE_SIZE - 1);
gpa = (((paddr_t)curr->arch.hvm_vcpu.mmio_gpfn << PAGE_SHIFT) | off);
if ( (off + bytes) <= PAGE_SIZE )
- return hvmemul_do_mmio(gpa, 1, bytes, val, IOREQ_WRITE,
- 0, 0, NULL);
+ return hvmemul_do_mmio(gpa, &reps, bytes, val,
+ IOREQ_WRITE, 0, 0, NULL);
}
if ( (seg != x86_seg_none) &&
@@ -339,7 +361,8 @@ static int hvmemul_write(
if ( rc != X86EMUL_OKAY )
return rc;
- return hvmemul_do_mmio(gpa, 1, bytes, val, IOREQ_WRITE, 0, 0, NULL);
+ return hvmemul_do_mmio(gpa, &reps, bytes, val,
+ IOREQ_WRITE, 0, 0, NULL);
}
return X86EMUL_OKAY;
@@ -386,7 +409,7 @@ static int hvmemul_rep_ins(
if ( rc != X86EMUL_OKAY )
return rc;
- return hvmemul_do_pio(src_port, *reps, bytes_per_rep, gpa, IOREQ_READ,
+ return hvmemul_do_pio(src_port, reps, bytes_per_rep, gpa, IOREQ_READ,
!!(ctxt->regs->eflags & X86_EFLAGS_DF), 1, NULL);
}
@@ -419,7 +442,7 @@ static int hvmemul_rep_outs(
if ( rc != X86EMUL_OKAY )
return rc;
- return hvmemul_do_pio(dst_port, *reps, bytes_per_rep, gpa, IOREQ_WRITE,
+ return hvmemul_do_pio(dst_port, reps, bytes_per_rep, gpa, IOREQ_WRITE,
!!(ctxt->regs->eflags & X86_EFLAGS_DF), 1, NULL);
}
@@ -469,14 +492,14 @@ static int hvmemul_rep_movs(
(void)gfn_to_mfn_current(sgpa >> PAGE_SHIFT, &p2mt);
if ( !p2m_is_ram(p2mt) )
return hvmemul_do_mmio(
- sgpa, *reps, bytes_per_rep, dgpa, IOREQ_READ,
+ sgpa, reps, bytes_per_rep, dgpa, IOREQ_READ,
!!(ctxt->regs->eflags & X86_EFLAGS_DF), 1, NULL);
(void)gfn_to_mfn_current(dgpa >> PAGE_SHIFT, &p2mt);
if ( p2m_is_ram(p2mt) )
return X86EMUL_UNHANDLEABLE;
return hvmemul_do_mmio(
- dgpa, *reps, bytes_per_rep, sgpa, IOREQ_WRITE,
+ dgpa, reps, bytes_per_rep, sgpa, IOREQ_WRITE,
!!(ctxt->regs->eflags & X86_EFLAGS_DF), 1, NULL);
}
@@ -513,7 +536,8 @@ static int hvmemul_read_io(
unsigned long *val,
struct x86_emulate_ctxt *ctxt)
{
- return hvmemul_do_pio(port, 1, bytes, 0, IOREQ_READ, 0, 0, val);
+ unsigned long reps = 1;
+ return hvmemul_do_pio(port, &reps, bytes, 0, IOREQ_READ, 0, 0, val);
}
static int hvmemul_write_io(
@@ -522,7 +546,8 @@ static int hvmemul_write_io(
unsigned long val,
struct x86_emulate_ctxt *ctxt)
{
- return hvmemul_do_pio(port, 1, bytes, val, IOREQ_WRITE, 0, 0, NULL);
+ unsigned long reps = 1;
+ return hvmemul_do_pio(port, &reps, bytes, val, IOREQ_WRITE, 0, 0, NULL);
}
static int hvmemul_read_cr(
diff --git a/xen/arch/x86/hvm/hpet.c b/xen/arch/x86/hvm/hpet.c
index 49ca998d37..03dfbf3bd8 100644
--- a/xen/arch/x86/hvm/hpet.c
+++ b/xen/arch/x86/hvm/hpet.c
@@ -150,8 +150,9 @@ static inline uint64_t hpet_read_maincounter(HPETState *h)
return h->hpet.mc64;
}
-static unsigned long hpet_read(
- struct vcpu *v, unsigned long addr, unsigned long length)
+static int hpet_read(
+ struct vcpu *v, unsigned long addr, unsigned long length,
+ unsigned long *pval)
{
HPETState *h = &v->domain->arch.hvm_domain.pl_time.vhpet;
unsigned long result;
@@ -160,7 +161,10 @@ static unsigned long hpet_read(
addr &= HPET_MMAP_SIZE-1;
if ( hpet_check_access_length(addr, length) != 0 )
- return ~0UL;
+ {
+ result = ~0ul;
+ goto out;
+ }
spin_lock(&h->lock);
@@ -174,7 +178,9 @@ static unsigned long hpet_read(
spin_unlock(&h->lock);
- return result;
+ out:
+ *pval = result;
+ return X86EMUL_OKAY;
}
static void hpet_stop_timer(HPETState *h, unsigned int tn)
@@ -234,7 +240,7 @@ static inline uint64_t hpet_fixup_reg(
return new;
}
-static void hpet_write(
+static int hpet_write(
struct vcpu *v, unsigned long addr,
unsigned long length, unsigned long val)
{
@@ -245,7 +251,7 @@ static void hpet_write(
addr &= HPET_MMAP_SIZE-1;
if ( hpet_check_access_length(addr, length) != 0 )
- return;
+ goto out;
spin_lock(&h->lock);
@@ -349,6 +355,9 @@ static void hpet_write(
}
spin_unlock(&h->lock);
+
+ out:
+ return X86EMUL_OKAY;
}
static int hpet_range(struct vcpu *v, unsigned long addr)
diff --git a/xen/arch/x86/hvm/hvm.c b/xen/arch/x86/hvm/hvm.c
index 961bfbf354..97a1aaa17c 100644
--- a/xen/arch/x86/hvm/hvm.c
+++ b/xen/arch/x86/hvm/hvm.c
@@ -181,7 +181,8 @@ void hvm_do_resume(struct vcpu *v)
break;
default:
gdprintk(XENLOG_ERR, "Weird HVM iorequest state %d.\n", p->state);
- domain_crash_synchronous();
+ domain_crash(v->domain);
+ return; /* bail */
}
}
}
@@ -276,7 +277,7 @@ static int hvm_print_line(
}
spin_unlock(&hd->pbuf_lock);
- return 1;
+ return X86EMUL_OKAY;
}
int hvm_domain_initialise(struct domain *d)
@@ -478,11 +479,11 @@ static int hvm_load_cpu_ctxt(struct domain *d, hvm_domain_context_t *h)
vc = &v->arch.guest_context;
/* Need to init this vcpu before loading its contents */
- LOCK_BIGLOCK(d);
+ domain_lock(d);
if ( !v->is_initialised )
if ( (rc = boot_vcpu(d, vcpuid, vc)) != 0 )
return rc;
- UNLOCK_BIGLOCK(d);
+ domain_unlock(d);
if ( hvm_load_entry(CPU, h, &ctxt) != 0 )
return -EINVAL;
@@ -687,47 +688,26 @@ void hvm_vcpu_destroy(struct vcpu *v)
/*free_xen_event_channel(v, v->arch.hvm_vcpu.xen_port);*/
}
-
-void hvm_vcpu_reset(struct vcpu *v)
-{
- vcpu_pause(v);
-
- vlapic_reset(vcpu_vlapic(v));
-
- hvm_funcs.vcpu_initialise(v);
-
- set_bit(_VPF_down, &v->pause_flags);
- clear_bit(_VPF_blocked, &v->pause_flags);
- v->fpu_initialised = 0;
- v->fpu_dirtied = 0;
- v->is_initialised = 0;
-
- vcpu_unpause(v);
-}
-
-static void hvm_vcpu_down(void)
+void hvm_vcpu_down(struct vcpu *v)
{
- struct vcpu *v = current;
struct domain *d = v->domain;
int online_count = 0;
- gdprintk(XENLOG_INFO, "VCPU%d: going offline.\n", v->vcpu_id);
-
/* Doesn't halt us immediately, but we'll never return to guest context. */
set_bit(_VPF_down, &v->pause_flags);
vcpu_sleep_nosync(v);
/* Any other VCPUs online? ... */
- LOCK_BIGLOCK(d);
+ domain_lock(d);
for_each_vcpu ( d, v )
if ( !test_bit(_VPF_down, &v->pause_flags) )
online_count++;
- UNLOCK_BIGLOCK(d);
+ domain_unlock(d);
/* ... Shut down the domain if not. */
if ( online_count == 0 )
{
- gdprintk(XENLOG_INFO, "all CPUs offline -- powering off.\n");
+ gdprintk(XENLOG_INFO, "All CPUs offline -- powering off.\n");
domain_shutdown(d, SHUTDOWN_poweroff);
}
}
@@ -742,9 +722,10 @@ void hvm_send_assist_req(struct vcpu *v)
p = &get_ioreq(v)->vp_ioreq;
if ( unlikely(p->state != STATE_IOREQ_NONE) )
{
- /* This indicates a bug in the device model. Crash the domain. */
+ /* This indicates a bug in the device model. Crash the domain. */
gdprintk(XENLOG_ERR, "Device model set bad IO state %d.\n", p->state);
- domain_crash_synchronous();
+ domain_crash(v->domain);
+ return;
}
prepare_wait_on_xen_event_channel(v->arch.hvm_vcpu.xen_port);
@@ -765,7 +746,7 @@ void hvm_hlt(unsigned long rflags)
* out of this.
*/
if ( unlikely(!(rflags & X86_EFLAGS_IF)) )
- return hvm_vcpu_down();
+ return hvm_vcpu_down(current);
do_sched_op_compat(SCHEDOP_block, 0);
}
@@ -1894,79 +1875,6 @@ void hvm_hypercall_page_initialise(struct domain *d,
hvm_funcs.init_hypercall_page(d, hypercall_page);
}
-int hvm_bringup_ap(int vcpuid, int trampoline_vector)
-{
- struct domain *d = current->domain;
- struct vcpu *v;
- struct vcpu_guest_context *ctxt;
- struct segment_register reg;
-
- ASSERT(is_hvm_domain(d));
-
- if ( (v = d->vcpu[vcpuid]) == NULL )
- return -ENOENT;
-
- v->fpu_initialised = 0;
- v->arch.flags |= TF_kernel_mode;
- v->is_initialised = 1;
-
- ctxt = &v->arch.guest_context;
- memset(ctxt, 0, sizeof(*ctxt));
- ctxt->flags = VGCF_online;
- ctxt->user_regs.eflags = 2;
-
- v->arch.hvm_vcpu.guest_cr[0] = X86_CR0_ET;
- hvm_update_guest_cr(v, 0);
-
- v->arch.hvm_vcpu.guest_cr[2] = 0;
- hvm_update_guest_cr(v, 2);
-
- v->arch.hvm_vcpu.guest_cr[3] = 0;
- hvm_update_guest_cr(v, 3);
-
- v->arch.hvm_vcpu.guest_cr[4] = 0;
- hvm_update_guest_cr(v, 4);
-
- v->arch.hvm_vcpu.guest_efer = 0;
- hvm_update_guest_efer(v);
-
- reg.sel = trampoline_vector << 8;
- reg.base = (uint32_t)reg.sel << 4;
- reg.limit = 0xffff;
- reg.attr.bytes = 0x89b;
- hvm_set_segment_register(v, x86_seg_cs, &reg);
-
- reg.sel = reg.base = 0;
- reg.limit = 0xffff;
- reg.attr.bytes = 0x893;
- hvm_set_segment_register(v, x86_seg_ds, &reg);
- hvm_set_segment_register(v, x86_seg_es, &reg);
- hvm_set_segment_register(v, x86_seg_fs, &reg);
- hvm_set_segment_register(v, x86_seg_gs, &reg);
- hvm_set_segment_register(v, x86_seg_ss, &reg);
-
- reg.attr.bytes = 0x82; /* LDT */
- hvm_set_segment_register(v, x86_seg_ldtr, &reg);
-
- reg.attr.bytes = 0x8b; /* 32-bit TSS (busy) */
- hvm_set_segment_register(v, x86_seg_tr, &reg);
-
- reg.attr.bytes = 0;
- hvm_set_segment_register(v, x86_seg_gdtr, &reg);
- hvm_set_segment_register(v, x86_seg_idtr, &reg);
-
- /* Sync AP's TSC with BSP's. */
- v->arch.hvm_vcpu.cache_tsc_offset =
- v->domain->vcpu[0]->arch.hvm_vcpu.cache_tsc_offset;
- hvm_funcs.set_tsc_offset(v, v->arch.hvm_vcpu.cache_tsc_offset);
-
- if ( test_and_clear_bit(_VPF_down, &v->pause_flags) )
- vcpu_wake(v);
-
- gdprintk(XENLOG_INFO, "AP %d bringup succeeded.\n", vcpuid);
- return 0;
-}
-
static int hvmop_set_pci_intx_level(
XEN_GUEST_HANDLE(xen_hvm_set_pci_intx_level_t) uop)
{
@@ -2185,13 +2093,16 @@ long do_hvm_op(unsigned long op, XEN_GUEST_HANDLE(void) arg)
if ( op == HVMOP_set_param )
{
+ rc = 0;
+
switch ( a.index )
{
case HVM_PARAM_IOREQ_PFN:
iorp = &d->arch.hvm_domain.ioreq;
- rc = hvm_set_ioreq_page(d, iorp, a.value);
+ if ( (rc = hvm_set_ioreq_page(d, iorp, a.value)) != 0 )
+ break;
spin_lock(&iorp->lock);
- if ( (rc == 0) && (iorp->va != NULL) )
+ if ( iorp->va != NULL )
/* Initialise evtchn port info if VCPUs already created. */
for_each_vcpu ( d, v )
get_ioreq(v)->vp_eport = v->arch.hvm_vcpu.xen_port;
@@ -2206,13 +2117,72 @@ long do_hvm_op(unsigned long op, XEN_GUEST_HANDLE(void) arg)
hvm_latch_shinfo_size(d);
break;
case HVM_PARAM_TIMER_MODE:
- rc = -EINVAL;
if ( a.value > HVMPTM_one_missed_tick_pending )
- goto param_fail;
+ rc = -EINVAL;
+ break;
+ case HVM_PARAM_IDENT_PT:
+ rc = -EPERM;
+ if ( !IS_PRIV(current->domain) )
+ break;
+
+ rc = -EINVAL;
+ if ( d->arch.hvm_domain.params[a.index] != 0 )
+ break;
+
+ rc = 0;
+ if ( !paging_mode_hap(d) )
+ break;
+
+ domain_pause(d);
+
+ /*
+ * Update GUEST_CR3 in each VMCS to point at identity map.
+ * All foreign updates to guest state must synchronise on
+ * the domctl_lock.
+ */
+ spin_lock(&domctl_lock);
+ d->arch.hvm_domain.params[a.index] = a.value;
+ for_each_vcpu ( d, v )
+ paging_update_cr3(v);
+ spin_unlock(&domctl_lock);
+
+ domain_unpause(d);
+ break;
+ case HVM_PARAM_DM_DOMAIN:
+ /* Privileged domains only, as we must domain_pause(d). */
+ rc = -EPERM;
+ if ( !IS_PRIV_FOR(current->domain, d) )
+ break;
+
+ if ( a.value == DOMID_SELF )
+ a.value = current->domain->domain_id;
+
+ rc = 0;
+ domain_pause(d); /* safe to change per-vcpu xen_port */
+ iorp = &d->arch.hvm_domain.ioreq;
+ for_each_vcpu ( d, v )
+ {
+ int old_port, new_port;
+ new_port = alloc_unbound_xen_event_channel(v, a.value);
+ if ( new_port < 0 )
+ {
+ rc = new_port;
+ break;
+ }
+ /* xchg() ensures that only we free_xen_event_channel() */
+ old_port = xchg(&v->arch.hvm_vcpu.xen_port, new_port);
+ free_xen_event_channel(v, old_port);
+ spin_lock(&iorp->lock);
+ if ( iorp->va != NULL )
+ get_ioreq(v)->vp_eport = v->arch.hvm_vcpu.xen_port;
+ spin_unlock(&iorp->lock);
+ }
+ domain_unpause(d);
break;
}
- d->arch.hvm_domain.params[a.index] = a.value;
- rc = 0;
+
+ if ( rc == 0 )
+ d->arch.hvm_domain.params[a.index] = a.value;
}
else
{
diff --git a/xen/arch/x86/hvm/i8254.c b/xen/arch/x86/hvm/i8254.c
index 01c78f7799..493b7317b9 100644
--- a/xen/arch/x86/hvm/i8254.c
+++ b/xen/arch/x86/hvm/i8254.c
@@ -401,50 +401,6 @@ void pit_stop_channel0_irq(PITState *pit)
spin_unlock(&pit->lock);
}
-#ifdef HVM_DEBUG_SUSPEND
-static void pit_info(PITState *pit)
-{
- struct hvm_hw_pit_channel *s;
- struct periodic_time *pt;
- int i;
-
- for ( i = 0; i < 3; i++ )
- {
- printk("*****pit channel %d's state:*****\n", i);
- s = &pit->hw.channels[i];
- printk("pit 0x%x.\n", s->count);
- printk("pit 0x%x.\n", s->latched_count);
- printk("pit 0x%x.\n", s->count_latched);
- printk("pit 0x%x.\n", s->status_latched);
- printk("pit 0x%x.\n", s->status);
- printk("pit 0x%x.\n", s->read_state);
- printk("pit 0x%x.\n", s->write_state);
- printk("pit 0x%x.\n", s->write_latch);
- printk("pit 0x%x.\n", s->rw_mode);
- printk("pit 0x%x.\n", s->mode);
- printk("pit 0x%x.\n", s->bcd);
- printk("pit 0x%x.\n", s->gate);
- printk("pit %"PRId64"\n", pit->count_load_time[i]);
-
- }
-
- pt = &pit->pt0;
- printk("pit channel 0 periodic timer:\n", i);
- printk("pt %d.\n", pt->enabled);
- printk("pt %d.\n", pt->one_shot);
- printk("pt %d.\n", pt->irq);
- printk("pt %d.\n", pt->first_injected);
- printk("pt %d.\n", pt->pending_intr_nr);
- printk("pt %d.\n", pt->period);
- printk("pt %"PRId64"\n", pt->period_cycles);
- printk("pt %"PRId64"\n", pt->last_plt_gtime);
-}
-#else
-static void pit_info(PITState *pit)
-{
-}
-#endif
-
static int pit_save(struct domain *d, hvm_domain_context_t *h)
{
PITState *pit = domain_vpit(d);
@@ -452,9 +408,6 @@ static int pit_save(struct domain *d, hvm_domain_context_t *h)
spin_lock(&pit->lock);
- pit_info(pit);
-
- /* Save the PIT hardware state */
rc = hvm_save_entry(PIT, 0, h, &pit->hw);
spin_unlock(&pit->lock);
@@ -469,22 +422,21 @@ static int pit_load(struct domain *d, hvm_domain_context_t *h)
spin_lock(&pit->lock);
- /* Restore the PIT hardware state */
if ( hvm_load_entry(PIT, h, &pit->hw) )
{
spin_unlock(&pit->lock);
return 1;
}
- /* Recreate platform timers from hardware state. There will be some
+ /*
+ * Recreate platform timers from hardware state. There will be some
* time jitter here, but the wall-clock will have jumped massively, so
- * we hope the guest can handle it. */
+ * we hope the guest can handle it.
+ */
pit->pt0.last_plt_gtime = hvm_get_guest_time(d->vcpu[0]);
for ( i = 0; i < 3; i++ )
pit_load_count(pit, i, pit->hw.channels[i].count);
- pit_info(pit);
-
spin_unlock(&pit->lock);
return 0;
@@ -535,7 +487,7 @@ static int handle_pit_io(
if ( bytes != 1 )
{
gdprintk(XENLOG_WARNING, "PIT bad access\n");
- return 1;
+ return X86EMUL_OKAY;
}
if ( dir == IOREQ_WRITE )
@@ -550,7 +502,7 @@ static int handle_pit_io(
gdprintk(XENLOG_WARNING, "PIT: read A1:A0=3!\n");
}
- return 1;
+ return X86EMUL_OKAY;
}
static void speaker_ioport_write(
@@ -574,11 +526,7 @@ static int handle_speaker_io(
{
struct PITState *vpit = vcpu_vpit(current);
- if ( bytes != 1 )
- {
- gdprintk(XENLOG_WARNING, "PIT_SPEAKER bad access\n");
- return 1;
- }
+ BUG_ON(bytes != 1);
spin_lock(&vpit->lock);
@@ -589,7 +537,7 @@ static int handle_speaker_io(
spin_unlock(&vpit->lock);
- return 1;
+ return X86EMUL_OKAY;
}
int pv_pit_handler(int port, int data, int write)
diff --git a/xen/arch/x86/hvm/intercept.c b/xen/arch/x86/hvm/intercept.c
index 04c5da7b6f..0e110e00dc 100644
--- a/xen/arch/x86/hvm/intercept.c
+++ b/xen/arch/x86/hvm/intercept.c
@@ -45,53 +45,63 @@ static struct hvm_mmio_handler *hvm_mmio_handlers[HVM_MMIO_HANDLER_NR] =
&vioapic_mmio_handler
};
-static inline void hvm_mmio_access(struct vcpu *v,
- ioreq_t *p,
- hvm_mmio_read_t read_handler,
- hvm_mmio_write_t write_handler)
+static int hvm_mmio_access(struct vcpu *v,
+ ioreq_t *p,
+ hvm_mmio_read_t read_handler,
+ hvm_mmio_write_t write_handler)
{
unsigned long data;
+ int rc = X86EMUL_OKAY, i, sign = p->df ? -1 : 1;
- switch ( p->type )
+ if ( !p->data_is_ptr )
{
- case IOREQ_TYPE_COPY:
- if ( !p->data_is_ptr ) {
- if ( p->dir == IOREQ_READ )
- p->data = read_handler(v, p->addr, p->size);
- else /* p->dir == IOREQ_WRITE */
- write_handler(v, p->addr, p->size, p->data);
- } else { /* p->data_is_ptr */
- int i, sign = (p->df) ? -1 : 1;
-
- if ( p->dir == IOREQ_READ ) {
- for ( i = 0; i < p->count; i++ ) {
- data = read_handler(v,
- p->addr + (sign * i * p->size),
- p->size);
- (void)hvm_copy_to_guest_phys(
- p->data + (sign * i * p->size),
- &data,
- p->size);
- }
- } else {/* p->dir == IOREQ_WRITE */
- for ( i = 0; i < p->count; i++ ) {
- (void)hvm_copy_from_guest_phys(
- &data,
- p->data + (sign * i * p->size),
- p->size);
- write_handler(v,
- p->addr + (sign * i * p->size),
- p->size, data);
- }
- }
+ if ( p->dir == IOREQ_READ )
+ {
+ rc = read_handler(v, p->addr, p->size, &data);
+ p->data = data;
}
- break;
+ else /* p->dir == IOREQ_WRITE */
+ rc = write_handler(v, p->addr, p->size, p->data);
+ return rc;
+ }
- default:
- printk("hvm_mmio_access: error ioreq type %x\n", p->type);
- domain_crash_synchronous();
- break;
+ if ( p->dir == IOREQ_READ )
+ {
+ for ( i = 0; i < p->count; i++ )
+ {
+ rc = read_handler(
+ v,
+ p->addr + (sign * i * p->size),
+ p->size, &data);
+ if ( rc != X86EMUL_OKAY )
+ break;
+ (void)hvm_copy_to_guest_phys(
+ p->data + (sign * i * p->size),
+ &data,
+ p->size);
+ }
+ }
+ else
+ {
+ for ( i = 0; i < p->count; i++ )
+ {
+ (void)hvm_copy_from_guest_phys(
+ &data,
+ p->data + (sign * i * p->size),
+ p->size);
+ rc = write_handler(
+ v,
+ p->addr + (sign * i * p->size),
+ p->size, data);
+ if ( rc != X86EMUL_OKAY )
+ break;
+ }
}
+
+ if ( (p->count = i) != 0 )
+ rc = X86EMUL_OKAY;
+
+ return rc;
}
int hvm_mmio_intercept(ioreq_t *p)
@@ -100,60 +110,62 @@ int hvm_mmio_intercept(ioreq_t *p)
int i;
for ( i = 0; i < HVM_MMIO_HANDLER_NR; i++ )
- {
if ( hvm_mmio_handlers[i]->check_handler(v, p->addr) )
- {
- hvm_mmio_access(v, p,
- hvm_mmio_handlers[i]->read_handler,
- hvm_mmio_handlers[i]->write_handler);
- return 1;
- }
- }
+ return hvm_mmio_access(
+ v, p,
+ hvm_mmio_handlers[i]->read_handler,
+ hvm_mmio_handlers[i]->write_handler);
- return 0;
+ return X86EMUL_UNHANDLEABLE;
}
static int process_portio_intercept(portio_action_t action, ioreq_t *p)
{
- int rc = 1, i, sign = p->df ? -1 : 1;
+ int rc = X86EMUL_OKAY, i, sign = p->df ? -1 : 1;
uint32_t data;
- if ( p->dir == IOREQ_READ )
+ if ( !p->data_is_ptr )
{
- if ( !p->data_is_ptr )
+ if ( p->dir == IOREQ_READ )
{
rc = action(IOREQ_READ, p->addr, p->size, &data);
p->data = data;
}
else
{
- for ( i = 0; i < p->count; i++ )
- {
- rc = action(IOREQ_READ, p->addr, p->size, &data);
- (void)hvm_copy_to_guest_phys(p->data + sign*i*p->size,
- &data, p->size);
- }
+ data = p->data;
+ rc = action(IOREQ_WRITE, p->addr, p->size, &data);
}
+ return rc;
}
- else /* p->dir == IOREQ_WRITE */
+
+ if ( p->dir == IOREQ_READ )
{
- if ( !p->data_is_ptr )
+ for ( i = 0; i < p->count; i++ )
{
- data = p->data;
- rc = action(IOREQ_WRITE, p->addr, p->size, &data);
+ rc = action(IOREQ_READ, p->addr, p->size, &data);
+ if ( rc != X86EMUL_OKAY )
+ break;
+ (void)hvm_copy_to_guest_phys(p->data + sign*i*p->size,
+ &data, p->size);
}
- else
+ }
+ else /* p->dir == IOREQ_WRITE */
+ {
+ for ( i = 0; i < p->count; i++ )
{
- for ( i = 0; i < p->count; i++ )
- {
- data = 0;
- (void)hvm_copy_from_guest_phys(&data, p->data + sign*i*p->size,
- p->size);
- rc = action(IOREQ_WRITE, p->addr, p->size, &data);
- }
+ data = 0;
+ (void)hvm_copy_from_guest_phys(&data, p->data + sign*i*p->size,
+ p->size);
+ rc = action(IOREQ_WRITE, p->addr, p->size, &data);
+ if ( rc != X86EMUL_OKAY )
+ break;
}
}
+ if ( (p->count = i) != 0 )
+ rc = X86EMUL_OKAY;
+
return rc;
}
@@ -170,7 +182,7 @@ int hvm_io_intercept(ioreq_t *p, int type)
unsigned long addr, size;
if ( (type == HVM_PORTIO) && (dpci_ioport_intercept(p)) )
- return 1;
+ return X86EMUL_OKAY;
for ( i = 0; i < handler->num_slot; i++ )
{
@@ -188,10 +200,10 @@ int hvm_io_intercept(ioreq_t *p, int type)
}
}
- return 0;
+ return X86EMUL_UNHANDLEABLE;
}
-int register_io_handler(
+void register_io_handler(
struct domain *d, unsigned long addr, unsigned long size,
void *action, int type)
{
@@ -207,9 +219,8 @@ int register_io_handler(
else
handler->hdl_list[num].action.mmio = action;
handler->num_slot++;
-
- return 1;
}
+
/*
* Local variables:
* mode: C
diff --git a/xen/arch/x86/hvm/io.c b/xen/arch/x86/hvm/io.c
index ac1e62782a..6a8e0885c0 100644
--- a/xen/arch/x86/hvm/io.c
+++ b/xen/arch/x86/hvm/io.c
@@ -148,20 +148,19 @@ void send_timeoffset_req(unsigned long timeoff)
void send_invalidate_req(void)
{
struct vcpu *v = current;
- vcpu_iodata_t *vio;
+ vcpu_iodata_t *vio = get_ioreq(v);
ioreq_t *p;
- vio = get_ioreq(v);
- if ( vio == NULL )
- {
- printk("bad shared page: %lx\n", (unsigned long) vio);
- domain_crash_synchronous();
- }
+ BUG_ON(vio == NULL);
p = &vio->vp_ioreq;
if ( p->state != STATE_IOREQ_NONE )
- printk("WARNING: send invalidate req with something "
- "already pending (%d)?\n", p->state);
+ {
+ gdprintk(XENLOG_ERR, "WARNING: send invalidate req with something "
+ "already pending (%d)?\n", p->state);
+ domain_crash(v->domain);
+ return;
+ }
p->type = IOREQ_TYPE_INVALIDATE;
p->size = 4;
@@ -225,12 +224,6 @@ void hvm_io_assist(void)
ioreq_t *p = &get_ioreq(curr)->vp_ioreq;
enum hvm_io_state io_state;
- if ( p->state != STATE_IORESP_READY )
- {
- gdprintk(XENLOG_ERR, "Unexpected HVM iorequest state %d.\n", p->state);
- domain_crash_synchronous();
- }
-
rmb(); /* see IORESP_READY /then/ read contents of ioreq */
p->state = STATE_IOREQ_NONE;
@@ -253,74 +246,59 @@ void hvm_io_assist(void)
void dpci_ioport_read(uint32_t mport, ioreq_t *p)
{
- uint64_t i;
- uint64_t z_data;
- uint64_t length = (p->count * p->size);
+ int i, sign = p->df ? -1 : 1;
+ uint32_t data = 0;
- for ( i = 0; i < length; i += p->size )
+ for ( i = 0; i < p->count; i++ )
{
- z_data = ~0ULL;
-
switch ( p->size )
{
case 1:
- z_data = (uint64_t)inb(mport);
+ data = inb(mport);
break;
case 2:
- z_data = (uint64_t)inw(mport);
+ data = inw(mport);
break;
case 4:
- z_data = (uint64_t)inl(mport);
+ data = inl(mport);
break;
default:
- gdprintk(XENLOG_ERR, "Error: unable to handle size: %"
- PRId64 "\n", p->size);
- return;
+ BUG();
}
- p->data = z_data;
- if ( p->data_is_ptr &&
- hvm_copy_to_guest_phys(p->data + i, (void *)&z_data,
- (int)p->size) )
- {
- gdprintk(XENLOG_ERR, "Error: couldn't copy to hvm phys\n");
- return;
- }
+ if ( p->data_is_ptr )
+ (void)hvm_copy_to_guest_phys(
+ p->data + (sign * i * p->size), &data, p->size);
+ else
+ p->data = data;
}
}
void dpci_ioport_write(uint32_t mport, ioreq_t *p)
{
- uint64_t i;
- uint64_t z_data = 0;
- uint64_t length = (p->count * p->size);
+ int i, sign = p->df ? -1 : 1;
+ uint32_t data;
- for ( i = 0; i < length; i += p->size )
+ for ( i = 0; i < p->count; i++ )
{
- z_data = p->data;
- if ( p->data_is_ptr &&
- hvm_copy_from_guest_phys((void *)&z_data,
- p->data + i, (int)p->size) )
- {
- gdprintk(XENLOG_ERR, "Error: couldn't copy from hvm phys\n");
- return;
- }
+ data = p->data;
+ if ( p->data_is_ptr )
+ (void)hvm_copy_from_guest_phys(
+ &data, p->data + (sign * i & p->size), p->size);
switch ( p->size )
{
case 1:
- outb((uint8_t) z_data, mport);
+ outb(data, mport);
break;
case 2:
- outw((uint16_t) z_data, mport);
+ outw(data, mport);
break;
case 4:
- outl((uint32_t) z_data, mport);
+ outl(data, mport);
break;
default:
- gdprintk(XENLOG_ERR, "Error: unable to handle size: %"
- PRId64 "\n", p->size);
- break;
+ BUG();
}
}
}
diff --git a/xen/arch/x86/hvm/mtrr.c b/xen/arch/x86/hvm/mtrr.c
index 3bd0dc9d7c..4e50680022 100644
--- a/xen/arch/x86/hvm/mtrr.c
+++ b/xen/arch/x86/hvm/mtrr.c
@@ -266,7 +266,7 @@ static void setup_var_mtrrs(struct vcpu *v)
{
if ( e820_table[i].addr == 0x100000 )
{
- size = e820_table[i].size + 0x100000 + PAGE_SIZE * 4;
+ size = e820_table[i].size + 0x100000 + PAGE_SIZE * 5;
addr = 0;
}
else
diff --git a/xen/arch/x86/hvm/pmtimer.c b/xen/arch/x86/hvm/pmtimer.c
index 8d3fff8f44..4924a80687 100644
--- a/xen/arch/x86/hvm/pmtimer.c
+++ b/xen/arch/x86/hvm/pmtimer.c
@@ -169,7 +169,7 @@ static int handle_evt_io(
spin_unlock(&s->lock);
- return 1;
+ return X86EMUL_OKAY;
}
@@ -183,7 +183,7 @@ static int handle_pmt_io(
if ( bytes != 4 )
{
gdprintk(XENLOG_WARNING, "HVM_PMT bad access\n");
- return 1;
+ return X86EMUL_OKAY;
}
if ( dir == IOREQ_READ )
@@ -192,10 +192,10 @@ static int handle_pmt_io(
pmt_update_time(s);
*val = s->pm.tmr_val;
spin_unlock(&s->lock);
- return 1;
+ return X86EMUL_OKAY;
}
- return 0;
+ return X86EMUL_UNHANDLEABLE;
}
static int pmtimer_save(struct domain *d, hvm_domain_context_t *h)
diff --git a/xen/arch/x86/hvm/rtc.c b/xen/arch/x86/hvm/rtc.c
index b9e4b4a241..e196c72866 100644
--- a/xen/arch/x86/hvm/rtc.c
+++ b/xen/arch/x86/hvm/rtc.c
@@ -403,21 +403,21 @@ static int handle_rtc_io(
if ( bytes != 1 )
{
gdprintk(XENLOG_WARNING, "HVM_RTC bas access\n");
- return 1;
+ return X86EMUL_OKAY;
}
if ( dir == IOREQ_WRITE )
{
if ( rtc_ioport_write(vrtc, port, (uint8_t)*val) )
- return 1;
+ return X86EMUL_OKAY;
}
else if ( vrtc->hw.cmos_index < RTC_CMOS_SIZE )
{
*val = rtc_ioport_read(vrtc, port);
- return 1;
+ return X86EMUL_OKAY;
}
- return 0;
+ return X86EMUL_UNHANDLEABLE;
}
void rtc_migrate_timers(struct vcpu *v)
diff --git a/xen/arch/x86/hvm/stdvga.c b/xen/arch/x86/hvm/stdvga.c
index 56260c5c77..25b16bddac 100644
--- a/xen/arch/x86/hvm/stdvga.c
+++ b/xen/arch/x86/hvm/stdvga.c
@@ -32,6 +32,7 @@
#include <xen/sched.h>
#include <xen/domain_page.h>
#include <asm/hvm/support.h>
+#include <xen/numa.h>
#define PAT(x) (x)
static const uint32_t mask16[16] = {
@@ -166,19 +167,19 @@ static void stdvga_out(uint32_t port, uint32_t bytes, uint32_t val)
}
}
-int stdvga_intercept_pio(
+static int stdvga_intercept_pio(
int dir, uint32_t port, uint32_t bytes, uint32_t *val)
{
struct hvm_hw_stdvga *s = &current->domain->arch.hvm_domain.stdvga;
- if ( dir == IOREQ_READ )
- return 0;
-
- spin_lock(&s->lock);
- stdvga_out(port, bytes, *val);
- spin_unlock(&s->lock);
+ if ( dir == IOREQ_WRITE )
+ {
+ spin_lock(&s->lock);
+ stdvga_out(port, bytes, *val);
+ spin_unlock(&s->lock);
+ }
- return 0; /* propagate to external ioemu */
+ return X86EMUL_UNHANDLEABLE; /* propagate to external ioemu */
}
#define GET_PLANE(data, p) (((data) >> ((p) * 8)) & 0xff)
@@ -458,7 +459,7 @@ static int mmio_move(struct hvm_hw_stdvga *s, ioreq_t *p)
return 1;
}
-int stdvga_intercept_mmio(ioreq_t *p)
+static int stdvga_intercept_mmio(ioreq_t *p)
{
struct domain *d = current->domain;
struct hvm_hw_stdvga *s = &d->arch.hvm_domain.stdvga;
@@ -467,7 +468,7 @@ int stdvga_intercept_mmio(ioreq_t *p)
if ( p->size > 8 )
{
gdprintk(XENLOG_WARNING, "invalid mmio size %d\n", (int)p->size);
- return 0;
+ return X86EMUL_UNHANDLEABLE;
}
spin_lock(&s->lock);
@@ -498,7 +499,7 @@ int stdvga_intercept_mmio(ioreq_t *p)
spin_unlock(&s->lock);
- return rc;
+ return rc ? X86EMUL_OKAY : X86EMUL_UNHANDLEABLE;
}
void stdvga_init(struct domain *d)
@@ -513,7 +514,8 @@ void stdvga_init(struct domain *d)
for ( i = 0; i != ARRAY_SIZE(s->vram_page); i++ )
{
- if ( (pg = alloc_domheap_page(NULL)) == NULL )
+ pg = alloc_domheap_page(NULL, MEMF_node(domain_to_node(d)));
+ if ( pg == NULL )
break;
s->vram_page[i] = pg;
p = map_domain_page(page_to_mfn(pg));
diff --git a/xen/arch/x86/hvm/svm/svm.c b/xen/arch/x86/hvm/svm/svm.c
index be166a868c..7c10127966 100644
--- a/xen/arch/x86/hvm/svm/svm.c
+++ b/xen/arch/x86/hvm/svm/svm.c
@@ -255,11 +255,6 @@ static int svm_vmcb_restore(struct vcpu *v, struct hvm_hw_cpu *c)
svm_update_guest_cr(v, 2);
svm_update_guest_cr(v, 4);
-#ifdef HVM_DEBUG_SUSPEND
- printk("%s: cr3=0x%"PRIx64", cr0=0x%"PRIx64", cr4=0x%"PRIx64".\n",
- __func__, c->cr3, c->cr0, c->cr4);
-#endif
-
vmcb->sysenter_cs = c->sysenter_cs;
vmcb->sysenter_esp = c->sysenter_esp;
vmcb->sysenter_eip = c->sysenter_eip;
@@ -472,7 +467,7 @@ static void svm_get_segment_register(struct vcpu *v, enum x86_segment seg,
{
struct vmcb_struct *vmcb = v->arch.hvm_svm.vmcb;
- ASSERT(v == current);
+ ASSERT((v == current) || !vcpu_runnable(v));
switch ( seg )
{
diff --git a/xen/arch/x86/hvm/vioapic.c b/xen/arch/x86/hvm/vioapic.c
index c01618c69f..8ebaa260cf 100644
--- a/xen/arch/x86/hvm/vioapic.c
+++ b/xen/arch/x86/hvm/vioapic.c
@@ -88,9 +88,9 @@ static unsigned long vioapic_read_indirect(struct hvm_hw_vioapic *vioapic,
return result;
}
-static unsigned long vioapic_read(struct vcpu *v,
- unsigned long addr,
- unsigned long length)
+static int vioapic_read(
+ struct vcpu *v, unsigned long addr,
+ unsigned long length, unsigned long *pval)
{
struct hvm_hw_vioapic *vioapic = domain_vioapic(v->domain);
uint32_t result;
@@ -114,11 +114,13 @@ static unsigned long vioapic_read(struct vcpu *v,
break;
}
- return result;
+ *pval = result;
+ return X86EMUL_OKAY;
}
static void vioapic_write_redirent(
- struct hvm_hw_vioapic *vioapic, unsigned int idx, int top_word, uint32_t val)
+ struct hvm_hw_vioapic *vioapic, unsigned int idx,
+ int top_word, uint32_t val)
{
struct domain *d = vioapic_domain(vioapic);
struct hvm_irq *hvm_irq = &d->arch.hvm_domain.irq;
@@ -196,10 +198,9 @@ static void vioapic_write_indirect(
}
}
-static void vioapic_write(struct vcpu *v,
- unsigned long addr,
- unsigned long length,
- unsigned long val)
+static int vioapic_write(
+ struct vcpu *v, unsigned long addr,
+ unsigned long length, unsigned long val)
{
struct hvm_hw_vioapic *vioapic = domain_vioapic(v->domain);
@@ -224,6 +225,8 @@ static void vioapic_write(struct vcpu *v,
default:
break;
}
+
+ return X86EMUL_OKAY;
}
static int vioapic_range(struct vcpu *v, unsigned long addr)
@@ -477,45 +480,16 @@ void vioapic_update_EOI(struct domain *d, int vector)
spin_unlock(&d->arch.hvm_domain.irq_lock);
}
-#ifdef HVM_DEBUG_SUSPEND
-static void ioapic_info(struct hvm_hw_vioapic *s)
-{
- int i;
- printk("*****ioapic state:*****\n");
- printk("ioapic 0x%x.\n", s->ioregsel);
- printk("ioapic 0x%x.\n", s->id);
- printk("ioapic 0x%lx.\n", s->base_address);
- for (i = 0; i < VIOAPIC_NUM_PINS; i++) {
- printk("ioapic redirtbl[%d]:0x%"PRIx64"\n", i, s->redirtbl[i].bits);
- }
-
-}
-#else
-static void ioapic_info(struct hvm_hw_vioapic *s)
-{
-}
-#endif
-
-
static int ioapic_save(struct domain *d, hvm_domain_context_t *h)
{
struct hvm_hw_vioapic *s = domain_vioapic(d);
- ioapic_info(s);
-
- /* save io-apic state*/
- return ( hvm_save_entry(IOAPIC, 0, h, s) );
+ return hvm_save_entry(IOAPIC, 0, h, s);
}
static int ioapic_load(struct domain *d, hvm_domain_context_t *h)
{
struct hvm_hw_vioapic *s = domain_vioapic(d);
-
- /* restore ioapic state */
- if ( hvm_load_entry(IOAPIC, h, s) != 0 )
- return -EINVAL;
-
- ioapic_info(s);
- return 0;
+ return hvm_load_entry(IOAPIC, h, s);
}
HVM_REGISTER_SAVE_RESTORE(IOAPIC, ioapic_save, ioapic_load, 1, HVMSR_PER_DOM);
diff --git a/xen/arch/x86/hvm/vlapic.c b/xen/arch/x86/hvm/vlapic.c
index bf53ba7a1a..9bfc2cc3d1 100644
--- a/xen/arch/x86/hvm/vlapic.c
+++ b/xen/arch/x86/hvm/vlapic.c
@@ -33,6 +33,7 @@
#include <xen/sched.h>
#include <asm/current.h>
#include <asm/hvm/vmx/vmx.h>
+#include <xen/numa.h>
#include <public/hvm/ioreq.h>
#include <public/hvm/params.h>
@@ -240,12 +241,145 @@ static int vlapic_match_dest(struct vcpu *v, struct vlapic *source,
return result;
}
+static int vlapic_vcpu_pause_async(struct vcpu *v)
+{
+ vcpu_pause_nosync(v);
+
+ if ( v->is_running )
+ {
+ vcpu_unpause(v);
+ return 0;
+ }
+
+ sync_vcpu_execstate(v);
+ return 1;
+}
+
+static void vlapic_init_action(unsigned long _vcpu)
+{
+ struct vcpu *v = (struct vcpu *)_vcpu;
+ struct domain *d = v->domain;
+
+ /* If the VCPU is not on its way down we have nothing to do. */
+ if ( !test_bit(_VPF_down, &v->pause_flags) )
+ return;
+
+ if ( !vlapic_vcpu_pause_async(v) )
+ {
+ tasklet_schedule(&vcpu_vlapic(v)->init_tasklet);
+ return;
+ }
+
+ domain_lock(d);
+
+ /* Paranoia makes us re-assert VPF_down under the domain lock. */
+ set_bit(_VPF_down, &v->pause_flags);
+ v->is_initialised = 0;
+ clear_bit(_VPF_blocked, &v->pause_flags);
+
+ vlapic_reset(vcpu_vlapic(v));
+
+ domain_unlock(d);
+
+ vcpu_unpause(v);
+}
+
+static int vlapic_accept_init(struct vcpu *v)
+{
+ /* Nothing to do if the VCPU is already reset. */
+ if ( !v->is_initialised )
+ return X86EMUL_OKAY;
+
+ /* Asynchronously take the VCPU down and schedule reset work. */
+ hvm_vcpu_down(v);
+ tasklet_schedule(&vcpu_vlapic(v)->init_tasklet);
+ return X86EMUL_RETRY;
+}
+
+static int vlapic_accept_sipi(struct vcpu *v, int trampoline_vector)
+{
+ struct domain *d = current->domain;
+ struct vcpu_guest_context *ctxt;
+ struct segment_register reg;
+
+ /* If the VCPU is not on its way down we have nothing to do. */
+ if ( !test_bit(_VPF_down, &v->pause_flags) )
+ return X86EMUL_OKAY;
+
+ if ( !vlapic_vcpu_pause_async(v) )
+ return X86EMUL_RETRY;
+
+ domain_lock(d);
+
+ if ( v->is_initialised )
+ goto out;
+
+ ctxt = &v->arch.guest_context;
+ memset(ctxt, 0, sizeof(*ctxt));
+ ctxt->flags = VGCF_online;
+ ctxt->user_regs.eflags = 2;
+
+ v->arch.hvm_vcpu.guest_cr[0] = X86_CR0_ET;
+ hvm_update_guest_cr(v, 0);
+
+ v->arch.hvm_vcpu.guest_cr[2] = 0;
+ hvm_update_guest_cr(v, 2);
+
+ v->arch.hvm_vcpu.guest_cr[3] = 0;
+ hvm_update_guest_cr(v, 3);
+
+ v->arch.hvm_vcpu.guest_cr[4] = 0;
+ hvm_update_guest_cr(v, 4);
+
+ v->arch.hvm_vcpu.guest_efer = 0;
+ hvm_update_guest_efer(v);
+
+ reg.sel = trampoline_vector << 8;
+ reg.base = (uint32_t)reg.sel << 4;
+ reg.limit = 0xffff;
+ reg.attr.bytes = 0x89b;
+ hvm_set_segment_register(v, x86_seg_cs, &reg);
+
+ reg.sel = reg.base = 0;
+ reg.limit = 0xffff;
+ reg.attr.bytes = 0x893;
+ hvm_set_segment_register(v, x86_seg_ds, &reg);
+ hvm_set_segment_register(v, x86_seg_es, &reg);
+ hvm_set_segment_register(v, x86_seg_fs, &reg);
+ hvm_set_segment_register(v, x86_seg_gs, &reg);
+ hvm_set_segment_register(v, x86_seg_ss, &reg);
+
+ reg.attr.bytes = 0x82; /* LDT */
+ hvm_set_segment_register(v, x86_seg_ldtr, &reg);
+
+ reg.attr.bytes = 0x8b; /* 32-bit TSS (busy) */
+ hvm_set_segment_register(v, x86_seg_tr, &reg);
+
+ reg.attr.bytes = 0;
+ hvm_set_segment_register(v, x86_seg_gdtr, &reg);
+ hvm_set_segment_register(v, x86_seg_idtr, &reg);
+
+ /* Sync AP's TSC with BSP's. */
+ v->arch.hvm_vcpu.cache_tsc_offset =
+ v->domain->vcpu[0]->arch.hvm_vcpu.cache_tsc_offset;
+ hvm_funcs.set_tsc_offset(v, v->arch.hvm_vcpu.cache_tsc_offset);
+
+ v->arch.flags |= TF_kernel_mode;
+ v->is_initialised = 1;
+ clear_bit(_VPF_down, &v->pause_flags);
+
+ out:
+ domain_unlock(d);
+ vcpu_unpause(v);
+ return X86EMUL_OKAY;
+}
+
/* Add a pending IRQ into lapic. */
static int vlapic_accept_irq(struct vcpu *v, int delivery_mode,
int vector, int level, int trig_mode)
{
- int result = 0;
struct vlapic *vlapic = vcpu_vlapic(v);
+ int rc = X86EMUL_OKAY;
switch ( delivery_mode )
{
@@ -270,8 +404,6 @@ static int vlapic_accept_irq(struct vcpu *v, int delivery_mode,
}
vcpu_kick(v);
-
- result = 1;
break;
case APIC_DM_REMRD:
@@ -291,43 +423,20 @@ static int vlapic_accept_irq(struct vcpu *v, int delivery_mode,
/* No work on INIT de-assert for P4-type APIC. */
if ( trig_mode && !(level & APIC_INT_ASSERT) )
break;
- /* FIXME How to check the situation after vcpu reset? */
- if ( v->is_initialised )
- hvm_vcpu_reset(v);
- v->arch.hvm_vcpu.init_sipi_sipi_state =
- HVM_VCPU_INIT_SIPI_SIPI_STATE_WAIT_SIPI;
- result = 1;
+ rc = vlapic_accept_init(v);
break;
case APIC_DM_STARTUP:
- if ( v->arch.hvm_vcpu.init_sipi_sipi_state ==
- HVM_VCPU_INIT_SIPI_SIPI_STATE_NORM )
- break;
-
- v->arch.hvm_vcpu.init_sipi_sipi_state =
- HVM_VCPU_INIT_SIPI_SIPI_STATE_NORM;
-
- if ( v->is_initialised )
- {
- gdprintk(XENLOG_ERR, "SIPI for initialized vcpu %x\n", v->vcpu_id);
- goto exit_and_crash;
- }
-
- if ( hvm_bringup_ap(v->vcpu_id, vector) != 0 )
- result = 0;
+ rc = vlapic_accept_sipi(v, vector);
break;
default:
gdprintk(XENLOG_ERR, "TODO: unsupported delivery mode %x\n",
delivery_mode);
- goto exit_and_crash;
+ domain_crash(v->domain);
}
- return result;
-
- exit_and_crash:
- domain_crash(v->domain);
- return 0;
+ return rc;
}
/* This function is used by both ioapic and lapic.The bitmap is for vcpu_id. */
@@ -369,11 +478,9 @@ void vlapic_EOI_set(struct vlapic *vlapic)
vioapic_update_EOI(vlapic_domain(vlapic), vector);
}
-static void vlapic_ipi(struct vlapic *vlapic)
+static int vlapic_ipi(
+ struct vlapic *vlapic, uint32_t icr_low, uint32_t icr_high)
{
- uint32_t icr_low = vlapic_get_reg(vlapic, APIC_ICR);
- uint32_t icr_high = vlapic_get_reg(vlapic, APIC_ICR2);
-
unsigned int dest = GET_APIC_DEST_FIELD(icr_high);
unsigned int short_hand = icr_low & APIC_SHORT_MASK;
unsigned int trig_mode = icr_low & APIC_INT_LEVELTRIG;
@@ -385,6 +492,7 @@ static void vlapic_ipi(struct vlapic *vlapic)
struct vlapic *target;
struct vcpu *v;
uint32_t lpr_map = 0;
+ int rc = X86EMUL_OKAY;
HVM_DBG_LOG(DBG_LEVEL_VLAPIC, "icr_high 0x%x, icr_low 0x%x, "
"short_hand 0x%x, dest 0x%x, trig_mode 0x%x, level 0x%x, "
@@ -399,18 +507,23 @@ static void vlapic_ipi(struct vlapic *vlapic)
if ( delivery_mode == APIC_DM_LOWEST )
__set_bit(v->vcpu_id, &lpr_map);
else
- vlapic_accept_irq(v, delivery_mode,
- vector, level, trig_mode);
+ rc = vlapic_accept_irq(v, delivery_mode,
+ vector, level, trig_mode);
}
+
+ if ( rc != X86EMUL_OKAY )
+ break;
}
if ( delivery_mode == APIC_DM_LOWEST )
{
target = apic_round_robin(vlapic_domain(v), vector, lpr_map);
if ( target != NULL )
- vlapic_accept_irq(vlapic_vcpu(target), delivery_mode,
- vector, level, trig_mode);
+ rc = vlapic_accept_irq(vlapic_vcpu(target), delivery_mode,
+ vector, level, trig_mode);
}
+
+ return rc;
}
static uint32_t vlapic_get_tmcct(struct vlapic *vlapic)
@@ -465,17 +578,18 @@ static void vlapic_read_aligned(
}
}
-static unsigned long vlapic_read(struct vcpu *v, unsigned long address,
- unsigned long len)
+static int vlapic_read(
+ struct vcpu *v, unsigned long address,
+ unsigned long len, unsigned long *pval)
{
unsigned int alignment;
unsigned int tmp;
- unsigned long result;
+ unsigned long result = 0;
struct vlapic *vlapic = vcpu_vlapic(v);
unsigned int offset = address - vlapic_base_address(vlapic);
if ( offset > (APIC_TDCR + 0x3) )
- return 0;
+ goto out;
alignment = offset & 0x3;
@@ -507,14 +621,16 @@ static unsigned long vlapic_read(struct vcpu *v, unsigned long address,
HVM_DBG_LOG(DBG_LEVEL_VLAPIC, "offset 0x%x with length 0x%lx, "
"and the result is 0x%lx", offset, len, result);
- return result;
+ out:
+ *pval = result;
+ return X86EMUL_OKAY;
unaligned_exit_and_crash:
gdprintk(XENLOG_ERR, "Unaligned LAPIC read len=0x%lx at offset=0x%x.\n",
len, offset);
exit_and_crash:
domain_crash(v->domain);
- return 0;
+ return X86EMUL_OKAY;
}
void vlapic_pt_cb(struct vcpu *v, void *data)
@@ -522,11 +638,12 @@ void vlapic_pt_cb(struct vcpu *v, void *data)
*(s_time_t *)data = hvm_get_guest_time(v);
}
-static void vlapic_write(struct vcpu *v, unsigned long address,
- unsigned long len, unsigned long val)
+static int vlapic_write(struct vcpu *v, unsigned long address,
+ unsigned long len, unsigned long val)
{
struct vlapic *vlapic = vcpu_vlapic(v);
unsigned int offset = address - vlapic_base_address(vlapic);
+ int rc = X86EMUL_OKAY;
if ( offset != 0xb0 )
HVM_DBG_LOG(DBG_LEVEL_VLAPIC,
@@ -540,13 +657,13 @@ static void vlapic_write(struct vcpu *v, unsigned long address,
val = (uint32_t)val;
if ( len != 4 )
{
- unsigned int tmp;
+ unsigned long tmp;
unsigned char alignment;
gdprintk(XENLOG_INFO, "Notice: Local APIC write with len = %lx\n",len);
alignment = offset & 0x3;
- tmp = vlapic_read(v, offset & ~0x3, 4);
+ (void)vlapic_read(v, offset & ~0x3, 4, &tmp);
switch ( len )
{
@@ -617,9 +734,10 @@ static void vlapic_write(struct vcpu *v, unsigned long address,
break;
case APIC_ICR:
- /* No delay here, so we always clear the pending bit*/
- vlapic_set_reg(vlapic, APIC_ICR, val & ~(1 << 12));
- vlapic_ipi(vlapic);
+ val &= ~(1 << 12); /* always clear the pending bit */
+ rc = vlapic_ipi(vlapic, val, vlapic_get_reg(vlapic, APIC_ICR2));
+ if ( rc == X86EMUL_OKAY )
+ vlapic_set_reg(vlapic, APIC_ICR, val);
break;
case APIC_ICR2:
@@ -669,13 +787,14 @@ static void vlapic_write(struct vcpu *v, unsigned long address,
break;
}
- return;
+ return rc;
unaligned_exit_and_crash:
gdprintk(XENLOG_ERR, "Unaligned LAPIC write len=0x%lx at offset=0x%x.\n",
len, offset);
exit_and_crash:
domain_crash(v->domain);
+ return rc;
}
static int vlapic_range(struct vcpu *v, unsigned long addr)
@@ -788,77 +907,58 @@ void vlapic_reset(struct vlapic *vlapic)
vlapic_set_reg(vlapic, APIC_SPIV, 0xff);
vlapic->hw.disabled |= VLAPIC_SW_DISABLED;
-}
-#ifdef HVM_DEBUG_SUSPEND
-static void lapic_info(struct vlapic *s)
-{
- printk("*****lapic state:*****\n");
- printk("lapic 0x%"PRIx64".\n", s->hw.apic_base_msr);
- printk("lapic 0x%x.\n", s->hw.disabled);
- printk("lapic 0x%x.\n", s->hw.timer_divisor);
-}
-#else
-static void lapic_info(struct vlapic *s)
-{
+ destroy_periodic_time(&vlapic->pt);
}
-#endif
/* rearm the actimer if needed, after a HVM restore */
static void lapic_rearm(struct vlapic *s)
{
- unsigned long tmict;
+ unsigned long tmict = vlapic_get_reg(s, APIC_TMICT);
+ uint64_t period;
- tmict = vlapic_get_reg(s, APIC_TMICT);
- if ( tmict > 0 )
- {
- uint64_t period = (uint64_t)APIC_BUS_CYCLE_NS *
- (uint32_t)tmict * s->hw.timer_divisor;
- uint32_t lvtt = vlapic_get_reg(s, APIC_LVTT);
-
- s->pt.irq = lvtt & APIC_VECTOR_MASK;
- create_periodic_time(vlapic_vcpu(s), &s->pt, period, s->pt.irq,
- !vlapic_lvtt_period(s), vlapic_pt_cb,
- &s->timer_last_update);
- s->timer_last_update = s->pt.last_plt_gtime;
-
- printk("lapic_load to rearm the actimer:"
- "bus cycle is %uns, "
- "saved tmict count %lu, period %"PRIu64"ns, irq=%"PRIu8"\n",
- APIC_BUS_CYCLE_NS, tmict, period, s->pt.irq);
- }
+ if ( (tmict = vlapic_get_reg(s, APIC_TMICT)) == 0 )
+ return;
- lapic_info(s);
+ period = ((uint64_t)APIC_BUS_CYCLE_NS *
+ (uint32_t)tmict * s->hw.timer_divisor);
+ s->pt.irq = vlapic_get_reg(s, APIC_LVTT) & APIC_VECTOR_MASK;
+ create_periodic_time(vlapic_vcpu(s), &s->pt, period, s->pt.irq,
+ !vlapic_lvtt_period(s), vlapic_pt_cb,
+ &s->timer_last_update);
+ s->timer_last_update = s->pt.last_plt_gtime;
}
static int lapic_save_hidden(struct domain *d, hvm_domain_context_t *h)
{
struct vcpu *v;
struct vlapic *s;
+ int rc = 0;
- for_each_vcpu(d, v)
+ for_each_vcpu ( d, v )
{
s = vcpu_vlapic(v);
- lapic_info(s);
-
- if ( hvm_save_entry(LAPIC, v->vcpu_id, h, &s->hw) != 0 )
- return 1;
+ if ( (rc = hvm_save_entry(LAPIC, v->vcpu_id, h, &s->hw)) != 0 )
+ break;
}
- return 0;
+
+ return rc;
}
static int lapic_save_regs(struct domain *d, hvm_domain_context_t *h)
{
struct vcpu *v;
struct vlapic *s;
+ int rc = 0;
- for_each_vcpu(d, v)
+ for_each_vcpu ( d, v )
{
s = vcpu_vlapic(v);
- if ( hvm_save_entry(LAPIC_REGS, v->vcpu_id, h, s->regs) != 0 )
- return 1;
+ if ( (rc = hvm_save_entry(LAPIC_REGS, v->vcpu_id, h, s->regs)) != 0 )
+ break;
}
- return 0;
+
+ return rc;
}
static int lapic_load_hidden(struct domain *d, hvm_domain_context_t *h)
@@ -879,8 +979,6 @@ static int lapic_load_hidden(struct domain *d, hvm_domain_context_t *h)
if ( hvm_load_entry(LAPIC, h, &s->hw) != 0 )
return -EINVAL;
- lapic_info(s);
-
vmx_vlapic_msr_changed(v);
return 0;
@@ -916,7 +1014,7 @@ HVM_REGISTER_SAVE_RESTORE(LAPIC_REGS, lapic_save_regs, lapic_load_regs,
int vlapic_init(struct vcpu *v)
{
struct vlapic *vlapic = vcpu_vlapic(v);
- unsigned int memflags = 0;
+ unsigned int memflags = MEMF_node(vcpu_to_node(v));
HVM_DBG_LOG(DBG_LEVEL_VLAPIC, "%d", v->vcpu_id);
@@ -925,10 +1023,10 @@ int vlapic_init(struct vcpu *v)
#ifdef __i386__
/* 32-bit VMX may be limited to 32-bit physical addresses. */
if ( boot_cpu_data.x86_vendor == X86_VENDOR_INTEL )
- memflags = MEMF_bits(32);
+ memflags |= MEMF_bits(32);
#endif
- vlapic->regs_page = alloc_domheap_pages(NULL, 0, memflags);
+ vlapic->regs_page = alloc_domheap_page(NULL, memflags);
if ( vlapic->regs_page == NULL )
{
dprintk(XENLOG_ERR, "alloc vlapic regs error: %d/%d\n",
@@ -941,7 +1039,7 @@ int vlapic_init(struct vcpu *v)
{
dprintk(XENLOG_ERR, "map vlapic regs error: %d/%d\n",
v->domain->domain_id, v->vcpu_id);
- return -ENOMEM;
+ return -ENOMEM;
}
clear_page(vlapic->regs);
@@ -953,6 +1051,8 @@ int vlapic_init(struct vcpu *v)
if ( v->vcpu_id == 0 )
vlapic->hw.apic_base_msr |= MSR_IA32_APICBASE_BSP;
+ tasklet_init(&vlapic->init_tasklet, vlapic_init_action, (unsigned long)v);
+
return 0;
}
@@ -960,6 +1060,7 @@ void vlapic_destroy(struct vcpu *v)
{
struct vlapic *vlapic = vcpu_vlapic(v);
+ tasklet_kill(&vlapic->init_tasklet);
destroy_periodic_time(&vlapic->pt);
unmap_domain_page_global(vlapic->regs);
free_domheap_page(vlapic->regs_page);
diff --git a/xen/arch/x86/hvm/vmx/realmode.c b/xen/arch/x86/hvm/vmx/realmode.c
index c00e8b1e42..5d13f4e60b 100644
--- a/xen/arch/x86/hvm/vmx/realmode.c
+++ b/xen/arch/x86/hvm/vmx/realmode.c
@@ -172,7 +172,7 @@ static void realmode_emulate_one(struct hvm_emulate_ctxt *hvmemul_ctxt)
hvmemul_ctxt->insn_buf[0], hvmemul_ctxt->insn_buf[1],
hvmemul_ctxt->insn_buf[2], hvmemul_ctxt->insn_buf[3],
hvmemul_ctxt->insn_buf[4], hvmemul_ctxt->insn_buf[5]);
- domain_crash_synchronous();
+ domain_crash(curr->domain);
}
void vmx_realmode(struct cpu_user_regs *regs)
diff --git a/xen/arch/x86/hvm/vmx/vmcs.c b/xen/arch/x86/hvm/vmx/vmcs.c
index bee9eb1deb..48506c5b32 100644
--- a/xen/arch/x86/hvm/vmx/vmcs.c
+++ b/xen/arch/x86/hvm/vmx/vmcs.c
@@ -38,6 +38,9 @@
#include <asm/shadow.h>
#include <asm/tboot.h>
+static int opt_vpid_enabled = 1;
+boolean_param("vpid", opt_vpid_enabled);
+
/* Dynamic (run-time adjusted) execution control flags. */
u32 vmx_pin_based_exec_control __read_mostly;
u32 vmx_cpu_based_exec_control __read_mostly;
@@ -84,14 +87,16 @@ static void vmx_init_vmcs_config(void)
min = (CPU_BASED_HLT_EXITING |
CPU_BASED_INVLPG_EXITING |
+ CPU_BASED_CR3_LOAD_EXITING |
+ CPU_BASED_CR3_STORE_EXITING |
CPU_BASED_MONITOR_EXITING |
CPU_BASED_MWAIT_EXITING |
CPU_BASED_MOV_DR_EXITING |
CPU_BASED_ACTIVATE_IO_BITMAP |
CPU_BASED_USE_TSC_OFFSETING);
- opt = CPU_BASED_ACTIVATE_MSR_BITMAP;
- opt |= CPU_BASED_TPR_SHADOW;
- opt |= CPU_BASED_ACTIVATE_SECONDARY_CONTROLS;
+ opt = (CPU_BASED_ACTIVATE_MSR_BITMAP |
+ CPU_BASED_TPR_SHADOW |
+ CPU_BASED_ACTIVATE_SECONDARY_CONTROLS);
_vmx_cpu_based_exec_control = adjust_vmx_controls(
min, opt, MSR_IA32_VMX_PROCBASED_CTLS);
#ifdef __x86_64__
@@ -107,11 +112,25 @@ static void vmx_init_vmcs_config(void)
{
min = 0;
opt = (SECONDARY_EXEC_VIRTUALIZE_APIC_ACCESSES |
- SECONDARY_EXEC_WBINVD_EXITING);
+ SECONDARY_EXEC_WBINVD_EXITING |
+ SECONDARY_EXEC_ENABLE_EPT);
+ if ( opt_vpid_enabled )
+ opt |= SECONDARY_EXEC_ENABLE_VPID;
_vmx_secondary_exec_control = adjust_vmx_controls(
min, opt, MSR_IA32_VMX_PROCBASED_CTLS2);
}
+ if ( _vmx_secondary_exec_control & SECONDARY_EXEC_ENABLE_EPT )
+ {
+ /* To use EPT we expect to be able to clear certain intercepts. */
+ uint32_t must_be_one, must_be_zero;
+ rdmsr(MSR_IA32_VMX_PROCBASED_CTLS, must_be_one, must_be_zero);
+ if ( must_be_one & (CPU_BASED_INVLPG_EXITING |
+ CPU_BASED_CR3_LOAD_EXITING |
+ CPU_BASED_CR3_STORE_EXITING) )
+ _vmx_secondary_exec_control &= ~SECONDARY_EXEC_ENABLE_EPT;
+ }
+
#if defined(__i386__)
/* If we can't virtualise APIC accesses, the TPR shadow is pointless. */
if ( !(_vmx_secondary_exec_control &
@@ -301,6 +320,10 @@ int vmx_cpu_up(void)
return 0;
}
+ ept_sync_all();
+
+ vpid_sync_all();
+
return 1;
}
@@ -439,6 +462,7 @@ void vmx_disable_intercept_for_msr(struct vcpu *v, u32 msr)
static int construct_vmcs(struct vcpu *v)
{
+ struct domain *d = v->domain;
uint16_t sysenter_cs;
unsigned long sysenter_eip;
@@ -448,10 +472,25 @@ static int construct_vmcs(struct vcpu *v)
__vmwrite(PIN_BASED_VM_EXEC_CONTROL, vmx_pin_based_exec_control);
__vmwrite(VM_EXIT_CONTROLS, vmx_vmexit_control);
__vmwrite(VM_ENTRY_CONTROLS, vmx_vmentry_control);
- __vmwrite(CPU_BASED_VM_EXEC_CONTROL, vmx_cpu_based_exec_control);
+
v->arch.hvm_vmx.exec_control = vmx_cpu_based_exec_control;
- if ( vmx_cpu_based_exec_control & CPU_BASED_ACTIVATE_SECONDARY_CONTROLS )
- __vmwrite(SECONDARY_VM_EXEC_CONTROL, vmx_secondary_exec_control);
+ v->arch.hvm_vmx.secondary_exec_control = vmx_secondary_exec_control;
+
+ if ( paging_mode_hap(d) )
+ {
+ v->arch.hvm_vmx.exec_control &= ~(CPU_BASED_INVLPG_EXITING |
+ CPU_BASED_CR3_LOAD_EXITING |
+ CPU_BASED_CR3_STORE_EXITING);
+ }
+ else
+ {
+ v->arch.hvm_vmx.secondary_exec_control &= ~SECONDARY_EXEC_ENABLE_EPT;
+ }
+
+ __vmwrite(CPU_BASED_VM_EXEC_CONTROL, v->arch.hvm_vmx.exec_control);
+ if ( cpu_has_vmx_secondary_exec_control )
+ __vmwrite(SECONDARY_VM_EXEC_CONTROL,
+ v->arch.hvm_vmx.secondary_exec_control);
/* MSR access bitmap. */
if ( cpu_has_vmx_msr_bitmap )
@@ -570,9 +609,10 @@ static int construct_vmcs(struct vcpu *v)
__vmwrite(VMCS_LINK_POINTER_HIGH, ~0UL);
#endif
- __vmwrite(EXCEPTION_BITMAP, (HVM_TRAP_MASK |
- (1U << TRAP_page_fault) |
- (1U << TRAP_no_device)));
+ __vmwrite(EXCEPTION_BITMAP,
+ HVM_TRAP_MASK
+ | (paging_mode_hap(d) ? 0 : (1U << TRAP_page_fault))
+ | (1U << TRAP_no_device));
v->arch.hvm_vcpu.guest_cr[0] = X86_CR0_PE | X86_CR0_ET;
hvm_update_guest_cr(v, 0);
@@ -587,6 +627,22 @@ static int construct_vmcs(struct vcpu *v)
__vmwrite(TPR_THRESHOLD, 0);
}
+ if ( paging_mode_hap(d) )
+ {
+ __vmwrite(EPT_POINTER, d->arch.hvm_domain.vmx.ept_control.eptp);
+#ifdef CONFIG_X86_PAE
+ __vmwrite(EPT_POINTER_HIGH,
+ d->arch.hvm_domain.vmx.ept_control.eptp >> 32);
+#endif
+ }
+
+ if ( cpu_has_vmx_vpid )
+ {
+ v->arch.hvm_vmx.vpid =
+ v->domain->arch.hvm_domain.vmx.vpid_base + v->vcpu_id;
+ __vmwrite(VIRTUAL_PROCESSOR_ID, v->arch.hvm_vmx.vpid);
+ }
+
vmx_vmcs_exit(v);
paging_update_paging_modes(v); /* will update HOST & GUEST_CR3 as reqd */
@@ -729,14 +785,14 @@ void vmx_destroy_vmcs(struct vcpu *v)
arch_vmx->vmcs = NULL;
}
-void vm_launch_fail(unsigned long eflags)
+void vm_launch_fail(void)
{
unsigned long error = __vmread(VM_INSTRUCTION_ERROR);
printk("<vm_launch_fail> error code %lx\n", error);
domain_crash_synchronous();
}
-void vm_resume_fail(unsigned long eflags)
+void vm_resume_fail(void)
{
unsigned long error = __vmread(VM_INSTRUCTION_ERROR);
printk("<vm_resume_fail> error code %lx\n", error);
@@ -780,6 +836,7 @@ void vmx_do_resume(struct vcpu *v)
vmx_load_vmcs(v);
hvm_migrate_timers(v);
vmx_set_host_env(v);
+ vpid_sync_vcpu_all(v);
}
debug_state = v->domain->debugger_attached;
@@ -932,6 +989,10 @@ void vmcs_dump_vcpu(struct vcpu *v)
(uint32_t)vmr(IDT_VECTORING_ERROR_CODE));
printk("TPR Threshold = 0x%02x\n",
(uint32_t)vmr(TPR_THRESHOLD));
+ printk("EPT pointer = 0x%08x%08x\n",
+ (uint32_t)vmr(EPT_POINTER_HIGH), (uint32_t)vmr(EPT_POINTER));
+ printk("Virtual processor ID = 0x%04x\n",
+ (uint32_t)vmr(VIRTUAL_PROCESSOR_ID));
vmx_vmcs_exit(v);
}
diff --git a/xen/arch/x86/hvm/vmx/vmx.c b/xen/arch/x86/hvm/vmx/vmx.c
index 29dcb68503..628cbddfcf 100644
--- a/xen/arch/x86/hvm/vmx/vmx.c
+++ b/xen/arch/x86/hvm/vmx/vmx.c
@@ -57,6 +57,8 @@ static void vmx_ctxt_switch_to(struct vcpu *v);
static int vmx_alloc_vlapic_mapping(struct domain *d);
static void vmx_free_vlapic_mapping(struct domain *d);
+static int vmx_alloc_vpid(struct domain *d);
+static void vmx_free_vpid(struct domain *d);
static void vmx_install_vlapic_mapping(struct vcpu *v);
static void vmx_update_guest_cr(struct vcpu *v, unsigned int cr);
static void vmx_update_guest_efer(struct vcpu *v);
@@ -71,12 +73,30 @@ static void vmx_invlpg_intercept(unsigned long vaddr);
static int vmx_domain_initialise(struct domain *d)
{
- return vmx_alloc_vlapic_mapping(d);
+ int rc;
+
+ d->arch.hvm_domain.vmx.ept_control.etmt = EPT_DEFAULT_MT;
+ d->arch.hvm_domain.vmx.ept_control.gaw = EPT_DEFAULT_GAW;
+ d->arch.hvm_domain.vmx.ept_control.asr =
+ pagetable_get_pfn(d->arch.phys_table);
+
+ if ( (rc = vmx_alloc_vpid(d)) != 0 )
+ return rc;
+
+ if ( (rc = vmx_alloc_vlapic_mapping(d)) != 0 )
+ {
+ vmx_free_vpid(d);
+ return rc;
+ }
+
+ return 0;
}
static void vmx_domain_destroy(struct domain *d)
{
+ ept_sync_domain(d);
vmx_free_vlapic_mapping(d);
+ vmx_free_vpid(d);
}
static int vmx_vcpu_initialise(struct vcpu *v)
@@ -492,20 +512,23 @@ static int vmx_restore_cr0_cr3(
unsigned long mfn = 0;
p2m_type_t p2mt;
- if ( cr0 & X86_CR0_PG )
+ if ( paging_mode_shadow(v->domain) )
{
- mfn = mfn_x(gfn_to_mfn(v->domain, cr3 >> PAGE_SHIFT, &p2mt));
- if ( !p2m_is_ram(p2mt) || !get_page(mfn_to_page(mfn), v->domain) )
+ if ( cr0 & X86_CR0_PG )
{
- gdprintk(XENLOG_ERR, "Invalid CR3 value=0x%lx\n", cr3);
- return -EINVAL;
+ mfn = mfn_x(gfn_to_mfn(v->domain, cr3 >> PAGE_SHIFT, &p2mt));
+ if ( !p2m_is_ram(p2mt) || !get_page(mfn_to_page(mfn), v->domain) )
+ {
+ gdprintk(XENLOG_ERR, "Invalid CR3 value=0x%lx\n", cr3);
+ return -EINVAL;
+ }
}
- }
- if ( v->arch.hvm_vcpu.guest_cr[0] & X86_CR0_PG )
- put_page(pagetable_get_page(v->arch.guest_table));
+ if ( hvm_paging_enabled(v) )
+ put_page(pagetable_get_page(v->arch.guest_table));
- v->arch.guest_table = pagetable_from_pfn(mfn);
+ v->arch.guest_table = pagetable_from_pfn(mfn);
+ }
v->arch.hvm_vcpu.guest_cr[0] = cr0 | X86_CR0_ET;
v->arch.hvm_vcpu.guest_cr[3] = cr3;
@@ -538,11 +561,6 @@ static int vmx_vmcs_restore(struct vcpu *v, struct hvm_hw_cpu *c)
vmx_update_guest_cr(v, 2);
vmx_update_guest_cr(v, 4);
-#ifdef HVM_DEBUG_SUSPEND
- printk("%s: cr3=0x%"PRIx64", cr0=0x%"PRIx64", cr4=0x%"PRIx64".\n",
- __func__, c->cr3, c->cr0, c->cr4);
-#endif
-
v->arch.hvm_vcpu.guest_efer = c->msr_efer;
vmx_update_guest_efer(v);
@@ -573,20 +591,6 @@ static int vmx_vmcs_restore(struct vcpu *v, struct hvm_hw_cpu *c)
return 0;
}
-#if defined(__x86_64__) && defined(HVM_DEBUG_SUSPEND)
-static void dump_msr_state(struct vmx_msr_state *m)
-{
- int i = 0;
- printk("**** msr state ****\n");
- printk("shadow_gs=0x%lx, flags=0x%lx, msr_items:", m->shadow_gs, m->flags);
- for ( i = 0; i < VMX_MSR_COUNT; i++ )
- printk("0x%lx,", m->msrs[i]);
- printk("\n");
-}
-#else
-#define dump_msr_state(m) ((void)0)
-#endif
-
static void vmx_save_cpu_state(struct vcpu *v, struct hvm_hw_cpu *data)
{
#ifdef __x86_64__
@@ -604,8 +608,6 @@ static void vmx_save_cpu_state(struct vcpu *v, struct hvm_hw_cpu *data)
#endif
data->tsc = hvm_get_guest_time(v);
-
- dump_msr_state(guest_state);
}
static void vmx_load_cpu_state(struct vcpu *v, struct hvm_hw_cpu *data)
@@ -624,8 +626,6 @@ static void vmx_load_cpu_state(struct vcpu *v, struct hvm_hw_cpu *data)
#endif
hvm_set_guest_time(v, data->tsc);
-
- dump_msr_state(guest_state);
}
@@ -900,6 +900,56 @@ static void vmx_set_interrupt_shadow(struct vcpu *v, unsigned int intr_shadow)
__vmwrite(GUEST_INTERRUPTIBILITY_INFO, intr_shadow);
}
+static void vmx_load_pdptrs(struct vcpu *v)
+{
+ unsigned long cr3 = v->arch.hvm_vcpu.guest_cr[3], mfn;
+ uint64_t *guest_pdptrs;
+ p2m_type_t p2mt;
+ char *p;
+
+ /* EPT needs to load PDPTRS into VMCS for PAE. */
+ if ( !hvm_pae_enabled(v) || (v->arch.hvm_vcpu.guest_efer & EFER_LMA) )
+ return;
+
+ if ( cr3 & 0x1fUL )
+ goto crash;
+
+ mfn = mfn_x(gfn_to_mfn(v->domain, cr3 >> PAGE_SHIFT, &p2mt));
+ if ( !p2m_is_ram(p2mt) )
+ goto crash;
+
+ p = map_domain_page(mfn);
+
+ guest_pdptrs = (uint64_t *)(p + (cr3 & ~PAGE_MASK));
+
+ /*
+ * We do not check the PDPTRs for validity. The CPU will do this during
+ * vm entry, and we can handle the failure there and crash the guest.
+ * The only thing we could do better here is #GP instead.
+ */
+
+ vmx_vmcs_enter(v);
+
+ __vmwrite(GUEST_PDPTR0, guest_pdptrs[0]);
+ __vmwrite(GUEST_PDPTR1, guest_pdptrs[1]);
+ __vmwrite(GUEST_PDPTR2, guest_pdptrs[2]);
+ __vmwrite(GUEST_PDPTR3, guest_pdptrs[3]);
+#ifdef CONFIG_X86_PAE
+ __vmwrite(GUEST_PDPTR0_HIGH, guest_pdptrs[0] >> 32);
+ __vmwrite(GUEST_PDPTR1_HIGH, guest_pdptrs[1] >> 32);
+ __vmwrite(GUEST_PDPTR2_HIGH, guest_pdptrs[2] >> 32);
+ __vmwrite(GUEST_PDPTR3_HIGH, guest_pdptrs[3] >> 32);
+#endif
+
+ vmx_vmcs_exit(v);
+
+ unmap_domain_page(p);
+ return;
+
+ crash:
+ domain_crash(v->domain);
+}
+
static void vmx_update_host_cr3(struct vcpu *v)
{
vmx_vmcs_enter(v);
@@ -915,7 +965,24 @@ static void vmx_update_guest_cr(struct vcpu *v, unsigned int cr)
{
case 0: {
unsigned long hw_cr0_mask =
- X86_CR0_NE | X86_CR0_PG | X86_CR0_WP | X86_CR0_PE;
+ X86_CR0_NE | X86_CR0_PG | X86_CR0_PE;
+
+ if ( paging_mode_shadow(v->domain) )
+ hw_cr0_mask |= X86_CR0_WP;
+
+ if ( paging_mode_hap(v->domain) )
+ {
+ /* We manage GUEST_CR3 when guest CR0.PE is zero. */
+ uint32_t cr3_ctls = (CPU_BASED_CR3_LOAD_EXITING |
+ CPU_BASED_CR3_STORE_EXITING);
+ v->arch.hvm_vmx.exec_control &= ~cr3_ctls;
+ if ( !hvm_paging_enabled(v) )
+ v->arch.hvm_vmx.exec_control |= cr3_ctls;
+ __vmwrite(CPU_BASED_VM_EXEC_CONTROL, v->arch.hvm_vmx.exec_control);
+
+ /* Changing CR0.PE can change some bits in real CR4. */
+ vmx_update_guest_cr(v, 4);
+ }
if ( !(v->arch.hvm_vcpu.guest_cr[0] & X86_CR0_TS) )
{
@@ -939,11 +1006,27 @@ static void vmx_update_guest_cr(struct vcpu *v, unsigned int cr)
/* CR2 is updated in exit stub. */
break;
case 3:
+ if ( paging_mode_hap(v->domain) )
+ {
+ if ( !hvm_paging_enabled(v) )
+ v->arch.hvm_vcpu.hw_cr[3] =
+ v->domain->arch.hvm_domain.params[HVM_PARAM_IDENT_PT];
+ vmx_load_pdptrs(v);
+ }
+
__vmwrite(GUEST_CR3, v->arch.hvm_vcpu.hw_cr[3]);
+ vpid_sync_vcpu_all(v);
break;
case 4:
- v->arch.hvm_vcpu.hw_cr[4] =
- v->arch.hvm_vcpu.guest_cr[4] | HVM_CR4_HOST_MASK;
+ v->arch.hvm_vcpu.hw_cr[4] = HVM_CR4_HOST_MASK;
+ if ( paging_mode_hap(v->domain) )
+ v->arch.hvm_vcpu.hw_cr[4] &= ~X86_CR4_PAE;
+ v->arch.hvm_vcpu.hw_cr[4] |= v->arch.hvm_vcpu.guest_cr[4];
+ if ( paging_mode_hap(v->domain) && !hvm_paging_enabled(v) )
+ {
+ v->arch.hvm_vcpu.hw_cr[4] |= X86_CR4_PSE;
+ v->arch.hvm_vcpu.hw_cr[4] &= ~X86_CR4_PAE;
+ }
__vmwrite(GUEST_CR4, v->arch.hvm_vcpu.hw_cr[4]);
__vmwrite(CR4_READ_SHADOW, v->arch.hvm_vcpu.guest_cr[4]);
break;
@@ -978,12 +1061,29 @@ static void vmx_update_guest_efer(struct vcpu *v)
static void vmx_flush_guest_tlbs(void)
{
- /* No tagged TLB support on VMX yet. The fact that we're in Xen
- * at all means any guest will have a clean TLB when it's next run,
- * because VMRESUME will flush it for us. */
+ /*
+ * If VPID (i.e. tagged TLB support) is not enabled, the fact that
+ * we're in Xen at all means any guest will have a clean TLB when
+ * it's next run, because VMRESUME will flush it for us.
+ *
+ * If enabled, we invalidate all translations associated with all
+ * VPID values.
+ */
+ vpid_sync_all();
}
+static void __ept_sync_domain(void *info)
+{
+ struct domain *d = info;
+ __invept(1, d->arch.hvm_domain.vmx.ept_control.eptp, 0);
+}
+void ept_sync_domain(struct domain *d)
+{
+ /* Only if using EPT and this domain has some VCPUs to dirty. */
+ if ( d->arch.hvm_domain.hap_enabled && d->vcpu[0] )
+ on_each_cpu(__ept_sync_domain, d, 1, 1);
+}
static void __vmx_inject_exception(
struct vcpu *v, int trap, int type, int error_code)
@@ -1100,6 +1200,9 @@ static struct hvm_function_table vmx_function_table = {
.invlpg_intercept = vmx_invlpg_intercept
};
+static unsigned long *vpid_bitmap;
+#define VPID_BITMAP_SIZE ((1u << VMCS_VPID_WIDTH) / MAX_VIRT_CPUS)
+
void start_vmx(void)
{
static int bootstrapped;
@@ -1133,6 +1236,25 @@ void start_vmx(void)
return;
}
+ if ( cpu_has_vmx_ept )
+ {
+ printk("VMX: EPT is available.\n");
+ vmx_function_table.hap_supported = 1;
+ }
+
+ if ( cpu_has_vmx_vpid )
+ {
+ printk("VMX: VPID is available.\n");
+
+ vpid_bitmap = xmalloc_array(
+ unsigned long, BITS_TO_LONGS(VPID_BITMAP_SIZE));
+ BUG_ON(vpid_bitmap == NULL);
+ memset(vpid_bitmap, 0, BITS_TO_LONGS(VPID_BITMAP_SIZE) * sizeof(long));
+
+ /* VPID 0 is used by VMX root mode (the hypervisor). */
+ __set_bit(0, vpid_bitmap);
+ }
+
setup_vmcs_dump();
hvm_enable(&vmx_function_table);
@@ -1635,18 +1757,47 @@ static int vmx_alloc_vlapic_mapping(struct domain *d)
share_xen_page_with_guest(virt_to_page(apic_va), d, XENSHARE_writable);
set_mmio_p2m_entry(
d, paddr_to_pfn(APIC_DEFAULT_PHYS_BASE), _mfn(virt_to_mfn(apic_va)));
- d->arch.hvm_domain.vmx_apic_access_mfn = virt_to_mfn(apic_va);
+ d->arch.hvm_domain.vmx.apic_access_mfn = virt_to_mfn(apic_va);
return 0;
}
static void vmx_free_vlapic_mapping(struct domain *d)
{
- unsigned long mfn = d->arch.hvm_domain.vmx_apic_access_mfn;
+ unsigned long mfn = d->arch.hvm_domain.vmx.apic_access_mfn;
if ( mfn != 0 )
free_xenheap_page(mfn_to_virt(mfn));
}
+static int vmx_alloc_vpid(struct domain *d)
+{
+ int idx;
+
+ if ( !cpu_has_vmx_vpid )
+ return 0;
+
+ do {
+ idx = find_first_zero_bit(vpid_bitmap, VPID_BITMAP_SIZE);
+ if ( idx >= VPID_BITMAP_SIZE )
+ {
+ dprintk(XENLOG_WARNING, "VMX VPID space exhausted.\n");
+ return -EBUSY;
+ }
+ }
+ while ( test_and_set_bit(idx, vpid_bitmap) );
+
+ d->arch.hvm_domain.vmx.vpid_base = idx * MAX_VIRT_CPUS;
+ return 0;
+}
+
+static void vmx_free_vpid(struct domain *d)
+{
+ if ( !cpu_has_vmx_vpid )
+ return;
+
+ clear_bit(d->arch.hvm_domain.vmx.vpid_base / MAX_VIRT_CPUS, vpid_bitmap);
+}
+
static void vmx_install_vlapic_mapping(struct vcpu *v)
{
paddr_t virt_page_ma, apic_page_ma;
@@ -1655,7 +1806,7 @@ static void vmx_install_vlapic_mapping(struct vcpu *v)
return;
virt_page_ma = page_to_maddr(vcpu_vlapic(v)->regs_page);
- apic_page_ma = v->domain->arch.hvm_domain.vmx_apic_access_mfn;
+ apic_page_ma = v->domain->arch.hvm_domain.vmx.apic_access_mfn;
apic_page_ma <<= PAGE_SHIFT;
vmx_vmcs_enter(v);
@@ -1900,6 +2051,51 @@ static void vmx_wbinvd_intercept(void)
wbinvd();
}
+static void ept_handle_violation(unsigned long qualification, paddr_t gpa)
+{
+ unsigned long gla_validity = qualification & EPT_GLA_VALIDITY_MASK;
+ struct domain *d = current->domain;
+ unsigned long gfn = gpa >> PAGE_SHIFT;
+ mfn_t mfn;
+ p2m_type_t t;
+
+ if ( unlikely(qualification & EPT_GAW_VIOLATION) )
+ {
+ gdprintk(XENLOG_ERR, "EPT violation: guest physical address %"PRIpaddr
+ " exceeded its width limit.\n", gpa);
+ goto crash;
+ }
+
+ if ( unlikely(gla_validity == EPT_GLA_VALIDITY_RSVD) ||
+ unlikely(gla_validity == EPT_GLA_VALIDITY_PDPTR_LOAD) )
+ {
+ gdprintk(XENLOG_ERR, "EPT violation: reserved bit or "
+ "pdptr load violation.\n");
+ goto crash;
+ }
+
+ mfn = gfn_to_mfn(d, gfn, &t);
+ if ( p2m_is_ram(t) && paging_mode_log_dirty(d) )
+ {
+ paging_mark_dirty(d, mfn_x(mfn));
+ p2m_change_type(d, gfn, p2m_ram_logdirty, p2m_ram_rw);
+ flush_tlb_mask(d->domain_dirty_cpumask);
+ return;
+ }
+
+ /* This can only happen in log-dirty mode, writing back A/D bits. */
+ if ( unlikely(gla_validity == EPT_GLA_VALIDITY_GPT_WALK) )
+ goto crash;
+
+ ASSERT(gla_validity == EPT_GLA_VALIDITY_MATCH);
+ handle_mmio();
+
+ return;
+
+ crash:
+ domain_crash(d);
+}
+
static void vmx_failed_vmentry(unsigned int exit_reason,
struct cpu_user_regs *regs)
{
@@ -1939,6 +2135,10 @@ asmlinkage void vmx_vmexit_handler(struct cpu_user_regs *regs)
unsigned long exit_qualification, inst_len = 0;
struct vcpu *v = current;
+ if ( paging_mode_hap(v->domain) && hvm_paging_enabled(v) )
+ v->arch.hvm_vcpu.guest_cr[3] = v->arch.hvm_vcpu.hw_cr[3] =
+ __vmread(GUEST_CR3);
+
exit_reason = __vmread(VM_EXIT_REASON);
hvmtrace_vmexit(v, regs->eip, exit_reason);
@@ -2171,6 +2371,17 @@ asmlinkage void vmx_vmexit_handler(struct cpu_user_regs *regs)
break;
}
+ case EXIT_REASON_EPT_VIOLATION:
+ {
+ paddr_t gpa = __vmread(GUEST_PHYSICAL_ADDRESS);
+#ifdef CONFIG_X86_PAE
+ gpa |= (paddr_t)__vmread(GUEST_PHYSICAL_ADDRESS_HIGH) << 32;
+#endif
+ exit_qualification = __vmread(EXIT_QUALIFICATION);
+ ept_handle_violation(exit_qualification, gpa);
+ break;
+ }
+
default:
exit_and_crash:
gdprintk(XENLOG_ERR, "Bad vmexit (reason %x)\n", exit_reason);
diff --git a/xen/arch/x86/hvm/vmx/x86_32/exits.S b/xen/arch/x86/hvm/vmx/x86_32/exits.S
index 11db8cfc21..eff089a112 100644
--- a/xen/arch/x86/hvm/vmx/x86_32/exits.S
+++ b/xen/arch/x86/hvm/vmx/x86_32/exits.S
@@ -129,7 +129,6 @@ ENTRY(vmx_asm_do_vmentry)
/*vmx_resume:*/
HVM_RESTORE_ALL_NOSEGREGS
VMRESUME
- pushf
call vm_resume_fail
ud2
@@ -137,7 +136,6 @@ vmx_launch:
movb $1,VCPU_vmx_launched(%ebx)
HVM_RESTORE_ALL_NOSEGREGS
VMLAUNCH
- pushf
call vm_launch_fail
ud2
diff --git a/xen/arch/x86/hvm/vmx/x86_64/exits.S b/xen/arch/x86/hvm/vmx/x86_64/exits.S
index 48da4869bd..56fdb8ad54 100644
--- a/xen/arch/x86/hvm/vmx/x86_64/exits.S
+++ b/xen/arch/x86/hvm/vmx/x86_64/exits.S
@@ -148,7 +148,6 @@ ENTRY(vmx_asm_do_vmentry)
/*vmx_resume:*/
HVM_RESTORE_ALL_NOSEGREGS
VMRESUME
- pushfq
call vm_resume_fail
ud2
@@ -156,7 +155,6 @@ vmx_launch:
movb $1,VCPU_vmx_launched(%rbx)
HVM_RESTORE_ALL_NOSEGREGS
VMLAUNCH
- pushfq
call vm_launch_fail
ud2
diff --git a/xen/arch/x86/hvm/vpic.c b/xen/arch/x86/hvm/vpic.c
index ce3943eaab..a3d6f2d9ca 100644
--- a/xen/arch/x86/hvm/vpic.c
+++ b/xen/arch/x86/hvm/vpic.c
@@ -319,7 +319,7 @@ static int vpic_intercept_pic_io(
if ( bytes != 1 )
{
gdprintk(XENLOG_WARNING, "PIC_IO bad access size %d\n", bytes);
- return 1;
+ return X86EMUL_OKAY;
}
vpic = &current->domain->arch.hvm_domain.vpic[port >> 7];
@@ -329,7 +329,7 @@ static int vpic_intercept_pic_io(
else
*val = (uint8_t)vpic_ioport_read(vpic, port);
- return 1;
+ return X86EMUL_OKAY;
}
static int vpic_intercept_elcr_io(
@@ -338,11 +338,7 @@ static int vpic_intercept_elcr_io(
struct hvm_hw_vpic *vpic;
uint32_t data;
- if ( bytes != 1 )
- {
- gdprintk(XENLOG_WARNING, "PIC_IO bad access size %d\n", bytes);
- return 1;
- }
+ BUG_ON(bytes != 1);
vpic = &current->domain->arch.hvm_domain.vpic[port & 1];
@@ -360,34 +356,8 @@ static int vpic_intercept_elcr_io(
*val = vpic->elcr & vpic_elcr_mask(vpic);
}
- return 1;
-}
-
-#ifdef HVM_DEBUG_SUSPEND
-static void vpic_info(struct hvm_hw_vpic *s)
-{
- printk("*****pic state:*****\n");
- printk("pic 0x%x.\n", s->irr);
- printk("pic 0x%x.\n", s->imr);
- printk("pic 0x%x.\n", s->isr);
- printk("pic 0x%x.\n", s->irq_base);
- printk("pic 0x%x.\n", s->init_state);
- printk("pic 0x%x.\n", s->priority_add);
- printk("pic 0x%x.\n", s->readsel_isr);
- printk("pic 0x%x.\n", s->poll);
- printk("pic 0x%x.\n", s->auto_eoi);
- printk("pic 0x%x.\n", s->rotate_on_auto_eoi);
- printk("pic 0x%x.\n", s->special_fully_nested_mode);
- printk("pic 0x%x.\n", s->special_mask_mode);
- printk("pic 0x%x.\n", s->elcr);
- printk("pic 0x%x.\n", s->int_output);
- printk("pic 0x%x.\n", s->is_master);
-}
-#else
-static void vpic_info(struct hvm_hw_vpic *s)
-{
+ return X86EMUL_OKAY;
}
-#endif
static int vpic_save(struct domain *d, hvm_domain_context_t *h)
{
@@ -398,7 +368,6 @@ static int vpic_save(struct domain *d, hvm_domain_context_t *h)
for ( i = 0; i < 2 ; i++ )
{
s = &d->arch.hvm_domain.vpic[i];
- vpic_info(s);
if ( hvm_save_entry(PIC, i, h, s) )
return 1;
}
@@ -421,7 +390,6 @@ static int vpic_load(struct domain *d, hvm_domain_context_t *h)
if ( hvm_load_entry(PIC, h, s) != 0 )
return -EINVAL;
- vpic_info(s);
return 0;
}
diff --git a/xen/arch/x86/io_apic.c b/xen/arch/x86/io_apic.c
index 9ccbefd22a..b7e50ae8f1 100644
--- a/xen/arch/x86/io_apic.c
+++ b/xen/arch/x86/io_apic.c
@@ -1244,7 +1244,11 @@ static void __init setup_ioapic_ids_from_mpc(void) { }
*/
static int __init timer_irq_works(void)
{
- unsigned long t1 = jiffies;
+ extern unsigned long pit0_ticks;
+ unsigned long t1;
+
+ t1 = pit0_ticks;
+ mb();
local_irq_enable();
/* Let ten ticks pass... */
@@ -1257,7 +1261,8 @@ static int __init timer_irq_works(void)
* might have cached one ExtINT interrupt. Finally, at
* least one tick may be lost due to delays.
*/
- if (jiffies - t1 > 4)
+ mb();
+ if (pit0_ticks - t1 > 4)
return 1;
return 0;
diff --git a/xen/arch/x86/mm.c b/xen/arch/x86/mm.c
index a1220af3b3..15f2cf57eb 100644
--- a/xen/arch/x86/mm.c
+++ b/xen/arch/x86/mm.c
@@ -299,7 +299,7 @@ int memory_is_conventional_ram(paddr_t p)
unsigned long domain_get_maximum_gpfn(struct domain *d)
{
if ( is_hvm_domain(d) )
- return d->arch.p2m.max_mapped_pfn;
+ return d->arch.p2m->max_mapped_pfn;
/* NB. PV guests specify nr_pfns rather than max_pfn so we adjust here. */
return arch_get_max_pfn(d) - 1;
}
@@ -476,7 +476,7 @@ static void invalidate_shadow_ldt(struct vcpu *v)
if ( pfn == 0 ) continue;
l1e_write(&v->arch.perdomain_ptes[i], l1e_empty());
page = mfn_to_page(pfn);
- ASSERT_PAGE_IS_TYPE(page, PGT_ldt_page);
+ ASSERT_PAGE_IS_TYPE(page, PGT_seg_desc_page);
ASSERT_PAGE_IS_DOMAIN(page, v->domain);
put_page_and_type(page);
}
@@ -530,7 +530,7 @@ int map_ldt_shadow_page(unsigned int off)
if ( unlikely(!mfn_valid(mfn)) )
return 0;
- okay = get_page_and_type(mfn_to_page(mfn), d, PGT_ldt_page);
+ okay = get_page_and_type(mfn_to_page(mfn), d, PGT_seg_desc_page);
if ( unlikely(!okay) )
return 0;
@@ -924,7 +924,7 @@ void put_page_from_l1e(l1_pgentry_t l1e, struct domain *d)
{
/* We expect this is rare so we blow the entire shadow LDT. */
if ( unlikely(((page->u.inuse.type_info & PGT_type_mask) ==
- PGT_ldt_page)) &&
+ PGT_seg_desc_page)) &&
unlikely(((page->u.inuse.type_info & PGT_count_mask) != 0)) &&
(d == e) )
{
@@ -1748,8 +1748,7 @@ static int alloc_page_type(struct page_info *page, unsigned long type)
return alloc_l3_table(page);
case PGT_l4_page_table:
return alloc_l4_table(page);
- case PGT_gdt_page:
- case PGT_ldt_page:
+ case PGT_seg_desc_page:
return alloc_segdesc_page(page);
default:
printk("Bad type in alloc_page_type %lx t=%" PRtype_info " c=%x\n",
@@ -2189,7 +2188,7 @@ int do_mmuext_op(
goto out;
}
- LOCK_BIGLOCK(d);
+ domain_lock(d);
for ( i = 0; i < count; i++ )
{
@@ -2438,7 +2437,7 @@ int do_mmuext_op(
process_deferred_ops();
- UNLOCK_BIGLOCK(d);
+ domain_unlock(d);
perfc_add(num_mmuext_ops, i);
@@ -2493,7 +2492,7 @@ int do_mmu_update(
domain_mmap_cache_init(&mapcache);
- LOCK_BIGLOCK(d);
+ domain_lock(d);
for ( i = 0; i < count; i++ )
{
@@ -2665,7 +2664,7 @@ int do_mmu_update(
process_deferred_ops();
- UNLOCK_BIGLOCK(d);
+ domain_unlock(d);
domain_mmap_cache_destroy(&mapcache);
@@ -2694,7 +2693,7 @@ static int create_grant_pte_mapping(
l1_pgentry_t ol1e;
struct domain *d = v->domain;
- ASSERT(spin_is_locked(&d->big_lock));
+ ASSERT(domain_is_locked(d));
adjust_guest_l1e(nl1e, d);
@@ -2817,7 +2816,7 @@ static int create_grant_va_mapping(
unsigned long gl1mfn;
int okay;
- ASSERT(spin_is_locked(&d->big_lock));
+ ASSERT(domain_is_locked(d));
adjust_guest_l1e(nl1e, d);
@@ -3015,7 +3014,7 @@ int do_update_va_mapping(unsigned long va, u64 val64,
if ( rc )
return rc;
- LOCK_BIGLOCK(d);
+ domain_lock(d);
pl1e = guest_map_l1e(v, va, &gl1mfn);
@@ -3028,7 +3027,7 @@ int do_update_va_mapping(unsigned long va, u64 val64,
process_deferred_ops();
- UNLOCK_BIGLOCK(d);
+ domain_unlock(d);
switch ( flags & UVMF_FLUSHTYPE_MASK )
{
@@ -3134,7 +3133,7 @@ long set_gdt(struct vcpu *v,
{
mfn = frames[i] = gmfn_to_mfn(d, frames[i]);
if ( !mfn_valid(mfn) ||
- !get_page_and_type(mfn_to_page(mfn), d, PGT_gdt_page) )
+ !get_page_and_type(mfn_to_page(mfn), d, PGT_seg_desc_page) )
goto fail;
}
@@ -3173,12 +3172,12 @@ long do_set_gdt(XEN_GUEST_HANDLE(ulong) frame_list, unsigned int entries)
if ( copy_from_guest(frames, frame_list, nr_pages) )
return -EFAULT;
- LOCK_BIGLOCK(curr->domain);
+ domain_lock(curr->domain);
if ( (ret = set_gdt(curr, frames, entries)) == 0 )
flush_tlb_local();
- UNLOCK_BIGLOCK(curr->domain);
+ domain_unlock(curr->domain);
return ret;
}
@@ -3211,12 +3210,8 @@ long do_update_descriptor(u64 pa, u64 desc)
/* Check if the given frame is in use in an unsafe context. */
switch ( page->u.inuse.type_info & PGT_type_mask )
{
- case PGT_gdt_page:
- if ( unlikely(!get_page_type(page, PGT_gdt_page)) )
- goto out;
- break;
- case PGT_ldt_page:
- if ( unlikely(!get_page_type(page, PGT_ldt_page)) )
+ case PGT_seg_desc_page:
+ if ( unlikely(!get_page_type(page, PGT_seg_desc_page)) )
goto out;
break;
default:
@@ -3316,7 +3311,7 @@ long arch_memory_op(int op, XEN_GUEST_HANDLE(void) arg)
return -EINVAL;
}
- LOCK_BIGLOCK(d);
+ domain_lock(d);
/* Remove previously mapped page if it was present. */
prev_mfn = gmfn_to_mfn(d, xatp.gpfn);
@@ -3338,7 +3333,7 @@ long arch_memory_op(int op, XEN_GUEST_HANDLE(void) arg)
/* Map at new location. */
guest_physmap_add_page(d, xatp.gpfn, mfn);
- UNLOCK_BIGLOCK(d);
+ domain_unlock(d);
rcu_unlock_domain(d);
@@ -3674,7 +3669,7 @@ int ptwr_do_page_fault(struct vcpu *v, unsigned long addr,
struct ptwr_emulate_ctxt ptwr_ctxt;
int rc;
- LOCK_BIGLOCK(d);
+ domain_lock(d);
/* Attempt to read the PTE that maps the VA being accessed. */
guest_get_eff_l1e(v, addr, &pte);
@@ -3699,12 +3694,12 @@ int ptwr_do_page_fault(struct vcpu *v, unsigned long addr,
if ( rc == X86EMUL_UNHANDLEABLE )
goto bail;
- UNLOCK_BIGLOCK(d);
+ domain_unlock(d);
perfc_incr(ptwr_emulations);
return EXCRET_fault_fixed;
bail:
- UNLOCK_BIGLOCK(d);
+ domain_unlock(d);
return 0;
}
diff --git a/xen/arch/x86/mm/hap/Makefile b/xen/arch/x86/mm/hap/Makefile
index 160e5f36bf..64cb72786e 100644
--- a/xen/arch/x86/mm/hap/Makefile
+++ b/xen/arch/x86/mm/hap/Makefile
@@ -2,6 +2,7 @@ obj-y += hap.o
obj-y += guest_walk_2level.o
obj-y += guest_walk_3level.o
obj-y += guest_walk_4level.o
+obj-y += p2m-ept.o
guest_levels = $(subst level,,$(filter %level,$(subst ., ,$(subst _, ,$(1)))))
guest_walk_defns = -DGUEST_PAGING_LEVELS=$(call guest_levels,$(1))
diff --git a/xen/arch/x86/mm/hap/hap.c b/xen/arch/x86/mm/hap/hap.c
index 15cdc23c96..e30acf6948 100644
--- a/xen/arch/x86/mm/hap/hap.c
+++ b/xen/arch/x86/mm/hap/hap.c
@@ -38,6 +38,7 @@
#include <asm/hap.h>
#include <asm/paging.h>
#include <asm/domain.h>
+#include <xen/numa.h>
#include "private.h"
@@ -61,7 +62,7 @@ int hap_enable_log_dirty(struct domain *d)
hap_unlock(d);
/* set l1e entries of P2M table to be read-only. */
- p2m_change_type_global(d, p2m_ram_rw, p2m_ram_logdirty);
+ p2m_change_entry_type_global(d, p2m_ram_rw, p2m_ram_logdirty);
flush_tlb_mask(d->domain_dirty_cpumask);
return 0;
}
@@ -73,14 +74,14 @@ int hap_disable_log_dirty(struct domain *d)
hap_unlock(d);
/* set l1e entries of P2M table with normal mode */
- p2m_change_type_global(d, p2m_ram_logdirty, p2m_ram_rw);
+ p2m_change_entry_type_global(d, p2m_ram_logdirty, p2m_ram_rw);
return 0;
}
void hap_clean_dirty_bitmap(struct domain *d)
{
/* set l1e entries of P2M table to be read-only. */
- p2m_change_type_global(d, p2m_ram_rw, p2m_ram_logdirty);
+ p2m_change_entry_type_global(d, p2m_ram_rw, p2m_ram_logdirty);
flush_tlb_mask(d->domain_dirty_cpumask);
}
@@ -135,7 +136,8 @@ static struct page_info *hap_alloc_p2m_page(struct domain *d)
&& mfn_x(page_to_mfn(pg)) >= (1UL << (32 - PAGE_SHIFT)) )
{
free_domheap_page(pg);
- pg = alloc_domheap_pages(NULL, 0, MEMF_bits(32));
+ pg = alloc_domheap_page(
+ NULL, MEMF_bits(32) | MEMF_node(domain_to_node(d)));
if ( likely(pg != NULL) )
{
void *p = hap_map_domain_page(page_to_mfn(pg));
@@ -199,7 +201,7 @@ hap_set_allocation(struct domain *d, unsigned int pages, int *preempted)
if ( d->arch.paging.hap.total_pages < pages )
{
/* Need to allocate more memory from domheap */
- pg = alloc_domheap_page(NULL);
+ pg = alloc_domheap_page(NULL, MEMF_node(domain_to_node(d)));
if ( pg == NULL )
{
HAP_PRINTK("failed to allocate hap pages.\n");
diff --git a/xen/arch/x86/mm/hap/p2m-ept.c b/xen/arch/x86/mm/hap/p2m-ept.c
new file mode 100644
index 0000000000..697ca4d697
--- /dev/null
+++ b/xen/arch/x86/mm/hap/p2m-ept.c
@@ -0,0 +1,257 @@
+/*
+ * ept-p2m.c: use the EPT page table as p2m
+ * Copyright (c) 2007, Intel Corporation.
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along with
+ * this program; if not, write to the Free Software Foundation, Inc., 59 Temple
+ * Place - Suite 330, Boston, MA 02111-1307 USA.
+ */
+
+#include <xen/config.h>
+#include <xen/domain_page.h>
+#include <xen/sched.h>
+#include <asm/current.h>
+#include <asm/types.h>
+#include <asm/domain.h>
+#include <asm/p2m.h>
+#include <asm/hvm/vmx/vmx.h>
+#include <xen/iommu.h>
+
+static void ept_p2m_type_to_flags(ept_entry_t *entry, p2m_type_t type)
+{
+ switch(type)
+ {
+ case p2m_invalid:
+ case p2m_mmio_dm:
+ default:
+ return;
+ case p2m_ram_rw:
+ case p2m_mmio_direct:
+ entry->r = entry->w = entry->x = 1;
+ return;
+ case p2m_ram_logdirty:
+ case p2m_ram_ro:
+ entry->r = entry->x = 1;
+ entry->w = 0;
+ return;
+ }
+}
+
+static int ept_next_level(struct domain *d, bool_t read_only,
+ ept_entry_t **table, unsigned long *gfn_remainder,
+ u32 shift)
+{
+ ept_entry_t *ept_entry, *next;
+ u32 index;
+
+ index = *gfn_remainder >> shift;
+ *gfn_remainder &= (1UL << shift) - 1;
+
+ ept_entry = (*table) + index;
+
+ if ( !(ept_entry->epte & 0x7) )
+ {
+ struct page_info *pg;
+
+ if ( read_only )
+ return 0;
+
+ pg = d->arch.p2m->alloc_page(d);
+ if ( pg == NULL )
+ return 0;
+
+ pg->count_info = 1;
+ pg->u.inuse.type_info = 1 | PGT_validated;
+ list_add_tail(&pg->list, &d->arch.p2m->pages);
+
+ ept_entry->emt = 0;
+ ept_entry->sp_avail = 0;
+ ept_entry->avail1 = 0;
+ ept_entry->mfn = page_to_mfn(pg);
+ ept_entry->rsvd = 0;
+ ept_entry->avail2 = 0;
+ /* last step */
+ ept_entry->r = ept_entry->w = ept_entry->x = 1;
+ }
+
+ next = map_domain_page(ept_entry->mfn);
+ unmap_domain_page(*table);
+ *table = next;
+
+ return 1;
+}
+
+static int
+ept_set_entry(struct domain *d, unsigned long gfn, mfn_t mfn, p2m_type_t p2mt)
+{
+ ept_entry_t *table =
+ map_domain_page(mfn_x(pagetable_get_mfn(d->arch.phys_table)));
+ unsigned long gfn_remainder = gfn;
+ ept_entry_t *ept_entry = NULL;
+ u32 index;
+ int i, rv = 0;
+
+ /* Should check if gfn obeys GAW here */
+
+ for ( i = EPT_DEFAULT_GAW; i > 0; i-- )
+ if ( !ept_next_level(d, 0, &table, &gfn_remainder,
+ i * EPT_TABLE_ORDER) )
+ goto out;
+
+ index = gfn_remainder;
+ ept_entry = table + index;
+
+ if ( mfn_valid(mfn_x(mfn)) || (p2mt == p2m_mmio_direct) )
+ {
+ /* Track the highest gfn for which we have ever had a valid mapping */
+ if ( gfn > d->arch.p2m->max_mapped_pfn )
+ d->arch.p2m->max_mapped_pfn = gfn;
+
+ ept_entry->emt = EPT_DEFAULT_MT;
+ ept_entry->sp_avail = 0;
+ ept_entry->avail1 = p2mt;
+ ept_entry->mfn = mfn_x(mfn);
+ ept_entry->rsvd = 0;
+ ept_entry->avail2 = 0;
+ /* last step */
+ ept_entry->r = ept_entry->w = ept_entry->x = 1;
+ ept_p2m_type_to_flags(ept_entry, p2mt);
+ }
+ else
+ ept_entry->epte = 0;
+
+ /* Success */
+ rv = 1;
+
+ out:
+ unmap_domain_page(table);
+
+ ept_sync_domain(d);
+
+ /* If p2m table is shared with vtd page-table. */
+ if ( iommu_enabled && is_hvm_domain(d) && (p2mt == p2m_mmio_direct) )
+ iommu_flush(d, gfn, (u64*)ept_entry);
+
+ return rv;
+}
+
+/* Read ept p2m entries */
+static mfn_t ept_get_entry(struct domain *d, unsigned long gfn, p2m_type_t *t)
+{
+ ept_entry_t *table =
+ map_domain_page(mfn_x(pagetable_get_mfn(d->arch.phys_table)));
+ unsigned long gfn_remainder = gfn;
+ ept_entry_t *ept_entry;
+ u32 index;
+ int i;
+ mfn_t mfn = _mfn(INVALID_MFN);
+
+ *t = p2m_mmio_dm;
+
+ /* This pfn is higher than the highest the p2m map currently holds */
+ if ( gfn > d->arch.p2m->max_mapped_pfn )
+ goto out;
+
+ /* Should check if gfn obeys GAW here. */
+
+ for ( i = EPT_DEFAULT_GAW; i > 0; i-- )
+ if ( !ept_next_level(d, 1, &table, &gfn_remainder,
+ i * EPT_TABLE_ORDER) )
+ goto out;
+
+ index = gfn_remainder;
+ ept_entry = table + index;
+
+ if ( ept_entry->avail1 != p2m_invalid )
+ {
+ *t = ept_entry->avail1;
+ mfn = _mfn(ept_entry->mfn);
+ }
+
+ out:
+ unmap_domain_page(table);
+ return mfn;
+}
+
+static mfn_t ept_get_entry_current(unsigned long gfn, p2m_type_t *t)
+{
+ return ept_get_entry(current->domain, gfn, t);
+}
+
+/* Walk the whole p2m table, changing any entries of the old type
+ * to the new type. This is used in hardware-assisted paging to
+ * quickly enable or diable log-dirty tracking */
+
+static void ept_change_entry_type_global(struct domain *d,
+ p2m_type_t ot, p2m_type_t nt)
+{
+ ept_entry_t *l4e, *l3e, *l2e, *l1e;
+ int i4, i3, i2, i1;
+
+ if ( pagetable_get_pfn(d->arch.phys_table) == 0 )
+ return;
+
+ BUG_ON(EPT_DEFAULT_GAW != 3);
+
+ l4e = map_domain_page(mfn_x(pagetable_get_mfn(d->arch.phys_table)));
+ for (i4 = 0; i4 < EPT_PAGETABLE_ENTRIES; i4++ )
+ {
+ if ( !l4e[i4].epte || l4e[i4].sp_avail )
+ continue;
+ l3e = map_domain_page(l4e[i4].mfn);
+ for ( i3 = 0; i3 < EPT_PAGETABLE_ENTRIES; i3++ )
+ {
+ if ( !l3e[i3].epte || l3e[i3].sp_avail )
+ continue;
+ l2e = map_domain_page(l3e[i3].mfn);
+ for ( i2 = 0; i2 < EPT_PAGETABLE_ENTRIES; i2++ )
+ {
+ if ( !l2e[i2].epte || l2e[i2].sp_avail )
+ continue;
+ l1e = map_domain_page(l2e[i2].mfn);
+ for ( i1 = 0; i1 < EPT_PAGETABLE_ENTRIES; i1++ )
+ {
+ if ( !l1e[i1].epte )
+ continue;
+ if ( l1e[i1].avail1 != ot )
+ continue;
+ l1e[i1].avail1 = nt;
+ ept_p2m_type_to_flags(l1e+i1, nt);
+ }
+ unmap_domain_page(l1e);
+ }
+ unmap_domain_page(l2e);
+ }
+ unmap_domain_page(l3e);
+ }
+ unmap_domain_page(l4e);
+
+ ept_sync_domain(d);
+}
+
+void ept_p2m_init(struct domain *d)
+{
+ d->arch.p2m->set_entry = ept_set_entry;
+ d->arch.p2m->get_entry = ept_get_entry;
+ d->arch.p2m->get_entry_current = ept_get_entry_current;
+ d->arch.p2m->change_entry_type_global = ept_change_entry_type_global;
+}
+
+/*
+ * Local variables:
+ * mode: C
+ * c-set-style: "BSD"
+ * c-basic-offset: 4
+ * tab-width: 4
+ * indent-tabs-mode: nil
+ * End:
+ */
diff --git a/xen/arch/x86/mm/p2m.c b/xen/arch/x86/mm/p2m.c
index e8298fb3bd..faee13955e 100644
--- a/xen/arch/x86/mm/p2m.c
+++ b/xen/arch/x86/mm/p2m.c
@@ -27,6 +27,7 @@
#include <asm/page.h>
#include <asm/paging.h>
#include <asm/p2m.h>
+#include <asm/hvm/vmx/vmx.h> /* ept_p2m_init() */
#include <xen/iommu.h>
/* Debugging and auditing of the P2M code? */
@@ -41,36 +42,37 @@
* Locking discipline: always acquire this lock before the shadow or HAP one
*/
-#define p2m_lock_init(_d) \
- do { \
- spin_lock_init(&(_d)->arch.p2m.lock); \
- (_d)->arch.p2m.locker = -1; \
- (_d)->arch.p2m.locker_function = "nobody"; \
+#define p2m_lock_init(_p2m) \
+ do { \
+ spin_lock_init(&(_p2m)->lock); \
+ (_p2m)->locker = -1; \
+ (_p2m)->locker_function = "nobody"; \
} while (0)
-#define p2m_lock(_d) \
- do { \
- if ( unlikely((_d)->arch.p2m.locker == current->processor) )\
- { \
- printk("Error: p2m lock held by %s\n", \
- (_d)->arch.p2m.locker_function); \
- BUG(); \
- } \
- spin_lock(&(_d)->arch.p2m.lock); \
- ASSERT((_d)->arch.p2m.locker == -1); \
- (_d)->arch.p2m.locker = current->processor; \
- (_d)->arch.p2m.locker_function = __func__; \
+#define p2m_lock(_p2m) \
+ do { \
+ if ( unlikely((_p2m)->locker == current->processor) ) \
+ { \
+ printk("Error: p2m lock held by %s\n", \
+ (_p2m)->locker_function); \
+ BUG(); \
+ } \
+ spin_lock(&(_p2m)->lock); \
+ ASSERT((_p2m)->locker == -1); \
+ (_p2m)->locker = current->processor; \
+ (_p2m)->locker_function = __func__; \
} while (0)
-#define p2m_unlock(_d) \
- do { \
- ASSERT((_d)->arch.p2m.locker == current->processor); \
- (_d)->arch.p2m.locker = -1; \
- (_d)->arch.p2m.locker_function = "nobody"; \
- spin_unlock(&(_d)->arch.p2m.lock); \
+#define p2m_unlock(_p2m) \
+ do { \
+ ASSERT((_p2m)->locker == current->processor); \
+ (_p2m)->locker = -1; \
+ (_p2m)->locker_function = "nobody"; \
+ spin_unlock(&(_p2m)->lock); \
} while (0)
-
+#define p2m_locked_by_me(_p2m) \
+ (current->processor == (_p2m)->locker)
/* Printouts */
#define P2M_PRINTK(_f, _a...) \
@@ -152,7 +154,7 @@ p2m_next_level(struct domain *d, mfn_t *table_mfn, void **table,
l1_pgentry_t *p2m_entry;
l1_pgentry_t new_entry;
void *next;
- ASSERT(d->arch.p2m.alloc_page);
+ ASSERT(d->arch.p2m->alloc_page);
if ( !(p2m_entry = p2m_find_entry(*table, gfn_remainder, gfn,
shift, max)) )
@@ -160,10 +162,10 @@ p2m_next_level(struct domain *d, mfn_t *table_mfn, void **table,
if ( !(l1e_get_flags(*p2m_entry) & _PAGE_PRESENT) )
{
- struct page_info *pg = d->arch.p2m.alloc_page(d);
+ struct page_info *pg = d->arch.p2m->alloc_page(d);
if ( pg == NULL )
return 0;
- list_add_tail(&pg->list, &d->arch.p2m.pages);
+ list_add_tail(&pg->list, &d->arch.p2m->pages);
pg->u.inuse.type_info = type | 1 | PGT_validated;
pg->count_info = 1;
@@ -202,7 +204,7 @@ p2m_next_level(struct domain *d, mfn_t *table_mfn, void **table,
// Returns 0 on error (out of memory)
static int
-set_p2m_entry(struct domain *d, unsigned long gfn, mfn_t mfn, p2m_type_t p2mt)
+p2m_set_entry(struct domain *d, unsigned long gfn, mfn_t mfn, p2m_type_t p2mt)
{
// XXX -- this might be able to be faster iff current->domain == d
mfn_t table_mfn = pagetable_get_mfn(d->arch.phys_table);
@@ -244,8 +246,8 @@ set_p2m_entry(struct domain *d, unsigned long gfn, mfn_t mfn, p2m_type_t p2mt)
ASSERT(p2m_entry);
/* Track the highest gfn for which we have ever had a valid mapping */
- if ( mfn_valid(mfn) && (gfn > d->arch.p2m.max_mapped_pfn) )
- d->arch.p2m.max_mapped_pfn = gfn;
+ if ( mfn_valid(mfn) && (gfn > d->arch.p2m->max_mapped_pfn) )
+ d->arch.p2m->max_mapped_pfn = gfn;
if ( mfn_valid(mfn) || (p2mt == p2m_mmio_direct) )
entry_content = l1e_from_pfn(mfn_x(mfn), p2m_type_to_flags(p2mt));
@@ -279,14 +281,170 @@ set_p2m_entry(struct domain *d, unsigned long gfn, mfn_t mfn, p2m_type_t p2mt)
return rv;
}
+static mfn_t
+p2m_gfn_to_mfn(struct domain *d, unsigned long gfn, p2m_type_t *t)
+{
+ mfn_t mfn;
+ paddr_t addr = ((paddr_t)gfn) << PAGE_SHIFT;
+ l2_pgentry_t *l2e;
+ l1_pgentry_t *l1e;
+
+ ASSERT(paging_mode_translate(d));
+
+ /* XXX This is for compatibility with the old model, where anything not
+ * XXX marked as RAM was considered to be emulated MMIO space.
+ * XXX Once we start explicitly registering MMIO regions in the p2m
+ * XXX we will return p2m_invalid for unmapped gfns */
+ *t = p2m_mmio_dm;
+
+ mfn = pagetable_get_mfn(d->arch.phys_table);
+
+ if ( gfn > d->arch.p2m->max_mapped_pfn )
+ /* This pfn is higher than the highest the p2m map currently holds */
+ return _mfn(INVALID_MFN);
+
+#if CONFIG_PAGING_LEVELS >= 4
+ {
+ l4_pgentry_t *l4e = map_domain_page(mfn_x(mfn));
+ l4e += l4_table_offset(addr);
+ if ( (l4e_get_flags(*l4e) & _PAGE_PRESENT) == 0 )
+ {
+ unmap_domain_page(l4e);
+ return _mfn(INVALID_MFN);
+ }
+ mfn = _mfn(l4e_get_pfn(*l4e));
+ unmap_domain_page(l4e);
+ }
+#endif
+#if CONFIG_PAGING_LEVELS >= 3
+ {
+ l3_pgentry_t *l3e = map_domain_page(mfn_x(mfn));
+#if CONFIG_PAGING_LEVELS == 3
+ /* On PAE hosts the p2m has eight l3 entries, not four (see
+ * shadow_set_p2m_entry()) so we can't use l3_table_offset.
+ * Instead, just count the number of l3es from zero. It's safe
+ * to do this because we already checked that the gfn is within
+ * the bounds of the p2m. */
+ l3e += (addr >> L3_PAGETABLE_SHIFT);
+#else
+ l3e += l3_table_offset(addr);
+#endif
+ if ( (l3e_get_flags(*l3e) & _PAGE_PRESENT) == 0 )
+ {
+ unmap_domain_page(l3e);
+ return _mfn(INVALID_MFN);
+ }
+ mfn = _mfn(l3e_get_pfn(*l3e));
+ unmap_domain_page(l3e);
+ }
+#endif
+
+ l2e = map_domain_page(mfn_x(mfn));
+ l2e += l2_table_offset(addr);
+ if ( (l2e_get_flags(*l2e) & _PAGE_PRESENT) == 0 )
+ {
+ unmap_domain_page(l2e);
+ return _mfn(INVALID_MFN);
+ }
+ mfn = _mfn(l2e_get_pfn(*l2e));
+ unmap_domain_page(l2e);
+
+ l1e = map_domain_page(mfn_x(mfn));
+ l1e += l1_table_offset(addr);
+ if ( (l1e_get_flags(*l1e) & _PAGE_PRESENT) == 0 )
+ {
+ unmap_domain_page(l1e);
+ return _mfn(INVALID_MFN);
+ }
+ mfn = _mfn(l1e_get_pfn(*l1e));
+ *t = p2m_flags_to_type(l1e_get_flags(*l1e));
+ unmap_domain_page(l1e);
+
+ ASSERT(mfn_valid(mfn) || !p2m_is_ram(*t));
+ return (p2m_is_valid(*t)) ? mfn : _mfn(INVALID_MFN);
+}
+
+/* Read the current domain's p2m table (through the linear mapping). */
+static mfn_t p2m_gfn_to_mfn_current(unsigned long gfn, p2m_type_t *t)
+{
+ mfn_t mfn = _mfn(INVALID_MFN);
+ p2m_type_t p2mt = p2m_mmio_dm;
+ /* XXX This is for compatibility with the old model, where anything not
+ * XXX marked as RAM was considered to be emulated MMIO space.
+ * XXX Once we start explicitly registering MMIO regions in the p2m
+ * XXX we will return p2m_invalid for unmapped gfns */
+
+ if ( gfn <= current->domain->arch.p2m->max_mapped_pfn )
+ {
+ l1_pgentry_t l1e = l1e_empty();
+ int ret;
+
+ ASSERT(gfn < (RO_MPT_VIRT_END - RO_MPT_VIRT_START)
+ / sizeof(l1_pgentry_t));
+
+ /* Need to __copy_from_user because the p2m is sparse and this
+ * part might not exist */
+ ret = __copy_from_user(&l1e,
+ &phys_to_machine_mapping[gfn],
+ sizeof(l1e));
+
+ if ( ret == 0 ) {
+ p2mt = p2m_flags_to_type(l1e_get_flags(l1e));
+ ASSERT(l1e_get_pfn(l1e) != INVALID_MFN || !p2m_is_ram(p2mt));
+ if ( p2m_is_valid(p2mt) )
+ mfn = _mfn(l1e_get_pfn(l1e));
+ else
+ /* XXX see above */
+ p2mt = p2m_mmio_dm;
+ }
+ }
+
+ *t = p2mt;
+ return mfn;
+}
/* Init the datastructures for later use by the p2m code */
-void p2m_init(struct domain *d)
+int p2m_init(struct domain *d)
{
- p2m_lock_init(d);
- INIT_LIST_HEAD(&d->arch.p2m.pages);
+ struct p2m_domain *p2m;
+
+ p2m = xmalloc(struct p2m_domain);
+ if ( p2m == NULL )
+ return -ENOMEM;
+
+ d->arch.p2m = p2m;
+
+ memset(p2m, 0, sizeof(*p2m));
+ p2m_lock_init(p2m);
+ INIT_LIST_HEAD(&p2m->pages);
+
+ p2m->set_entry = p2m_set_entry;
+ p2m->get_entry = p2m_gfn_to_mfn;
+ p2m->get_entry_current = p2m_gfn_to_mfn_current;
+ p2m->change_entry_type_global = p2m_change_type_global;
+
+ if ( is_hvm_domain(d) && d->arch.hvm_domain.hap_enabled &&
+ (boot_cpu_data.x86_vendor == X86_VENDOR_INTEL) )
+ ept_p2m_init(d);
+
+ return 0;
}
+void p2m_change_entry_type_global(struct domain *d,
+ p2m_type_t ot, p2m_type_t nt)
+{
+ struct p2m_domain *p2m = d->arch.p2m;
+
+ p2m_lock(p2m);
+ p2m->change_entry_type_global(d, ot, nt);
+ p2m_unlock(p2m);
+}
+
+static inline
+int set_p2m_entry(struct domain *d, unsigned long gfn, mfn_t mfn, p2m_type_t p2mt)
+{
+ return d->arch.p2m->set_entry(d, gfn, mfn, p2mt);
+}
// Allocate a new p2m table for a domain.
//
@@ -308,28 +466,29 @@ int p2m_alloc_table(struct domain *d,
struct page_info *page, *p2m_top;
unsigned int page_count = 0;
unsigned long gfn = -1UL;
+ struct p2m_domain *p2m = d->arch.p2m;
- p2m_lock(d);
+ p2m_lock(p2m);
if ( pagetable_get_pfn(d->arch.phys_table) != 0 )
{
P2M_ERROR("p2m already allocated for this domain\n");
- p2m_unlock(d);
+ p2m_unlock(p2m);
return -EINVAL;
}
P2M_PRINTK("allocating p2m table\n");
- d->arch.p2m.alloc_page = alloc_page;
- d->arch.p2m.free_page = free_page;
+ p2m->alloc_page = alloc_page;
+ p2m->free_page = free_page;
- p2m_top = d->arch.p2m.alloc_page(d);
+ p2m_top = p2m->alloc_page(d);
if ( p2m_top == NULL )
{
- p2m_unlock(d);
+ p2m_unlock(p2m);
return -ENOMEM;
}
- list_add_tail(&p2m_top->list, &d->arch.p2m.pages);
+ list_add_tail(&p2m_top->list, &p2m->pages);
p2m_top->count_info = 1;
p2m_top->u.inuse.type_info =
@@ -376,13 +535,13 @@ int p2m_alloc_table(struct domain *d,
#endif
P2M_PRINTK("p2m table initialised (%u pages)\n", page_count);
- p2m_unlock(d);
+ p2m_unlock(p2m);
return 0;
error:
P2M_PRINTK("failed to initialize p2m table, gfn=%05lx, mfn=%"
PRI_mfn "\n", gfn, mfn_x(mfn));
- p2m_unlock(d);
+ p2m_unlock(p2m);
return -ENOMEM;
}
@@ -392,101 +551,24 @@ void p2m_teardown(struct domain *d)
{
struct list_head *entry, *n;
struct page_info *pg;
+ struct p2m_domain *p2m = d->arch.p2m;
- p2m_lock(d);
+ p2m_lock(p2m);
d->arch.phys_table = pagetable_null();
- list_for_each_safe(entry, n, &d->arch.p2m.pages)
+ list_for_each_safe(entry, n, &p2m->pages)
{
pg = list_entry(entry, struct page_info, list);
list_del(entry);
- d->arch.p2m.free_page(d, pg);
+ p2m->free_page(d, pg);
}
- p2m_unlock(d);
+ p2m_unlock(p2m);
}
-mfn_t
-gfn_to_mfn_foreign(struct domain *d, unsigned long gfn, p2m_type_t *t)
-/* Read another domain's p2m entries */
+void p2m_final_teardown(struct domain *d)
{
- mfn_t mfn;
- paddr_t addr = ((paddr_t)gfn) << PAGE_SHIFT;
- l2_pgentry_t *l2e;
- l1_pgentry_t *l1e;
-
- ASSERT(paging_mode_translate(d));
-
- /* XXX This is for compatibility with the old model, where anything not
- * XXX marked as RAM was considered to be emulated MMIO space.
- * XXX Once we start explicitly registering MMIO regions in the p2m
- * XXX we will return p2m_invalid for unmapped gfns */
- *t = p2m_mmio_dm;
-
- mfn = pagetable_get_mfn(d->arch.phys_table);
-
- if ( gfn > d->arch.p2m.max_mapped_pfn )
- /* This pfn is higher than the highest the p2m map currently holds */
- return _mfn(INVALID_MFN);
-
-#if CONFIG_PAGING_LEVELS >= 4
- {
- l4_pgentry_t *l4e = map_domain_page(mfn_x(mfn));
- l4e += l4_table_offset(addr);
- if ( (l4e_get_flags(*l4e) & _PAGE_PRESENT) == 0 )
- {
- unmap_domain_page(l4e);
- return _mfn(INVALID_MFN);
- }
- mfn = _mfn(l4e_get_pfn(*l4e));
- unmap_domain_page(l4e);
- }
-#endif
-#if CONFIG_PAGING_LEVELS >= 3
- {
- l3_pgentry_t *l3e = map_domain_page(mfn_x(mfn));
-#if CONFIG_PAGING_LEVELS == 3
- /* On PAE hosts the p2m has eight l3 entries, not four (see
- * shadow_set_p2m_entry()) so we can't use l3_table_offset.
- * Instead, just count the number of l3es from zero. It's safe
- * to do this because we already checked that the gfn is within
- * the bounds of the p2m. */
- l3e += (addr >> L3_PAGETABLE_SHIFT);
-#else
- l3e += l3_table_offset(addr);
-#endif
- if ( (l3e_get_flags(*l3e) & _PAGE_PRESENT) == 0 )
- {
- unmap_domain_page(l3e);
- return _mfn(INVALID_MFN);
- }
- mfn = _mfn(l3e_get_pfn(*l3e));
- unmap_domain_page(l3e);
- }
-#endif
-
- l2e = map_domain_page(mfn_x(mfn));
- l2e += l2_table_offset(addr);
- if ( (l2e_get_flags(*l2e) & _PAGE_PRESENT) == 0 )
- {
- unmap_domain_page(l2e);
- return _mfn(INVALID_MFN);
- }
- mfn = _mfn(l2e_get_pfn(*l2e));
- unmap_domain_page(l2e);
-
- l1e = map_domain_page(mfn_x(mfn));
- l1e += l1_table_offset(addr);
- if ( (l1e_get_flags(*l1e) & _PAGE_PRESENT) == 0 )
- {
- unmap_domain_page(l1e);
- return _mfn(INVALID_MFN);
- }
- mfn = _mfn(l1e_get_pfn(*l1e));
- *t = p2m_flags_to_type(l1e_get_flags(*l1e));
- unmap_domain_page(l1e);
-
- ASSERT(mfn_valid(mfn) || !p2m_is_ram(*t));
- return (p2m_is_valid(*t)) ? mfn : _mfn(INVALID_MFN);
+ xfree(d->arch.p2m);
+ d->arch.p2m = NULL;
}
#if P2M_AUDIT
@@ -564,7 +646,7 @@ static void audit_p2m(struct domain *d)
set_gpfn_from_mfn(mfn, INVALID_M2P_ENTRY);
}
- if ( test_linear && (gfn <= d->arch.p2m.max_mapped_pfn) )
+ if ( test_linear && (gfn <= d->arch.p2m->max_mapped_pfn) )
{
lp2mfn = mfn_x(gfn_to_mfn_current(gfn, &type));
if ( lp2mfn != mfn_x(p2mfn) )
@@ -695,11 +777,11 @@ void
guest_physmap_remove_page(struct domain *d, unsigned long gfn,
unsigned long mfn)
{
- p2m_lock(d);
+ p2m_lock(d->arch.p2m);
audit_p2m(d);
p2m_remove_page(d, gfn, mfn);
audit_p2m(d);
- p2m_unlock(d);
+ p2m_unlock(d->arch.p2m);
}
int
@@ -722,7 +804,7 @@ guest_physmap_add_entry(struct domain *d, unsigned long gfn,
*/
if ( paging_mode_hap(d) && (gfn > 0xfffffUL) )
{
- if ( !test_and_set_bool(d->arch.hvm_domain.amd_npt_4gb_warning) )
+ if ( !test_and_set_bool(d->arch.hvm_domain.svm.npt_4gb_warning) )
dprintk(XENLOG_WARNING, "Dom%d failed to populate memory beyond"
" 4GB: specify 'hap=0' domain config option.\n",
d->domain_id);
@@ -730,7 +812,7 @@ guest_physmap_add_entry(struct domain *d, unsigned long gfn,
}
#endif
- p2m_lock(d);
+ p2m_lock(d->arch.p2m);
audit_p2m(d);
P2M_DEBUG("adding gfn=%#lx mfn=%#lx\n", gfn, mfn);
@@ -781,7 +863,7 @@ guest_physmap_add_entry(struct domain *d, unsigned long gfn,
}
audit_p2m(d);
- p2m_unlock(d);
+ p2m_unlock(d->arch.p2m);
return rc;
}
@@ -812,7 +894,7 @@ void p2m_change_type_global(struct domain *d, p2m_type_t ot, p2m_type_t nt)
if ( pagetable_get_pfn(d->arch.phys_table) == 0 )
return;
- p2m_lock(d);
+ ASSERT(p2m_locked_by_me(d->arch.p2m));
#if CONFIG_PAGING_LEVELS == 4
l4e = map_domain_page(mfn_x(pagetable_get_mfn(d->arch.phys_table)));
@@ -860,7 +942,7 @@ void p2m_change_type_global(struct domain *d, p2m_type_t ot, p2m_type_t nt)
mfn = l1e_get_pfn(l1e[i1]);
gfn = get_gpfn_from_mfn(mfn);
/* create a new 1le entry with the new type */
- flags = p2m_flags_to_type(nt);
+ flags = p2m_type_to_flags(nt);
l1e_content = l1e_from_pfn(mfn, flags);
paging_write_p2m_entry(d, gfn, &l1e[i1],
l1mfn, l1e_content, 1);
@@ -884,7 +966,6 @@ void p2m_change_type_global(struct domain *d, p2m_type_t ot, p2m_type_t nt)
unmap_domain_page(l2e);
#endif
- p2m_unlock(d);
}
/* Modify the p2m type of a single gfn from ot to nt, returning the
@@ -895,13 +976,13 @@ p2m_type_t p2m_change_type(struct domain *d, unsigned long gfn,
p2m_type_t pt;
mfn_t mfn;
- p2m_lock(d);
+ p2m_lock(d->arch.p2m);
mfn = gfn_to_mfn(d, gfn, &pt);
if ( pt == ot )
set_p2m_entry(d, gfn, mfn, nt);
- p2m_unlock(d);
+ p2m_unlock(d->arch.p2m);
return pt;
}
diff --git a/xen/arch/x86/mm/paging.c b/xen/arch/x86/mm/paging.c
index e6c3cbb9e6..2247d8dd68 100644
--- a/xen/arch/x86/mm/paging.c
+++ b/xen/arch/x86/mm/paging.c
@@ -26,6 +26,7 @@
#include <asm/p2m.h>
#include <asm/hap.h>
#include <asm/guest_access.h>
+#include <xen/numa.h>
#include <xsm/xsm.h>
#define hap_enabled(d) (is_hvm_domain(d) && (d)->arch.hvm_domain.hap_enabled)
@@ -99,8 +100,9 @@
static mfn_t paging_new_log_dirty_page(struct domain *d, void **mapping_p)
{
mfn_t mfn;
- struct page_info *page = alloc_domheap_page(NULL);
+ struct page_info *page;
+ page = alloc_domheap_page(NULL, MEMF_node(domain_to_node(d)));
if ( unlikely(page == NULL) )
{
d->arch.paging.log_dirty.failed_allocs++;
@@ -482,9 +484,12 @@ void paging_log_dirty_teardown(struct domain*d)
/* CODE FOR PAGING SUPPORT */
/************************************************/
/* Domain paging struct initialization. */
-void paging_domain_init(struct domain *d)
+int paging_domain_init(struct domain *d)
{
- p2m_init(d);
+ int rc;
+
+ if ( (rc = p2m_init(d)) != 0 )
+ return rc;
/* The order of the *_init calls below is important, as the later
* ones may rewrite some common fields. Shadow pagetables are the
@@ -494,6 +499,8 @@ void paging_domain_init(struct domain *d)
/* ... but we will use hardware assistance if it's available. */
if ( hap_enabled(d) )
hap_domain_init(d);
+
+ return 0;
}
/* vcpu paging struct initialization goes here */
@@ -587,6 +594,8 @@ void paging_final_teardown(struct domain *d)
hap_final_teardown(d);
else
shadow_final_teardown(d);
+
+ p2m_final_teardown(d);
}
/* Enable an arbitrary paging-assistance mode. Call once at domain
diff --git a/xen/arch/x86/mm/shadow/common.c b/xen/arch/x86/mm/shadow/common.c
index e4a04bb456..d7239cde77 100644
--- a/xen/arch/x86/mm/shadow/common.c
+++ b/xen/arch/x86/mm/shadow/common.c
@@ -36,6 +36,7 @@
#include <asm/current.h>
#include <asm/flushtlb.h>
#include <asm/shadow.h>
+#include <xen/numa.h>
#include "private.h"
@@ -1249,7 +1250,7 @@ static unsigned int sh_set_allocation(struct domain *d,
{
/* Need to allocate more memory from domheap */
sp = (struct shadow_page_info *)
- alloc_domheap_pages(NULL, order, 0);
+ alloc_domheap_pages(NULL, order, MEMF_node(domain_to_node(d)));
if ( sp == NULL )
{
SHADOW_PRINTK("failed to allocate shadow pages.\n");
@@ -2171,13 +2172,12 @@ void sh_remove_shadows(struct vcpu *v, mfn_t gmfn, int fast, int all)
#undef DO_UNSHADOW
/* If that didn't catch the shadows, something is wrong */
- if ( !fast && (pg->count_info & PGC_page_table) )
+ if ( !fast && all && (pg->count_info & PGC_page_table) )
{
SHADOW_ERROR("can't find all shadows of mfn %05lx "
"(shadow_flags=%08lx)\n",
mfn_x(gmfn), pg->shadow_flags);
- if ( all )
- domain_crash(v->domain);
+ domain_crash(v->domain);
}
/* Need to flush TLBs now, so that linear maps are safe next time we
diff --git a/xen/arch/x86/pci.c b/xen/arch/x86/pci.c
new file mode 100644
index 0000000000..341457b4bc
--- /dev/null
+++ b/xen/arch/x86/pci.c
@@ -0,0 +1,118 @@
+/******************************************************************************
+ * pci.c
+ *
+ * PCI access functions.
+ */
+
+#include <xen/config.h>
+#include <xen/pci.h>
+#include <xen/spinlock.h>
+#include <asm/io.h>
+
+#define PCI_CONF_ADDRESS(bus, dev, func, reg) \
+ (0x80000000 | (bus << 16) | (dev << 11) | (func << 8) | (reg & ~3))
+
+static DEFINE_SPINLOCK(pci_config_lock);
+
+uint32_t pci_conf_read(uint32_t cf8, uint8_t offset, uint8_t bytes)
+{
+ unsigned long flags;
+ uint32_t value;
+
+ BUG_ON((offset + bytes) > 4);
+
+ spin_lock_irqsave(&pci_config_lock, flags);
+
+ outl(cf8, 0xcf8);
+
+ switch ( bytes )
+ {
+ case 1:
+ value = inb(0xcfc + offset);
+ break;
+ case 2:
+ value = inw(0xcfc + offset);
+ break;
+ case 4:
+ value = inl(0xcfc + offset);
+ break;
+ default:
+ value = 0;
+ BUG();
+ }
+
+ spin_unlock_irqrestore(&pci_config_lock, flags);
+
+ return value;
+}
+
+void pci_conf_write(uint32_t cf8, uint8_t offset, uint8_t bytes, uint32_t data)
+{
+ unsigned long flags;
+
+ BUG_ON((offset + bytes) > 4);
+
+ spin_lock_irqsave(&pci_config_lock, flags);
+
+ outl(cf8, 0xcf8);
+
+ switch ( bytes )
+ {
+ case 1:
+ outb((uint8_t)data, 0xcfc + offset);
+ break;
+ case 2:
+ outw((uint16_t)data, 0xcfc + offset);
+ break;
+ case 4:
+ outl(data, 0xcfc + offset);
+ break;
+ }
+
+ spin_unlock_irqrestore(&pci_config_lock, flags);
+}
+
+uint8_t pci_conf_read8(
+ unsigned int bus, unsigned int dev, unsigned int func, unsigned int reg)
+{
+ BUG_ON((bus > 255) || (dev > 31) || (func > 7) || (reg > 255));
+ return pci_conf_read(PCI_CONF_ADDRESS(bus, dev, func, reg), reg & 3, 1);
+}
+
+uint16_t pci_conf_read16(
+ unsigned int bus, unsigned int dev, unsigned int func, unsigned int reg)
+{
+ BUG_ON((bus > 255) || (dev > 31) || (func > 7) || (reg > 255));
+ return pci_conf_read(PCI_CONF_ADDRESS(bus, dev, func, reg), reg & 2, 2);
+}
+
+uint32_t pci_conf_read32(
+ unsigned int bus, unsigned int dev, unsigned int func, unsigned int reg)
+{
+ BUG_ON((bus > 255) || (dev > 31) || (func > 7) || (reg > 255));
+ return pci_conf_read(PCI_CONF_ADDRESS(bus, dev, func, reg), 0, 4);
+}
+
+void pci_conf_write8(
+ unsigned int bus, unsigned int dev, unsigned int func, unsigned int reg,
+ uint8_t data)
+{
+ BUG_ON((bus > 255) || (dev > 31) || (func > 7) || (reg > 255));
+ pci_conf_write(PCI_CONF_ADDRESS(bus, dev, func, reg), reg & 3, 1, data);
+}
+
+void pci_conf_write16(
+ unsigned int bus, unsigned int dev, unsigned int func, unsigned int reg,
+ uint16_t data)
+{
+ BUG_ON((bus > 255) || (dev > 31) || (func > 7) || (reg > 255));
+ pci_conf_write(PCI_CONF_ADDRESS(bus, dev, func, reg), reg & 2, 2, data);
+}
+
+void pci_conf_write32(
+ unsigned int bus, unsigned int dev, unsigned int func, unsigned int reg,
+ uint32_t data)
+{
+ BUG_ON((bus > 255) || (dev > 31) || (func > 7) || (reg > 255));
+ pci_conf_write(PCI_CONF_ADDRESS(bus, dev, func, reg), 0, 4, data);
+}
diff --git a/xen/arch/x86/setup.c b/xen/arch/x86/setup.c
index 383a868225..9b025b51b1 100644
--- a/xen/arch/x86/setup.c
+++ b/xen/arch/x86/setup.c
@@ -861,6 +861,8 @@ void __init __start_xen(unsigned long mbi_p)
early_boot = 0;
+ softirq_init();
+
early_cpu_init();
paging_init();
diff --git a/xen/arch/x86/time.c b/xen/arch/x86/time.c
index 57135940bf..ccefc50cf2 100644
--- a/xen/arch/x86/time.c
+++ b/xen/arch/x86/time.c
@@ -40,7 +40,7 @@ string_param("clocksource", opt_clocksource);
unsigned long cpu_khz; /* CPU clock frequency in kHz. */
unsigned long hpet_address;
DEFINE_SPINLOCK(rtc_lock);
-volatile unsigned long jiffies;
+unsigned long pit0_ticks;
static u32 wc_sec, wc_nsec; /* UTC time at last 'time update'. */
static DEFINE_SPINLOCK(wc_lock);
@@ -67,19 +67,16 @@ struct platform_timesource {
static DEFINE_PER_CPU(struct cpu_time, cpu_time);
/*
- * Protected by platform_timer_lock, which must be acquired with interrupts
- * disabled because plt_overflow() is called from PIT ch0 interrupt context.
- */
-static s_time_t stime_platform_stamp;
-static u64 platform_timer_stamp;
-static DEFINE_SPINLOCK(platform_timer_lock);
-
-/*
- * Folding platform timer into 64-bit software counter is a really critical
- * operation! We therefore do it directly in PIT ch0 interrupt handler.
+ * We simulate a 32-bit platform timer from the 16-bit PIT ch2 counter.
+ * Otherwise overflow happens too quickly (~50ms) for us to guarantee that
+ * softirq handling will happen in time.
+ *
+ * The pit_lock protects the 16- and 32-bit stamp fields as well as the
*/
-static u32 plt_overflow_jiffies;
-static void plt_overflow(void);
+static DEFINE_SPINLOCK(pit_lock);
+static u16 pit_stamp16;
+static u32 pit_stamp32;
+static int using_pit;
/*
* 32-bit division of integer dividend and integer divisor yielding
@@ -146,22 +143,36 @@ static inline u64 scale_delta(u64 delta, struct time_scale *scale)
return product;
}
-void timer_interrupt(int irq, void *dev_id, struct cpu_user_regs *regs)
+static void timer_interrupt(int irq, void *dev_id, struct cpu_user_regs *regs)
{
ASSERT(local_irq_is_enabled());
- /* Update jiffies counter. */
- (*(volatile unsigned long *)&jiffies)++;
+ /* Only for start-of-day interruopt tests in io_apic.c. */
+ (*(volatile unsigned long *)&pit0_ticks)++;
/* Rough hack to allow accurate timers to sort-of-work with no APIC. */
if ( !cpu_has_apic )
raise_softirq(TIMER_SOFTIRQ);
- if ( --plt_overflow_jiffies == 0 )
- plt_overflow();
+ /* Emulate a 32-bit PIT counter. */
+ if ( using_pit )
+ {
+ u16 count;
+
+ spin_lock_irq(&pit_lock);
+
+ outb(0x80, PIT_MODE);
+ count = inb(PIT_CH2);
+ count |= inb(PIT_CH2) << 8;
+
+ pit_stamp32 += (u16)(pit_stamp16 - count);
+ pit_stamp16 = count;
+
+ spin_unlock_irq(&pit_lock);
+ }
}
-static struct irqaction irq0 = { timer_interrupt, "timer", NULL};
+static struct irqaction irq0 = { timer_interrupt, "timer", NULL };
/* ------ Calibrate the TSC -------
* Return processor ticks per second / CALIBRATE_FRAC.
@@ -295,12 +306,21 @@ static char *freq_string(u64 freq)
static u32 read_pit_count(void)
{
- u16 count;
- ASSERT(spin_is_locked(&platform_timer_lock));
+ u16 count16;
+ u32 count32;
+ unsigned long flags;
+
+ spin_lock_irqsave(&pit_lock, flags);
+
outb(0x80, PIT_MODE);
- count = inb(PIT_CH2);
- count |= inb(PIT_CH2) << 8;
- return ~count;
+ count16 = inb(PIT_CH2);
+ count16 |= inb(PIT_CH2) << 8;
+
+ count32 = pit_stamp32 + (u16)(pit_stamp16 - count16);
+
+ spin_unlock_irqrestore(&pit_lock, flags);
+
+ return count32;
}
static void init_pit(struct platform_timesource *pts)
@@ -308,7 +328,8 @@ static void init_pit(struct platform_timesource *pts)
pts->name = "PIT";
pts->frequency = CLOCK_TICK_RATE;
pts->read_counter = read_pit_count;
- pts->counter_bits = 16;
+ pts->counter_bits = 32;
+ using_pit = 1;
}
/************************************************************
@@ -466,24 +487,28 @@ static int init_pmtimer(struct platform_timesource *pts)
static struct platform_timesource plt_src; /* details of chosen timesource */
static u32 plt_mask; /* hardware-width mask */
-static u32 plt_overflow_period; /* jiffies between calls to plt_overflow() */
+static u64 plt_overflow_period; /* ns between calls to plt_overflow() */
static struct time_scale plt_scale; /* scale: platform counter -> nanosecs */
/* Protected by platform_timer_lock. */
-static u64 plt_count64; /* 64-bit platform counter stamp */
-static u32 plt_count; /* hardware-width platform counter stamp */
+static DEFINE_SPINLOCK(platform_timer_lock);
+static s_time_t stime_platform_stamp; /* System time at below platform time */
+static u64 platform_timer_stamp; /* Platform time at above system time */
+static u64 plt_stamp64; /* 64-bit platform counter stamp */
+static u32 plt_stamp; /* hardware-width platform counter stamp */
+static struct timer plt_overflow_timer;
-static void plt_overflow(void)
+static void plt_overflow(void *unused)
{
u32 count;
- unsigned long flags;
- spin_lock_irqsave(&platform_timer_lock, flags);
+ spin_lock(&platform_timer_lock);
count = plt_src.read_counter();
- plt_count64 += (count - plt_count) & plt_mask;
- plt_count = count;
- plt_overflow_jiffies = plt_overflow_period;
- spin_unlock_irqrestore(&platform_timer_lock, flags);
+ plt_stamp64 += (count - plt_stamp) & plt_mask;
+ plt_stamp = count;
+ spin_unlock(&platform_timer_lock);
+
+ set_timer(&plt_overflow_timer, NOW() + plt_overflow_period);
}
static s_time_t __read_platform_stime(u64 platform_time)
@@ -497,12 +522,11 @@ static s_time_t read_platform_stime(void)
{
u64 count;
s_time_t stime;
- unsigned long flags;
- spin_lock_irqsave(&platform_timer_lock, flags);
- count = plt_count64 + ((plt_src.read_counter() - plt_count) & plt_mask);
+ spin_lock(&platform_timer_lock);
+ count = plt_stamp64 + ((plt_src.read_counter() - plt_stamp) & plt_mask);
stime = __read_platform_stime(count);
- spin_unlock_irqrestore(&platform_timer_lock, flags);
+ spin_unlock(&platform_timer_lock);
return stime;
}
@@ -511,27 +535,25 @@ static void platform_time_calibration(void)
{
u64 count;
s_time_t stamp;
- unsigned long flags;
- spin_lock_irqsave(&platform_timer_lock, flags);
- count = plt_count64 + ((plt_src.read_counter() - plt_count) & plt_mask);
+ spin_lock(&platform_timer_lock);
+ count = plt_stamp64 + ((plt_src.read_counter() - plt_stamp) & plt_mask);
stamp = __read_platform_stime(count);
stime_platform_stamp = stamp;
platform_timer_stamp = count;
- spin_unlock_irqrestore(&platform_timer_lock, flags);
+ spin_unlock(&platform_timer_lock);
}
static void resume_platform_timer(void)
{
/* No change in platform_stime across suspend/resume. */
- platform_timer_stamp = plt_count64;
- plt_count = plt_src.read_counter();
+ platform_timer_stamp = plt_stamp64;
+ plt_stamp = plt_src.read_counter();
}
static void init_platform_timer(void)
{
struct platform_timesource *pts = &plt_src;
- u64 overflow_period;
int rc = -1;
if ( opt_clocksource[0] != '\0' )
@@ -561,13 +583,12 @@ static void init_platform_timer(void)
set_time_scale(&plt_scale, pts->frequency);
- overflow_period = scale_delta(1ull << (pts->counter_bits-1), &plt_scale);
- do_div(overflow_period, MILLISECS(1000/HZ));
- plt_overflow_period = overflow_period;
- plt_overflow();
- printk("Platform timer overflows in %d jiffies.\n", plt_overflow_period);
+ plt_overflow_period = scale_delta(
+ 1ull << (pts->counter_bits-1), &plt_scale);
+ init_timer(&plt_overflow_timer, plt_overflow, NULL, 0);
+ plt_overflow(NULL);
- platform_timer_stamp = plt_count64;
+ platform_timer_stamp = plt_stamp64;
printk("Platform timer is %s %s\n",
freq_string(pts->frequency), pts->name);
@@ -969,6 +990,19 @@ void __init early_time_init(void)
setup_irq(0, &irq0);
}
+static int __init disable_pit_irq(void)
+{
+ if ( !using_pit && cpu_has_apic )
+ {
+ /* Disable PIT CH0 timer interrupt. */
+ outb_p(0x30, PIT_MODE);
+ outb_p(0, PIT_CH0);
+ outb_p(0, PIT_CH0);
+ }
+ return 0;
+}
+__initcall(disable_pit_irq);
+
void send_timer_event(struct vcpu *v)
{
send_guest_vcpu_virq(v, VIRQ_TIMER);
@@ -1002,6 +1036,8 @@ int time_resume(void)
{
u64 tmp = init_pit_and_calibrate_tsc();
+ disable_pit_irq();
+
set_time_scale(&this_cpu(cpu_time).tsc_scale, tmp);
resume_platform_timer();
@@ -1019,7 +1055,7 @@ int time_resume(void)
int dom0_pit_access(struct ioreq *ioreq)
{
/* Is Xen using Channel 2? Then disallow direct dom0 access. */
- if ( plt_src.read_counter == read_pit_count )
+ if ( using_pit )
return 0;
switch ( ioreq->addr )
diff --git a/xen/arch/x86/traps.c b/xen/arch/x86/traps.c
index 019e3e56cf..5e39c9b417 100644
--- a/xen/arch/x86/traps.c
+++ b/xen/arch/x86/traps.c
@@ -1305,23 +1305,24 @@ static int read_gate_descriptor(unsigned int gate_sel,
const struct desc_struct *pdesc;
- pdesc = (const struct desc_struct *)(!(gate_sel & 4) ?
- GDT_VIRT_START(v) :
- LDT_VIRT_START(v))
- + (gate_sel >> 3);
- if ( gate_sel < 4 ||
- (gate_sel >= FIRST_RESERVED_GDT_BYTE && !(gate_sel & 4)) ||
+ pdesc = (const struct desc_struct *)
+ (!(gate_sel & 4) ? GDT_VIRT_START(v) : LDT_VIRT_START(v))
+ + (gate_sel >> 3);
+ if ( (gate_sel < 4) ||
+ ((gate_sel >= FIRST_RESERVED_GDT_BYTE) && !(gate_sel & 4)) ||
__get_user(desc, pdesc) )
return 0;
*sel = (desc.a >> 16) & 0x0000fffc;
*off = (desc.a & 0x0000ffff) | (desc.b & 0xffff0000);
*ar = desc.b & 0x0000ffff;
+
/*
* check_descriptor() clears the DPL field and stores the
* guest requested DPL in the selector's RPL field.
*/
- ASSERT(!(*ar & _SEGMENT_DPL));
+ if ( *ar & _SEGMENT_DPL )
+ return 0;
*ar |= (desc.a >> (16 - 13)) & _SEGMENT_DPL;
if ( !is_pv_32bit_vcpu(v) )
@@ -1352,7 +1353,7 @@ static int read_gate_descriptor(unsigned int gate_sel,
#endif
/* Has the guest requested sufficient permission for this I/O access? */
-static inline int guest_io_okay(
+static int guest_io_okay(
unsigned int port, unsigned int bytes,
struct vcpu *v, struct cpu_user_regs *regs)
{
@@ -1394,19 +1395,130 @@ static inline int guest_io_okay(
}
/* Has the administrator granted sufficient permission for this I/O access? */
-static inline int admin_io_okay(
+static int admin_io_okay(
unsigned int port, unsigned int bytes,
struct vcpu *v, struct cpu_user_regs *regs)
{
return ioports_access_permitted(v->domain, port, port + bytes - 1);
}
-#define guest_inb_okay(_p, _d, _r) admin_io_okay(_p, 1, _d, _r)
-#define guest_inw_okay(_p, _d, _r) admin_io_okay(_p, 2, _d, _r)
-#define guest_inl_okay(_p, _d, _r) admin_io_okay(_p, 4, _d, _r)
-#define guest_outb_okay(_p, _d, _r) admin_io_okay(_p, 1, _d, _r)
-#define guest_outw_okay(_p, _d, _r) admin_io_okay(_p, 2, _d, _r)
-#define guest_outl_okay(_p, _d, _r) admin_io_okay(_p, 4, _d, _r)
+static uint32_t guest_io_read(
+ unsigned int port, unsigned int bytes,
+ struct vcpu *v, struct cpu_user_regs *regs)
+{
+ extern uint32_t pci_conf_read(
+ uint32_t cf8, uint8_t offset, uint8_t bytes);
+
+ uint32_t data = 0;
+ unsigned int shift = 0;
+
+ if ( admin_io_okay(port, bytes, v, regs) )
+ {
+ switch ( bytes )
+ {
+ case 1: return inb(port);
+ case 2: return inw(port);
+ case 4: return inl(port);
+ }
+ }
+
+ while ( bytes != 0 )
+ {
+ unsigned int size = 1;
+ uint32_t sub_data = 0xff;
+
+ if ( (port == 0x42) || (port == 0x43) || (port == 0x61) )
+ {
+ sub_data = pv_pit_handler(port, 0, 0);
+ }
+ else if ( (port & 0xfffc) == 0xcf8 )
+ {
+ size = min(bytes, 4 - (port & 3));
+ sub_data = v->domain->arch.pci_cf8 >> ((port & 3) * 8);
+ }
+ else if ( ((port & 0xfffc) == 0xcfc) && IS_PRIV(v->domain) )
+ {
+ size = min(bytes, 4 - (port & 3));
+ if ( size == 3 )
+ size = 2;
+ sub_data = pci_conf_read(v->domain->arch.pci_cf8, port & 3, size);
+ }
+
+ if ( size == 4 )
+ return sub_data;
+
+ data |= (sub_data & ((1u << (size * 8)) - 1)) << shift;
+ shift += size * 8;
+ port += size;
+ bytes -= size;
+ }
+
+ return data;
+}
+
+static void guest_io_write(
+ unsigned int port, unsigned int bytes, uint32_t data,
+ struct vcpu *v, struct cpu_user_regs *regs)
+{
+ extern void pci_conf_write(
+ uint32_t cf8, uint8_t offset, uint8_t bytes, uint32_t data);
+
+ if ( admin_io_okay(port, bytes, v, regs) )
+ {
+ switch ( bytes ) {
+ case 1:
+ outb((uint8_t)data, port);
+ if ( pv_post_outb_hook )
+ pv_post_outb_hook(port, (uint8_t)data);
+ break;
+ case 2:
+ outw((uint16_t)data, port);
+ break;
+ case 4:
+ outl(data, port);
+ break;
+ }
+ return;
+ }
+
+ while ( bytes != 0 )
+ {
+ unsigned int size = 1;
+
+ if ( (port == 0x42) || (port == 0x43) || (port == 0x61) )
+ {
+ pv_pit_handler(port, (uint8_t)data, 1);
+ }
+ else if ( (port & 0xfffc) == 0xcf8 )
+ {
+ size = min(bytes, 4 - (port & 3));
+ if ( size == 4 )
+ {
+ v->domain->arch.pci_cf8 = data;
+ }
+ else
+ {
+ uint32_t mask = ((1u << (size * 8)) - 1) << ((port & 3) * 8);
+ v->domain->arch.pci_cf8 &= ~mask;
+ v->domain->arch.pci_cf8 |= (data << ((port & 3) * 8)) & mask;
+ }
+ }
+ else if ( ((port & 0xfffc) == 0xcfc) && IS_PRIV(v->domain) )
+ {
+ size = min(bytes, 4 - (port & 3));
+ if ( size == 3 )
+ size = 2;
+ pci_conf_write(v->domain->arch.pci_cf8, port & 3, size, data);
+ }
+
+ if ( size == 4 )
+ return;
+
+ port += size;
+ bytes -= size;
+ data >>= size * 8;
+ }
+}
/* I/O emulation support. Helper routines for, and type of, the stack stub.*/
void host_to_guest_gpr_switch(struct cpu_user_regs *)
@@ -1525,7 +1637,7 @@ static int emulate_privileged_op(struct cpu_user_regs *regs)
/* REX prefix. */
if ( rex & 8 ) /* REX.W */
- op_bytes = 4; /* emulating only opcodes not supporting 64-bit operands */
+ op_bytes = 4; /* emulate only opcodes not supporting 64-bit operands */
modrm_reg = (rex & 4) << 1; /* REX.R */
/* REX.X does not need to be decoded. */
modrm_rm = (rex & 1) << 3; /* REX.B */
@@ -1554,7 +1666,8 @@ static int emulate_privileged_op(struct cpu_user_regs *regs)
{
if ( !read_descriptor(data_sel, v, regs,
&data_base, &data_limit, &ar,
- _SEGMENT_WR|_SEGMENT_S|_SEGMENT_DPL|_SEGMENT_P) )
+ _SEGMENT_WR|_SEGMENT_S|_SEGMENT_DPL|
+ _SEGMENT_P) )
goto fail;
if ( !(ar & _SEGMENT_S) ||
!(ar & _SEGMENT_P) ||
@@ -1601,69 +1714,39 @@ static int emulate_privileged_op(struct cpu_user_regs *regs)
case 0x6c: /* INSB */
op_bytes = 1;
case 0x6d: /* INSW/INSL */
- if ( data_limit < op_bytes - 1 ||
- rd_ad(edi) > data_limit - (op_bytes - 1) ||
+ if ( (data_limit < (op_bytes - 1)) ||
+ (rd_ad(edi) > (data_limit - (op_bytes - 1))) ||
!guest_io_okay(port, op_bytes, v, regs) )
goto fail;
- switch ( op_bytes )
- {
- case 1:
- /* emulate PIT counter 2 */
- data = (u8)(guest_inb_okay(port, v, regs) ? inb(port) :
- ((port == 0x42 || port == 0x43 || port == 0x61) ?
- pv_pit_handler(port, 0, 0) : ~0));
- break;
- case 2:
- data = (u16)(guest_inw_okay(port, v, regs) ? inw(port) : ~0);
- break;
- case 4:
- data = (u32)(guest_inl_okay(port, v, regs) ? inl(port) : ~0);
- break;
- }
- if ( (rc = copy_to_user((void *)data_base + rd_ad(edi), &data, op_bytes)) != 0 )
+ data = guest_io_read(port, op_bytes, v, regs);
+ if ( (rc = copy_to_user((void *)data_base + rd_ad(edi),
+ &data, op_bytes)) != 0 )
{
propagate_page_fault(data_base + rd_ad(edi) + op_bytes - rc,
PFEC_write_access);
return EXCRET_fault_fixed;
}
- wr_ad(edi, regs->edi + (int)((regs->eflags & EF_DF) ? -op_bytes : op_bytes));
+ wr_ad(edi, regs->edi + (int)((regs->eflags & EF_DF)
+ ? -op_bytes : op_bytes));
break;
case 0x6e: /* OUTSB */
op_bytes = 1;
case 0x6f: /* OUTSW/OUTSL */
- if ( data_limit < op_bytes - 1 ||
- rd_ad(esi) > data_limit - (op_bytes - 1) ||
- !guest_io_okay(port, op_bytes, v, regs) )
+ if ( (data_limit < (op_bytes - 1)) ||
+ (rd_ad(esi) > (data_limit - (op_bytes - 1))) ||
+ !guest_io_okay(port, op_bytes, v, regs) )
goto fail;
- rc = copy_from_user(&data, (void *)data_base + rd_ad(esi), op_bytes);
- if ( rc != 0 )
+ if ( (rc = copy_from_user(&data, (void *)data_base + rd_ad(esi),
+ op_bytes)) != 0 )
{
- propagate_page_fault(data_base + rd_ad(esi) + op_bytes - rc, 0);
+ propagate_page_fault(data_base + rd_ad(esi)
+ + op_bytes - rc, 0);
return EXCRET_fault_fixed;
}
- switch ( op_bytes )
- {
- case 1:
- if ( guest_outb_okay(port, v, regs) )
- {
- outb((u8)data, port);
- if ( pv_post_outb_hook )
- pv_post_outb_hook(port, data);
- }
- else if ( port == 0x42 || port == 0x43 || port == 0x61 )
- pv_pit_handler(port, data, 1);
- break;
- case 2:
- if ( guest_outw_okay(port, v, regs) )
- outw((u16)data, port);
- break;
- case 4:
- if ( guest_outl_okay(port, v, regs) )
- outl((u32)data, port);
- break;
- }
- wr_ad(esi, regs->esi + (int)((regs->eflags & EF_DF) ? -op_bytes : op_bytes));
+ guest_io_write(port, op_bytes, data, v, regs);
+ wr_ad(esi, regs->esi + (int)((regs->eflags & EF_DF)
+ ? -op_bytes : op_bytes));
break;
}
@@ -1727,31 +1810,17 @@ static int emulate_privileged_op(struct cpu_user_regs *regs)
exec_in:
if ( !guest_io_okay(port, op_bytes, v, regs) )
goto fail;
- switch ( op_bytes )
+ if ( admin_io_okay(port, op_bytes, v, regs) )
{
- case 1:
- if ( guest_inb_okay(port, v, regs) )
- io_emul(regs);
- else if ( port == 0x42 || port == 0x43 || port == 0x61 )
- {
- regs->eax &= ~0xffUL;
- regs->eax |= pv_pit_handler(port, 0, 0);
- }
- else
- regs->eax |= (u8)~0;
- break;
- case 2:
- if ( guest_inw_okay(port, v, regs) )
- io_emul(regs);
- else
- regs->eax |= (u16)~0;
- break;
- case 4:
- if ( guest_inl_okay(port, v, regs) )
- io_emul(regs);
+ io_emul(regs);
+ }
+ else
+ {
+ if ( op_bytes == 4 )
+ regs->eax = 0;
else
- regs->eax = (u32)~0;
- break;
+ regs->eax &= ~((1u << (op_bytes * 8)) - 1);
+ regs->eax |= guest_io_read(port, op_bytes, v, regs);
}
bpmatch = check_guest_io_breakpoint(v, port, op_bytes);
goto done;
@@ -1770,26 +1839,15 @@ static int emulate_privileged_op(struct cpu_user_regs *regs)
exec_out:
if ( !guest_io_okay(port, op_bytes, v, regs) )
goto fail;
- switch ( op_bytes )
+ if ( admin_io_okay(port, op_bytes, v, regs) )
{
- case 1:
- if ( guest_outb_okay(port, v, regs) )
- {
- io_emul(regs);
- if ( pv_post_outb_hook )
- pv_post_outb_hook(port, regs->eax);
- }
- else if ( port == 0x42 || port == 0x43 || port == 0x61 )
- pv_pit_handler(port, regs->eax, 1);
- break;
- case 2:
- if ( guest_outw_okay(port, v, regs) )
- io_emul(regs);
- break;
- case 4:
- if ( guest_outl_okay(port, v, regs) )
- io_emul(regs);
- break;
+ io_emul(regs);
+ if ( (op_bytes == 1) && pv_post_outb_hook )
+ pv_post_outb_hook(port, regs->eax);
+ }
+ else
+ {
+ guest_io_write(port, op_bytes, regs->eax, v, regs);
}
bpmatch = check_guest_io_breakpoint(v, port, op_bytes);
goto done;
@@ -1921,14 +1979,14 @@ static int emulate_privileged_op(struct cpu_user_regs *regs)
break;
case 3: /* Write CR3 */
- LOCK_BIGLOCK(v->domain);
+ domain_lock(v->domain);
if ( !is_pv_32on64_vcpu(v) )
rc = new_guest_cr3(gmfn_to_mfn(v->domain, xen_cr3_to_pfn(*reg)));
#ifdef CONFIG_COMPAT
else
rc = new_guest_cr3(gmfn_to_mfn(v->domain, compat_cr3_to_pfn(*reg)));
#endif
- UNLOCK_BIGLOCK(v->domain);
+ domain_unlock(v->domain);
if ( rc == 0 ) /* not okay */
goto fail;
break;
@@ -2137,8 +2195,8 @@ static void emulate_gate_op(struct cpu_user_regs *regs)
/* Check whether this fault is due to the use of a call gate. */
if ( !read_gate_descriptor(regs->error_code, v, &sel, &off, &ar) ||
- ((ar >> 13) & 3) < (regs->cs & 3) ||
- (ar & _SEGMENT_TYPE) != 0xc00 )
+ (((ar >> 13) & 3) < (regs->cs & 3)) ||
+ ((ar & _SEGMENT_TYPE) != 0xc00) )
{
do_guest_trap(TRAP_gp_fault, regs, 1);
return;
@@ -2232,15 +2290,18 @@ static void emulate_gate_op(struct cpu_user_regs *regs)
{
if ( (modrm & 7) == 4 )
{
- unsigned int sib = insn_fetch(u8, base, eip, limit);
+ unsigned int sib;
+ sib = insn_fetch(u8, base, eip, limit);
modrm = (modrm & ~7) | (sib & 7);
if ( (sib >>= 3) != 4 )
- opnd_off = *(unsigned long *)decode_register(sib & 7, regs, 0);
+ opnd_off = *(unsigned long *)
+ decode_register(sib & 7, regs, 0);
opnd_off <<= sib >> 3;
}
if ( (modrm & 7) != 5 || (modrm & 0xc0) )
- opnd_off += *(unsigned long *)decode_register(modrm & 7, regs, 0);
+ opnd_off += *(unsigned long *)
+ decode_register(modrm & 7, regs, 0);
else
modrm |= 0x87;
if ( !opnd_sel )
@@ -2576,12 +2637,14 @@ asmlinkage void do_general_protection(struct cpu_user_regs *regs)
panic("GENERAL PROTECTION FAULT\n[error_code=%04x]\n", regs->error_code);
}
-static void nmi_softirq(void)
+static void nmi_action(unsigned long unused)
{
/* Only used to defer wakeup of dom0,vcpu0 to a safe (non-NMI) context. */
vcpu_kick(dom0->vcpu[0]);
}
+static DECLARE_TASKLET(nmi_tasklet, nmi_action, 0);
+
static void nmi_dom0_report(unsigned int reason_idx)
{
struct domain *d;
@@ -2593,7 +2656,7 @@ static void nmi_dom0_report(unsigned int reason_idx)
set_bit(reason_idx, nmi_reason(d));
if ( !test_and_set_bool(v->nmi_pending) )
- raise_softirq(NMI_SOFTIRQ); /* not safe to wake up a vcpu here */
+ tasklet_schedule(&nmi_tasklet); /* not safe to wake a vcpu here */
}
asmlinkage void mem_parity_error(struct cpu_user_regs *regs)
@@ -2871,8 +2934,6 @@ void __init trap_init(void)
percpu_traps_init();
cpu_init();
-
- open_softirq(NMI_SOFTIRQ, nmi_softirq);
}
long register_guest_nmi_callback(unsigned long address)
diff --git a/xen/arch/x86/x86_64/compat/mm.c b/xen/arch/x86/x86_64/compat/mm.c
index 256f7a5ac8..a1de1bab27 100644
--- a/xen/arch/x86/x86_64/compat/mm.c
+++ b/xen/arch/x86/x86_64/compat/mm.c
@@ -28,12 +28,12 @@ int compat_set_gdt(XEN_GUEST_HANDLE(uint) frame_list, unsigned int entries)
guest_handle_add_offset(frame_list, 1);
}
- LOCK_BIGLOCK(current->domain);
+ domain_lock(current->domain);
if ( (ret = set_gdt(current, frames, entries)) == 0 )
flush_tlb_local();
- UNLOCK_BIGLOCK(current->domain);
+ domain_unlock(current->domain);
return ret;
}
diff --git a/xen/arch/x86/x86_64/mm.c b/xen/arch/x86/x86_64/mm.c
index f9f33e0a88..3d79657989 100644
--- a/xen/arch/x86/x86_64/mm.c
+++ b/xen/arch/x86/x86_64/mm.c
@@ -59,7 +59,7 @@ void *alloc_xen_pagetable(void)
if ( !early_boot )
{
- struct page_info *pg = alloc_domheap_page(NULL);
+ struct page_info *pg = alloc_domheap_page(NULL, 0);
BUG_ON(pg == NULL);
return page_to_virt(pg);
}
@@ -108,7 +108,7 @@ void __init paging_init(void)
struct page_info *l1_pg, *l2_pg, *l3_pg;
/* Create user-accessible L2 directory to map the MPT for guests. */
- if ( (l3_pg = alloc_domheap_page(NULL)) == NULL )
+ if ( (l3_pg = alloc_domheap_page(NULL, 0)) == NULL )
goto nomem;
l3_ro_mpt = page_to_virt(l3_pg);
clear_page(l3_ro_mpt);
@@ -134,7 +134,7 @@ void __init paging_init(void)
1UL << L2_PAGETABLE_SHIFT);
if ( !((unsigned long)l2_ro_mpt & ~PAGE_MASK) )
{
- if ( (l2_pg = alloc_domheap_page(NULL)) == NULL )
+ if ( (l2_pg = alloc_domheap_page(NULL, 0)) == NULL )
goto nomem;
va = RO_MPT_VIRT_START + (i << L2_PAGETABLE_SHIFT);
l2_ro_mpt = page_to_virt(l2_pg);
@@ -154,7 +154,7 @@ void __init paging_init(void)
l4_table_offset(HIRO_COMPAT_MPT_VIRT_START));
l3_ro_mpt = l4e_to_l3e(idle_pg_table[l4_table_offset(
HIRO_COMPAT_MPT_VIRT_START)]);
- if ( (l2_pg = alloc_domheap_page(NULL)) == NULL )
+ if ( (l2_pg = alloc_domheap_page(NULL, 0)) == NULL )
goto nomem;
compat_idle_pg_table_l2 = l2_ro_mpt = page_to_virt(l2_pg);
clear_page(l2_ro_mpt);
diff --git a/xen/common/compat/domain.c b/xen/common/compat/domain.c
index 002a8a8362..9e58cb145c 100644
--- a/xen/common/compat/domain.c
+++ b/xen/common/compat/domain.c
@@ -42,11 +42,11 @@ int compat_vcpu_op(int cmd, int vcpuid, XEN_GUEST_HANDLE(void) arg)
break;
}
- LOCK_BIGLOCK(d);
+ domain_lock(d);
rc = -EEXIST;
if ( !v->is_initialised )
rc = boot_vcpu(d, vcpuid, cmp_ctxt);
- UNLOCK_BIGLOCK(d);
+ domain_unlock(d);
xfree(cmp_ctxt);
break;
diff --git a/xen/common/compat/grant_table.c b/xen/common/compat/grant_table.c
index 882d435a65..8781a331cf 100644
--- a/xen/common/compat/grant_table.c
+++ b/xen/common/compat/grant_table.c
@@ -109,12 +109,24 @@ int compat_grant_table_op(unsigned int cmd,
rc = -EFAULT;
else
{
- BUG_ON((COMPAT_ARG_XLAT_SIZE - sizeof(*nat.setup)) / sizeof(*nat.setup->frame_list.p) < max_nr_grant_frames);
+ unsigned int max_frame_list_size_in_page =
+ (COMPAT_ARG_XLAT_SIZE - sizeof(*nat.setup)) /
+ sizeof(*nat.setup->frame_list.p);
+ if ( max_frame_list_size_in_page < max_nr_grant_frames )
+ {
+ gdprintk(XENLOG_WARNING,
+ "max_nr_grant_frames is too large (%u,%u)\n",
+ max_nr_grant_frames, max_frame_list_size_in_page);
+ rc = -EINVAL;
+ }
+ else
+ {
#define XLAT_gnttab_setup_table_HNDL_frame_list(_d_, _s_) \
- set_xen_guest_handle((_d_)->frame_list, (unsigned long *)(nat.setup + 1))
- XLAT_gnttab_setup_table(nat.setup, &cmp.setup);
+ set_xen_guest_handle((_d_)->frame_list, (unsigned long *)(nat.setup + 1))
+ XLAT_gnttab_setup_table(nat.setup, &cmp.setup);
#undef XLAT_gnttab_setup_table_HNDL_frame_list
- rc = gnttab_setup_table(guest_handle_cast(nat.uop, gnttab_setup_table_t), 1);
+ rc = gnttab_setup_table(guest_handle_cast(nat.uop, gnttab_setup_table_t), 1);
+ }
}
if ( rc == 0 )
{
diff --git a/xen/common/domain.c b/xen/common/domain.c
index 76b48f4296..c74fb07c0e 100644
--- a/xen/common/domain.c
+++ b/xen/common/domain.c
@@ -80,7 +80,7 @@ struct domain *alloc_domain(domid_t domid)
}
atomic_set(&d->refcnt, 1);
- spin_lock_init(&d->big_lock);
+ spin_lock_init(&d->domain_lock);
spin_lock_init(&d->page_alloc_lock);
spin_lock_init(&d->shutdown_lock);
spin_lock_init(&d->hypercall_deadlock_mutex);
@@ -629,7 +629,7 @@ int vcpu_reset(struct vcpu *v)
int rc;
domain_pause(d);
- LOCK_BIGLOCK(d);
+ domain_lock(d);
rc = arch_vcpu_reset(v);
if ( rc != 0 )
@@ -646,7 +646,7 @@ int vcpu_reset(struct vcpu *v)
clear_bit(_VPF_blocked, &v->pause_flags);
out:
- UNLOCK_BIGLOCK(v->domain);
+ domain_unlock(v->domain);
domain_unpause(d);
return rc;
@@ -678,11 +678,11 @@ long do_vcpu_op(int cmd, int vcpuid, XEN_GUEST_HANDLE(void) arg)
return -EFAULT;
}
- LOCK_BIGLOCK(d);
+ domain_lock(d);
rc = -EEXIST;
if ( !v->is_initialised )
rc = boot_vcpu(d, vcpuid, ctxt);
- UNLOCK_BIGLOCK(d);
+ domain_unlock(d);
xfree(ctxt);
break;
diff --git a/xen/common/domctl.c b/xen/common/domctl.c
index 52143dbd1d..19ea5bef1a 100644
--- a/xen/common/domctl.c
+++ b/xen/common/domctl.c
@@ -25,6 +25,8 @@
#include <public/domctl.h>
#include <xsm/xsm.h>
+DEFINE_SPINLOCK(domctl_lock);
+
extern long arch_do_domctl(
struct xen_domctl *op, XEN_GUEST_HANDLE(xen_domctl_t) u_domctl);
@@ -90,7 +92,7 @@ static inline int is_free_domid(domid_t dom)
void getdomaininfo(struct domain *d, struct xen_domctl_getdomaininfo *info)
{
- struct vcpu *v;
+ struct vcpu *v;
u64 cpu_time = 0;
int flags = XEN_DOMINF_blocked;
struct vcpu_runstate_info runstate;
@@ -119,7 +121,7 @@ void getdomaininfo(struct domain *d, struct xen_domctl_getdomaininfo *info)
info->cpu_time = cpu_time;
- info->flags = flags |
+ info->flags = (info->nr_online_vcpus ? flags : 0) |
((d->is_dying == DOMDYING_dead) ? XEN_DOMINF_dying : 0) |
(d->is_shut_down ? XEN_DOMINF_shutdown : 0) |
(d->is_paused_by_controller ? XEN_DOMINF_paused : 0) |
@@ -180,7 +182,6 @@ long do_domctl(XEN_GUEST_HANDLE(xen_domctl_t) u_domctl)
{
long ret = 0;
struct xen_domctl curop, *op = &curop;
- static DEFINE_SPINLOCK(domctl_lock);
if ( !IS_PRIV(current->domain) )
return -EPERM;
diff --git a/xen/common/event_channel.c b/xen/common/event_channel.c
index b385b54738..70b34fbd2f 100644
--- a/xen/common/event_channel.c
+++ b/xen/common/event_channel.c
@@ -109,9 +109,7 @@ static int get_free_port(struct domain *d)
if ( xsm_alloc_security_evtchn(&chn[i]) )
{
for ( j = 0; j < i; j++ )
- {
xsm_free_security_evtchn(&chn[j]);
- }
xfree(chn);
return -ENOMEM;
}
@@ -971,9 +969,18 @@ void free_xen_event_channel(
struct domain *d = local_vcpu->domain;
spin_lock(&d->evtchn_lock);
+
+ if ( unlikely(d->is_dying) )
+ {
+ spin_unlock(&d->evtchn_lock);
+ return;
+ }
+
+ BUG_ON(!port_is_valid(d, port));
chn = evtchn_from_port(d, port);
BUG_ON(!chn->consumer_is_xen);
chn->consumer_is_xen = 0;
+
spin_unlock(&d->evtchn_lock);
(void)__evtchn_close(d, port);
@@ -1035,6 +1042,7 @@ void evtchn_destroy(struct domain *d)
{
xsm_free_security_evtchn(d->evtchn[i]);
xfree(d->evtchn[i]);
+ d->evtchn[i] = NULL;
}
spin_unlock(&d->evtchn_lock);
}
diff --git a/xen/common/grant_table.c b/xen/common/grant_table.c
index 2dbcfab8b6..53662df865 100644
--- a/xen/common/grant_table.c
+++ b/xen/common/grant_table.c
@@ -1102,7 +1102,7 @@ gnttab_transfer(
struct page_info *new_page;
void *sp, *dp;
- new_page = alloc_domheap_pages(NULL, 0, MEMF_bits(max_bitsize));
+ new_page = alloc_domheap_page(NULL, MEMF_bits(max_bitsize));
if ( new_page == NULL )
{
gop.status = GNTST_address_too_big;
@@ -1445,7 +1445,7 @@ do_grant_table_op(
if ( count > 512 )
return -EINVAL;
- LOCK_BIGLOCK(d);
+ domain_lock(d);
rc = -EFAULT;
switch ( cmd )
@@ -1516,7 +1516,7 @@ do_grant_table_op(
}
out:
- UNLOCK_BIGLOCK(d);
+ domain_unlock(d);
return rc;
}
diff --git a/xen/common/keyhandler.c b/xen/common/keyhandler.c
index b414452562..934edb5dc9 100644
--- a/xen/common/keyhandler.c
+++ b/xen/common/keyhandler.c
@@ -32,7 +32,7 @@ static struct {
static unsigned char keypress_key;
-static void keypress_softirq(void)
+static void keypress_action(unsigned long unused)
{
keyhandler_t *h;
unsigned char key = keypress_key;
@@ -42,6 +42,8 @@ static void keypress_softirq(void)
console_end_log_everything();
}
+static DECLARE_TASKLET(keypress_tasklet, keypress_action, 0);
+
void handle_keypress(unsigned char key, struct cpu_user_regs *regs)
{
irq_keyhandler_t *h;
@@ -56,7 +58,7 @@ void handle_keypress(unsigned char key, struct cpu_user_regs *regs)
else
{
keypress_key = key;
- raise_softirq(KEYPRESS_SOFTIRQ);
+ tasklet_schedule(&keypress_tasklet);
}
}
@@ -284,8 +286,6 @@ static void do_debug_key(unsigned char key, struct cpu_user_regs *regs)
void __init initialize_keytable(void)
{
- open_softirq(KEYPRESS_SOFTIRQ, keypress_softirq);
-
register_irq_keyhandler(
'd', dump_registers, "dump registers");
register_keyhandler(
diff --git a/xen/common/memory.c b/xen/common/memory.c
index 70a05d5367..3e9f7071ab 100644
--- a/xen/common/memory.c
+++ b/xen/common/memory.c
@@ -21,6 +21,7 @@
#include <xen/errno.h>
#include <asm/current.h>
#include <asm/hardirq.h>
+#include <xen/numa.h>
#include <public/memory.h>
#include <xsm/xsm.h>
@@ -37,19 +38,13 @@ struct memop_args {
int preempted; /* Was the hypercall preempted? */
};
-static unsigned int select_local_cpu(struct domain *d)
-{
- struct vcpu *v = d->vcpu[0];
- return (v ? v->processor : 0);
-}
-
static void increase_reservation(struct memop_args *a)
{
struct page_info *page;
unsigned long i;
xen_pfn_t mfn;
struct domain *d = a->domain;
- unsigned int cpu = select_local_cpu(d);
+ unsigned int node = domain_to_node(d);
if ( !guest_handle_is_null(a->extent_list) &&
!guest_handle_okay(a->extent_list, a->nr_extents) )
@@ -67,7 +62,8 @@ static void increase_reservation(struct memop_args *a)
goto out;
}
- page = __alloc_domheap_pages(d, cpu, a->extent_order, a->memflags);
+ page = alloc_domheap_pages(
+ d, a->extent_order, a->memflags | MEMF_node(node));
if ( unlikely(page == NULL) )
{
gdprintk(XENLOG_INFO, "Could not allocate order=%d extent: "
@@ -96,7 +92,7 @@ static void populate_physmap(struct memop_args *a)
unsigned long i, j;
xen_pfn_t gpfn, mfn;
struct domain *d = a->domain;
- unsigned int cpu = select_local_cpu(d);
+ unsigned int node = domain_to_node(d);
if ( !guest_handle_okay(a->extent_list, a->nr_extents) )
return;
@@ -116,7 +112,8 @@ static void populate_physmap(struct memop_args *a)
if ( unlikely(__copy_from_guest_offset(&gpfn, a->extent_list, i, 1)) )
goto out;
- page = __alloc_domheap_pages(d, cpu, a->extent_order, a->memflags);
+ page = alloc_domheap_pages(
+ d, a->extent_order, a->memflags | MEMF_node(node));
if ( unlikely(page == NULL) )
{
gdprintk(XENLOG_INFO, "Could not allocate order=%d extent: "
@@ -296,7 +293,7 @@ static long memory_exchange(XEN_GUEST_HANDLE(xen_memory_exchange_t) arg)
unsigned long in_chunk_order, out_chunk_order;
xen_pfn_t gpfn, gmfn, mfn;
unsigned long i, j, k;
- unsigned int memflags = 0, cpu;
+ unsigned int memflags = 0;
long rc = 0;
struct domain *d;
struct page_info *page;
@@ -351,8 +348,7 @@ static long memory_exchange(XEN_GUEST_HANDLE(xen_memory_exchange_t) arg)
memflags |= MEMF_bits(domain_clamp_alloc_bitsize(
d, exch.out.address_bits ? : (BITS_PER_LONG+PAGE_SHIFT)));
-
- cpu = select_local_cpu(d);
+ memflags |= MEMF_node(domain_to_node(d));
for ( i = (exch.nr_exchanged >> in_chunk_order);
i < (exch.in.nr_extents >> in_chunk_order);
@@ -401,8 +397,7 @@ static long memory_exchange(XEN_GUEST_HANDLE(xen_memory_exchange_t) arg)
/* Allocate a chunk's worth of anonymous output pages. */
for ( j = 0; j < (1UL << out_chunk_order); j++ )
{
- page = __alloc_domheap_pages(
- NULL, cpu, exch.out.extent_order, memflags);
+ page = alloc_domheap_pages(NULL, exch.out.extent_order, memflags);
if ( unlikely(page == NULL) )
{
rc = -ENOMEM;
diff --git a/xen/common/page_alloc.c b/xen/common/page_alloc.c
index 2d5f3f6da3..d1773c679e 100644
--- a/xen/common/page_alloc.c
+++ b/xen/common/page_alloc.c
@@ -36,6 +36,7 @@
#include <xen/numa.h>
#include <xen/nodemask.h>
#include <asm/page.h>
+#include <asm/numa.h>
#include <asm/flushtlb.h>
/*
@@ -328,14 +329,17 @@ static void init_node_heap(int node)
/* Allocate 2^@order contiguous pages. */
static struct page_info *alloc_heap_pages(
unsigned int zone_lo, unsigned int zone_hi,
- unsigned int cpu, unsigned int order)
+ unsigned int node, unsigned int order)
{
unsigned int i, j, zone;
- unsigned int node = cpu_to_node(cpu), num_nodes = num_online_nodes();
+ unsigned int num_nodes = num_online_nodes();
unsigned long request = 1UL << order;
cpumask_t extra_cpus_mask, mask;
struct page_info *pg;
+ if ( node == NUMA_NO_NODE )
+ node = cpu_to_node(smp_processor_id());
+
ASSERT(node >= 0);
ASSERT(node < num_nodes);
ASSERT(zone_lo <= zone_hi);
@@ -670,7 +674,8 @@ void *alloc_xenheap_pages(unsigned int order)
ASSERT(!in_irq());
- pg = alloc_heap_pages(MEMZONE_XEN, MEMZONE_XEN, smp_processor_id(), order);
+ pg = alloc_heap_pages(
+ MEMZONE_XEN, MEMZONE_XEN, cpu_to_node(smp_processor_id()), order);
if ( unlikely(pg == NULL) )
goto no_memory;
@@ -778,12 +783,12 @@ int assign_pages(
}
-struct page_info *__alloc_domheap_pages(
- struct domain *d, unsigned int cpu, unsigned int order,
- unsigned int memflags)
+struct page_info *alloc_domheap_pages(
+ struct domain *d, unsigned int order, unsigned int memflags)
{
struct page_info *pg = NULL;
unsigned int bits = memflags >> _MEMF_bits, zone_hi = NR_ZONES - 1;
+ unsigned int node = (uint8_t)((memflags >> _MEMF_node) - 1);
ASSERT(!in_irq());
@@ -797,7 +802,7 @@ struct page_info *__alloc_domheap_pages(
if ( (zone_hi + PAGE_SHIFT) >= dma_bitsize )
{
- pg = alloc_heap_pages(dma_bitsize - PAGE_SHIFT, zone_hi, cpu, order);
+ pg = alloc_heap_pages(dma_bitsize - PAGE_SHIFT, zone_hi, node, order);
/* Failure? Then check if we can fall back to the DMA pool. */
if ( unlikely(pg == NULL) &&
@@ -811,7 +816,7 @@ struct page_info *__alloc_domheap_pages(
if ( (pg == NULL) &&
((pg = alloc_heap_pages(MEMZONE_XEN + 1, zone_hi,
- cpu, order)) == NULL) )
+ node, order)) == NULL) )
return NULL;
if ( (d != NULL) && assign_pages(d, pg, order, memflags) )
@@ -823,12 +828,6 @@ struct page_info *__alloc_domheap_pages(
return pg;
}
-struct page_info *alloc_domheap_pages(
- struct domain *d, unsigned int order, unsigned int flags)
-{
- return __alloc_domheap_pages(d, smp_processor_id(), order, flags);
-}
-
void free_domheap_pages(struct page_info *pg, unsigned int order)
{
int i, drop_dom_ref;
diff --git a/xen/common/softirq.c b/xen/common/softirq.c
index b6c2b18886..be4728f2e0 100644
--- a/xen/common/softirq.c
+++ b/xen/common/softirq.c
@@ -52,6 +52,108 @@ void open_softirq(int nr, softirq_handler handler)
softirq_handlers[nr] = handler;
}
+static LIST_HEAD(tasklet_list);
+static DEFINE_SPINLOCK(tasklet_lock);
+
+void tasklet_schedule(struct tasklet *t)
+{
+ unsigned long flags;
+
+ spin_lock_irqsave(&tasklet_lock, flags);
+
+ if ( !t->is_dead )
+ {
+ if ( !t->is_scheduled && !t->is_running )
+ {
+ BUG_ON(!list_empty(&t->list));
+ list_add_tail(&t->list, &tasklet_list);
+ }
+ t->is_scheduled = 1;
+ raise_softirq(TASKLET_SOFTIRQ);
+ }
+
+ spin_unlock_irqrestore(&tasklet_lock, flags);
+}
+
+static void tasklet_action(void)
+{
+ struct tasklet *t;
+
+ spin_lock_irq(&tasklet_lock);
+
+ if ( list_empty(&tasklet_list) )
+ {
+ spin_unlock_irq(&tasklet_lock);
+ return;
+ }
+
+ t = list_entry(tasklet_list.next, struct tasklet, list);
+ list_del_init(&t->list);
+
+ BUG_ON(t->is_dead || t->is_running || !t->is_scheduled);
+ t->is_scheduled = 0;
+ t->is_running = 1;
+
+ spin_unlock_irq(&tasklet_lock);
+ t->func(t->data);
+ spin_lock_irq(&tasklet_lock);
+
+ t->is_running = 0;
+
+ if ( t->is_scheduled )
+ {
+ BUG_ON(t->is_dead || !list_empty(&t->list));
+ list_add_tail(&t->list, &tasklet_list);
+ }
+
+ /*
+ * If there is more work to do then reschedule. We don't grab more work
+ * immediately as we want to allow other softirq work to happen first.
+ */
+ if ( !list_empty(&tasklet_list) )
+ raise_softirq(TASKLET_SOFTIRQ);
+
+ spin_unlock_irq(&tasklet_lock);
+}
+
+void tasklet_kill(struct tasklet *t)
+{
+ unsigned long flags;
+
+ spin_lock_irqsave(&tasklet_lock, flags);
+
+ if ( !list_empty(&t->list) )
+ {
+ BUG_ON(t->is_dead || t->is_running || !t->is_scheduled);
+ list_del_init(&t->list);
+ }
+ t->is_scheduled = 0;
+ t->is_dead = 1;
+
+ while ( t->is_running )
+ {
+ spin_unlock_irqrestore(&tasklet_lock, flags);
+ cpu_relax();
+ spin_lock_irqsave(&tasklet_lock, flags);
+ }
+
+ spin_unlock_irqrestore(&tasklet_lock, flags);
+}
+
+void tasklet_init(
+ struct tasklet *t, void (*func)(unsigned long), unsigned long data)
+{
+ memset(t, 0, sizeof(*t));
+ INIT_LIST_HEAD(&t->list);
+ t->func = func;
+ t->data = data;
+}
+
+void __init softirq_init(void)
+{
+ open_softirq(TASKLET_SOFTIRQ, tasklet_action);
+}
+
/*
* Local variables:
* mode: C
diff --git a/xen/common/trace.c b/xen/common/trace.c
index 863816b9ee..12ff7a029c 100644
--- a/xen/common/trace.c
+++ b/xen/common/trace.c
@@ -69,12 +69,6 @@ static cpumask_t tb_cpu_mask = CPU_MASK_ALL;
/* which tracing events are enabled */
static u32 tb_event_mask = TRC_ALL;
-static void trace_notify_guest(void)
-{
- send_guest_global_virq(dom0, VIRQ_TBUF);
-}
-
-
/**
* alloc_trace_bufs - performs initialization of the per-cpu trace buffers.
*
@@ -120,7 +114,6 @@ static int alloc_trace_bufs(void)
}
t_buf_highwater = data_size >> 1; /* 50% high water */
- open_softirq(TRACE_SOFTIRQ, trace_notify_guest);
return 0;
}
@@ -513,7 +506,7 @@ void __trace_var(u32 event, int cycles, int extra, unsigned char *extra_data)
/* Notify trace buffer consumer that we've crossed the high water mark. */
if ( started_below_highwater &&
(calc_unconsumed_bytes(buf) >= t_buf_highwater) )
- raise_softirq(TRACE_SOFTIRQ);
+ send_guest_global_virq(dom0, VIRQ_TBUF);
}
/*
diff --git a/xen/common/xencomm.c b/xen/common/xencomm.c
index fc86cd0830..135e3d93a5 100644
--- a/xen/common/xencomm.c
+++ b/xen/common/xencomm.c
@@ -323,6 +323,7 @@ xencomm_copy_chunk_to(
(unsigned long)xencomm_vaddr(paddr, page));
memcpy(xencomm_vaddr(paddr, page), (void *)from, len);
+ xencomm_mark_dirty(xencomm_vaddr(paddr, page), len);
put_page(page);
return 0;
diff --git a/xen/drivers/passthrough/amd/iommu_detect.c b/xen/drivers/passthrough/amd/iommu_detect.c
index 96ad02bbf7..d7ffa4e216 100644
--- a/xen/drivers/passthrough/amd/iommu_detect.c
+++ b/xen/drivers/passthrough/amd/iommu_detect.c
@@ -21,9 +21,9 @@
#include <xen/config.h>
#include <xen/errno.h>
#include <xen/iommu.h>
+#include <xen/pci.h>
#include <asm/amd-iommu.h>
#include <asm/hvm/svm/amd-iommu-proto.h>
-#include "../pci-direct.h"
#include "../pci_regs.h"
static int __init valid_bridge_bus_config(
@@ -31,9 +31,9 @@ static int __init valid_bridge_bus_config(
{
int pri_bus;
- pri_bus = read_pci_config_byte(bus, dev, func, PCI_PRIMARY_BUS);
- *sec_bus = read_pci_config_byte(bus, dev, func, PCI_SECONDARY_BUS);
- *sub_bus = read_pci_config_byte(bus, dev, func, PCI_SUBORDINATE_BUS);
+ pri_bus = pci_conf_read8(bus, dev, func, PCI_PRIMARY_BUS);
+ *sec_bus = pci_conf_read8(bus, dev, func, PCI_SECONDARY_BUS);
+ *sub_bus = pci_conf_read8(bus, dev, func, PCI_SUBORDINATE_BUS);
return ((pri_bus == bus) && (*sec_bus > bus) && (*sub_bus >= *sec_bus));
}
@@ -59,12 +59,11 @@ int __init get_iommu_last_downstream_bus(struct amd_iommu *iommu)
}
func = PCI_FUNC(devfn);
- if ( !VALID_PCI_VENDOR_ID(
- read_pci_config_16(bus, dev, func, PCI_VENDOR_ID)) )
+ if ( !VALID_PCI_VENDOR_ID(pci_conf_read16(bus, dev, func,
+ PCI_VENDOR_ID)) )
continue;
- hdr_type = read_pci_config_byte(bus, dev, func,
- PCI_HEADER_TYPE);
+ hdr_type = pci_conf_read8(bus, dev, func, PCI_HEADER_TYPE);
if ( func == 0 )
multi_func = IS_PCI_MULTI_FUNCTION(hdr_type);
@@ -92,9 +91,9 @@ int __init get_iommu_capabilities(u8 bus, u8 dev, u8 func, u8 cap_ptr,
u32 cap_header, cap_range, misc_info;
u64 mmio_bar;
- mmio_bar = (u64)read_pci_config(
+ mmio_bar = (u64)pci_conf_read32(
bus, dev, func, cap_ptr + PCI_CAP_MMIO_BAR_HIGH_OFFSET) << 32;
- mmio_bar |= read_pci_config(bus, dev, func,
+ mmio_bar |= pci_conf_read32(bus, dev, func,
cap_ptr + PCI_CAP_MMIO_BAR_LOW_OFFSET);
iommu->mmio_base_phys = mmio_bar & (u64)~0x3FFF;
@@ -108,7 +107,7 @@ int __init get_iommu_capabilities(u8 bus, u8 dev, u8 func, u8 cap_ptr,
iommu->bdf = (bus << 8) | PCI_DEVFN(dev, func);
iommu->cap_offset = cap_ptr;
- cap_header = read_pci_config(bus, dev, func, cap_ptr);
+ cap_header = pci_conf_read32(bus, dev, func, cap_ptr);
iommu->revision = get_field_from_reg_u32(
cap_header, PCI_CAP_REV_MASK, PCI_CAP_REV_SHIFT);
iommu->iotlb_support = get_field_from_reg_u32(
@@ -118,7 +117,7 @@ int __init get_iommu_capabilities(u8 bus, u8 dev, u8 func, u8 cap_ptr,
iommu->pte_not_present_cached = get_field_from_reg_u32(
cap_header, PCI_CAP_NP_CACHE_MASK, PCI_CAP_NP_CACHE_SHIFT);
- cap_range = read_pci_config(bus, dev, func,
+ cap_range = pci_conf_read32(bus, dev, func,
cap_ptr + PCI_CAP_RANGE_OFFSET);
iommu->unit_id = get_field_from_reg_u32(
cap_range, PCI_CAP_UNIT_ID_MASK, PCI_CAP_UNIT_ID_SHIFT);
@@ -129,7 +128,7 @@ int __init get_iommu_capabilities(u8 bus, u8 dev, u8 func, u8 cap_ptr,
iommu->last_devfn = get_field_from_reg_u32(
cap_range, PCI_CAP_LAST_DEVICE_MASK, PCI_CAP_LAST_DEVICE_SHIFT);
- misc_info = read_pci_config(bus, dev, func,
+ misc_info = pci_conf_read32(bus, dev, func,
cap_ptr + PCI_MISC_INFO_OFFSET);
iommu->msi_number = get_field_from_reg_u32(
misc_info, PCI_CAP_MSI_NUMBER_MASK, PCI_CAP_MSI_NUMBER_SHIFT);
@@ -146,14 +145,13 @@ static int __init scan_caps_for_iommu(
int count, error = 0;
count = 0;
- cap_ptr = read_pci_config_byte(bus, dev, func,
- PCI_CAPABILITY_LIST);
+ cap_ptr = pci_conf_read8(bus, dev, func, PCI_CAPABILITY_LIST);
while ( (cap_ptr >= PCI_MIN_CAP_OFFSET) &&
(count < PCI_MAX_CAP_BLOCKS) &&
!error )
{
cap_ptr &= PCI_CAP_PTR_MASK;
- cap_header = read_pci_config(bus, dev, func, cap_ptr);
+ cap_header = pci_conf_read32(bus, dev, func, cap_ptr);
cap_id = get_field_from_reg_u32(
cap_header, PCI_CAP_ID_MASK, PCI_CAP_ID_SHIFT);
@@ -182,12 +180,11 @@ static int __init scan_functions_for_iommu(
func = 0;
count = 1;
- while ( VALID_PCI_VENDOR_ID(read_pci_config_16(bus, dev, func,
- PCI_VENDOR_ID)) &&
+ while ( VALID_PCI_VENDOR_ID(pci_conf_read16(bus, dev, func,
+ PCI_VENDOR_ID)) &&
!error && (func < count) )
{
- hdr_type = read_pci_config_byte(bus, dev, func,
- PCI_HEADER_TYPE);
+ hdr_type = pci_conf_read8(bus, dev, func, PCI_HEADER_TYPE);
if ( func == 0 && IS_PCI_MULTI_FUNCTION(hdr_type) )
count = PCI_MAX_FUNC_COUNT;
diff --git a/xen/drivers/passthrough/amd/iommu_init.c b/xen/drivers/passthrough/amd/iommu_init.c
index bb01d7915a..f36c0e86c4 100644
--- a/xen/drivers/passthrough/amd/iommu_init.c
+++ b/xen/drivers/passthrough/amd/iommu_init.c
@@ -20,10 +20,10 @@
#include <xen/config.h>
#include <xen/errno.h>
+#include <xen/pci.h>
#include <asm/amd-iommu.h>
#include <asm/hvm/svm/amd-iommu-proto.h>
#include <asm-x86/fixmap.h>
-#include "../pci-direct.h"
#include "../pci_regs.h"
extern int nr_amd_iommus;
diff --git a/xen/drivers/passthrough/amd/iommu_map.c b/xen/drivers/passthrough/amd/iommu_map.c
index ad5a8517bd..aa584e615f 100644
--- a/xen/drivers/passthrough/amd/iommu_map.c
+++ b/xen/drivers/passthrough/amd/iommu_map.c
@@ -388,17 +388,17 @@ int amd_iommu_map_page(struct domain *d, unsigned long gfn, unsigned long mfn)
unsigned long flags;
u64 maddr;
struct hvm_iommu *hd = domain_hvm_iommu(d);
- int iw, ir;
+ int iw = IOMMU_IO_WRITE_ENABLED;
+ int ir = IOMMU_IO_READ_ENABLED;
BUG_ON( !hd->root_table );
- maddr = (u64)mfn << PAGE_SHIFT;
-
- iw = IOMMU_IO_WRITE_ENABLED;
- ir = IOMMU_IO_READ_ENABLED;
-
spin_lock_irqsave(&hd->mapping_lock, flags);
+ if ( is_hvm_domain(d) && !hd->p2m_synchronized )
+ goto out;
+
+ maddr = (u64)mfn << PAGE_SHIFT;
pte = get_pte_from_page_tables(hd->root_table, hd->paging_mode, gfn);
if ( pte == NULL )
{
@@ -409,7 +409,7 @@ int amd_iommu_map_page(struct domain *d, unsigned long gfn, unsigned long mfn)
}
set_page_table_entry_present((u32 *)pte, maddr, iw, ir);
-
+out:
spin_unlock_irqrestore(&hd->mapping_lock, flags);
return 0;
}
@@ -425,11 +425,17 @@ int amd_iommu_unmap_page(struct domain *d, unsigned long gfn)
BUG_ON( !hd->root_table );
+ spin_lock_irqsave(&hd->mapping_lock, flags);
+
+ if ( is_hvm_domain(d) && !hd->p2m_synchronized )
+ {
+ spin_unlock_irqrestore(&hd->mapping_lock, flags);
+ return 0;
+ }
+
requestor_id = hd->domain_id;
io_addr = (u64)gfn << PAGE_SHIFT;
- spin_lock_irqsave(&hd->mapping_lock, flags);
-
pte = get_pte_from_page_tables(hd->root_table, hd->paging_mode, gfn);
if ( pte == NULL )
{
@@ -486,3 +492,53 @@ int amd_iommu_reserve_domain_unity_map(
spin_unlock_irqrestore(&hd->mapping_lock, flags);
return 0;
}
+
+int amd_iommu_sync_p2m(struct domain *d)
+{
+ unsigned long mfn, gfn, flags;
+ void *pte;
+ u64 maddr;
+ struct list_head *entry;
+ struct page_info *page;
+ struct hvm_iommu *hd;
+ int iw = IOMMU_IO_WRITE_ENABLED;
+ int ir = IOMMU_IO_READ_ENABLED;
+
+ if ( !is_hvm_domain(d) )
+ return 0;
+
+ hd = domain_hvm_iommu(d);
+
+ spin_lock_irqsave(&hd->mapping_lock, flags);
+
+ if ( hd->p2m_synchronized )
+ goto out;
+
+ for ( entry = d->page_list.next; entry != &d->page_list;
+ entry = entry->next )
+ {
+ page = list_entry(entry, struct page_info, list);
+ mfn = page_to_mfn(page);
+ gfn = get_gpfn_from_mfn(mfn);
+
+ if ( gfn == INVALID_M2P_ENTRY )
+ continue;
+
+ maddr = (u64)mfn << PAGE_SHIFT;
+ pte = get_pte_from_page_tables(hd->root_table, hd->paging_mode, gfn);
+ if ( pte == NULL )
+ {
+ dprintk(XENLOG_ERR,
+ "AMD IOMMU: Invalid IO pagetable entry gfn = %lx\n", gfn);
+ spin_unlock_irqrestore(&hd->mapping_lock, flags);
+ return -EFAULT;
+ }
+ set_page_table_entry_present((u32 *)pte, maddr, iw, ir);
+ }
+
+ hd->p2m_synchronized = 1;
+
+out:
+ spin_unlock_irqrestore(&hd->mapping_lock, flags);
+ return 0;
+}
diff --git a/xen/drivers/passthrough/amd/pci_amd_iommu.c b/xen/drivers/passthrough/amd/pci_amd_iommu.c
index 8b93e9c3cd..6a6b5484b3 100644
--- a/xen/drivers/passthrough/amd/pci_amd_iommu.c
+++ b/xen/drivers/passthrough/amd/pci_amd_iommu.c
@@ -18,12 +18,12 @@
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
+#include <xen/sched.h>
+#include <xen/pci.h>
#include <asm/amd-iommu.h>
#include <asm/hvm/svm/amd-iommu-proto.h>
#include <asm/hvm/svm/amd-iommu-acpi.h>
-#include <xen/sched.h>
#include <asm/mm.h>
-#include "../pci-direct.h"
#include "../pci_regs.h"
struct list_head amd_iommu_head;
@@ -316,7 +316,7 @@ void __init amd_iommu_setup_dom0_devices(void)
{
for ( func = 0; func < 8; func++ )
{
- l = read_pci_config(bus, dev, func, PCI_VENDOR_ID);
+ l = pci_conf_read32(bus, dev, func, PCI_VENDOR_ID);
/* some broken boards return 0 or ~0 if a slot is empty: */
if ( (l == 0xffffffff) || (l == 0x00000000) ||
(l == 0x0000ffff) || (l == 0xffff0000) )
@@ -553,8 +553,9 @@ static int reassign_device( struct domain *source, struct domain *target,
int amd_iommu_assign_device(struct domain *d, u8 bus, u8 devfn)
{
int bdf = (bus << 8) | devfn;
- int req_id;
- req_id = ivrs_mappings[bdf].dte_requestor_id;
+ int req_id = ivrs_mappings[bdf].dte_requestor_id;
+
+ amd_iommu_sync_p2m(d);
if ( ivrs_mappings[req_id].unity_map_enable )
{
diff --git a/xen/drivers/passthrough/io.c b/xen/drivers/passthrough/io.c
index a364627d4e..528839550b 100644
--- a/xen/drivers/passthrough/io.c
+++ b/xen/drivers/passthrough/io.c
@@ -25,7 +25,7 @@ static void pt_irq_time_out(void *data)
{
struct hvm_mirq_dpci_mapping *irq_map = data;
unsigned int guest_gsi, machine_gsi = 0;
- struct hvm_irq_dpci *dpci = irq_map->dom->arch.hvm_domain.irq.dpci;
+ struct hvm_irq_dpci *dpci = domain_get_irq_dpci(irq_map->dom);
struct dev_intx_gsi_link *digl;
uint32_t device, intx;
@@ -49,7 +49,7 @@ static void pt_irq_time_out(void *data)
int pt_irq_create_bind_vtd(
struct domain *d, xen_domctl_bind_pt_irq_t *pt_irq_bind)
{
- struct hvm_irq_dpci *hvm_irq_dpci = d->arch.hvm_domain.irq.dpci;
+ struct hvm_irq_dpci *hvm_irq_dpci = domain_get_irq_dpci(d);
uint32_t machine_gsi, guest_gsi;
uint32_t device, intx, link;
struct dev_intx_gsi_link *digl;
@@ -65,11 +65,8 @@ int pt_irq_create_bind_vtd(
for ( int i = 0; i < NR_IRQS; i++ )
INIT_LIST_HEAD(&hvm_irq_dpci->mirq[i].digl_list);
- if ( cmpxchg((unsigned long *)&d->arch.hvm_domain.irq.dpci,
- 0, (unsigned long)hvm_irq_dpci) != 0 )
+ if ( domain_set_irq_dpci(d, hvm_irq_dpci) == 0 )
xfree(hvm_irq_dpci);
-
- hvm_irq_dpci = d->arch.hvm_domain.irq.dpci;
}
machine_gsi = pt_irq_bind->machine_irq;
@@ -116,7 +113,7 @@ int pt_irq_create_bind_vtd(
int pt_irq_destroy_bind_vtd(
struct domain *d, xen_domctl_bind_pt_irq_t *pt_irq_bind)
{
- struct hvm_irq_dpci *hvm_irq_dpci = d->arch.hvm_domain.irq.dpci;
+ struct hvm_irq_dpci *hvm_irq_dpci = domain_get_irq_dpci(d);
uint32_t machine_gsi, guest_gsi;
uint32_t device, intx, link;
struct list_head *digl_list, *tmp;
@@ -133,14 +130,15 @@ int pt_irq_destroy_bind_vtd(
hvm_irq_dpci->link_cnt[link]--;
gdprintk(XENLOG_INFO,
- "pt_irq_destroy_bind_vtd: machine_gsi=%d, guest_gsi=%d, device=%d, intx=%d.\n",
- machine_gsi, guest_gsi, device, intx);
- memset(&hvm_irq_dpci->girq[guest_gsi], 0, sizeof(struct hvm_girq_dpci_mapping));
+ "pt_irq_destroy_bind_vtd: machine_gsi=%d "
+ "guest_gsi=%d, device=%d, intx=%d.\n",
+ machine_gsi, guest_gsi, device, intx);
+ memset(&hvm_irq_dpci->girq[guest_gsi], 0,
+ sizeof(struct hvm_girq_dpci_mapping));
/* clear the mirq info */
if ( hvm_irq_dpci->mirq[machine_gsi].valid )
{
-
list_for_each_safe ( digl_list, tmp,
&hvm_irq_dpci->mirq[machine_gsi].digl_list )
{
@@ -174,10 +172,10 @@ int pt_irq_destroy_bind_vtd(
int hvm_do_IRQ_dpci(struct domain *d, unsigned int mirq)
{
- struct hvm_irq *hvm_irq = &d->arch.hvm_domain.irq;
+ struct hvm_irq_dpci *dpci = domain_get_irq_dpci(d);
- if ( !iommu_enabled || (d == dom0) || (hvm_irq->dpci == NULL) ||
- !hvm_irq->dpci->mirq[mirq].valid )
+ if ( !iommu_enabled || (d == dom0) || !dpci ||
+ !dpci->mirq[mirq].valid )
return 0;
/*
@@ -186,58 +184,18 @@ int hvm_do_IRQ_dpci(struct domain *d, unsigned int mirq)
* this case the guest may not pick up the interrupt (e.g., masked at the
* PIC) and we need to detect that.
*/
- set_bit(mirq, hvm_irq->dpci->dirq_mask);
- set_timer(&hvm_irq->dpci->hvm_timer[irq_to_vector(mirq)],
+ set_bit(mirq, dpci->dirq_mask);
+ set_timer(&dpci->hvm_timer[irq_to_vector(mirq)],
NOW() + PT_IRQ_TIME_OUT);
vcpu_kick(d->vcpu[0]);
return 1;
}
-static void hvm_dpci_isairq_eoi(struct domain *d, unsigned int isairq)
-{
- struct hvm_irq *hvm_irq = &d->arch.hvm_domain.irq;
- struct hvm_irq_dpci *dpci = hvm_irq->dpci;
- struct dev_intx_gsi_link *digl, *tmp;
- int i;
-
- ASSERT(isairq < NR_ISAIRQS);
- if ( !iommu_enabled || !dpci ||
- !test_bit(isairq, dpci->isairq_map) )
- return;
-
- /* Multiple mirq may be mapped to one isa irq */
- for ( i = 0; i < NR_IRQS; i++ )
- {
- if ( !dpci->mirq[i].valid )
- continue;
-
- list_for_each_entry_safe ( digl, tmp,
- &dpci->mirq[i].digl_list, list )
- {
- if ( hvm_irq->pci_link.route[digl->link] == isairq )
- {
- hvm_pci_intx_deassert(d, digl->device, digl->intx);
- spin_lock(&dpci->dirq_lock);
- if ( --dpci->mirq[i].pending == 0 )
- {
- spin_unlock(&dpci->dirq_lock);
- gdprintk(XENLOG_INFO VTDPREFIX,
- "hvm_dpci_isairq_eoi:: mirq = %x\n", i);
- stop_timer(&dpci->hvm_timer[irq_to_vector(i)]);
- pirq_guest_eoi(d, i);
- }
- else
- spin_unlock(&dpci->dirq_lock);
- }
- }
- }
-}
-
void hvm_dpci_eoi(struct domain *d, unsigned int guest_gsi,
union vioapic_redir_entry *ent)
{
- struct hvm_irq_dpci *hvm_irq_dpci = d->arch.hvm_domain.irq.dpci;
+ struct hvm_irq_dpci *hvm_irq_dpci = domain_get_irq_dpci(d);
uint32_t device, intx, machine_gsi;
if ( !iommu_enabled || (hvm_irq_dpci == NULL) ||
diff --git a/xen/drivers/passthrough/iommu.c b/xen/drivers/passthrough/iommu.c
index b0f26944de..2cf5551337 100644
--- a/xen/drivers/passthrough/iommu.c
+++ b/xen/drivers/passthrough/iommu.c
@@ -58,7 +58,7 @@ int assign_device(struct domain *d, u8 bus, u8 devfn)
void iommu_domain_destroy(struct domain *d)
{
- struct hvm_irq_dpci *hvm_irq_dpci = d->arch.hvm_domain.irq.dpci;
+ struct hvm_irq_dpci *hvm_irq_dpci = domain_get_irq_dpci(d);
uint32_t i;
struct hvm_iommu *hd = domain_hvm_iommu(d);
struct list_head *ioport_list, *digl_list, *tmp;
diff --git a/xen/drivers/passthrough/pci-direct.h b/xen/drivers/passthrough/pci-direct.h
deleted file mode 100644
index 920343851b..0000000000
--- a/xen/drivers/passthrough/pci-direct.h
+++ /dev/null
@@ -1,48 +0,0 @@
-#ifndef ASM_PCI_DIRECT_H
-#define ASM_PCI_DIRECT_H 1
-
-#include <xen/types.h>
-#include <asm/io.h>
-
-/* Direct PCI access. This is used for PCI accesses in early boot before
- the PCI subsystem works. */
-
-#define PDprintk(x...)
-
-static inline u32 read_pci_config(u8 bus, u8 slot, u8 func, u8 offset)
-{
- u32 v;
- outl(0x80000000 | (bus<<16) | (slot<<11) | (func<<8) | offset, 0xcf8);
- v = inl(0xcfc);
- if (v != 0xffffffff)
- PDprintk("%x reading 4 from %x: %x\n", slot, offset, v);
- return v;
-}
-
-static inline u8 read_pci_config_byte(u8 bus, u8 slot, u8 func, u8 offset)
-{
- u8 v;
- outl(0x80000000 | (bus<<16) | (slot<<11) | (func<<8) | offset, 0xcf8);
- v = inb(0xcfc + (offset&3));
- PDprintk("%x reading 1 from %x: %x\n", slot, offset, v);
- return v;
-}
-
-static inline u16 read_pci_config_16(u8 bus, u8 slot, u8 func, u8 offset)
-{
- u16 v;
- outl(0x80000000 | (bus<<16) | (slot<<11) | (func<<8) | offset, 0xcf8);
- v = inw(0xcfc + (offset&2));
- PDprintk("%x reading 2 from %x: %x\n", slot, offset, v);
- return v;
-}
-
-static inline void write_pci_config(
- u8 bus, u8 slot, u8 func, u8 offset, u32 val)
-{
- PDprintk("%x writing to %x: %x\n", slot, offset, val);
- outl(0x80000000 | (bus<<16) | (slot<<11) | (func<<8) | offset, 0xcf8);
- outl(val, 0xcfc);
-}
-
-#endif
diff --git a/xen/drivers/passthrough/vtd/Makefile b/xen/drivers/passthrough/vtd/Makefile
index 53b18b8f3f..06ee624ae7 100644
--- a/xen/drivers/passthrough/vtd/Makefile
+++ b/xen/drivers/passthrough/vtd/Makefile
@@ -1,3 +1,5 @@
+subdir-$(x86) += x86
+
obj-y += iommu.o
obj-y += dmar.o
obj-y += utils.o
diff --git a/xen/drivers/passthrough/vtd/dmar.c b/xen/drivers/passthrough/vtd/dmar.c
index 915e1d04ef..9498914044 100644
--- a/xen/drivers/passthrough/vtd/dmar.c
+++ b/xen/drivers/passthrough/vtd/dmar.c
@@ -25,9 +25,9 @@
#include <xen/acpi.h>
#include <xen/mm.h>
#include <xen/xmalloc.h>
+#include <xen/pci.h>
#include <asm/string.h>
#include "dmar.h"
-#include "../pci-direct.h"
#include "../pci_regs.h"
int vtd_enabled;
@@ -211,7 +211,7 @@ struct acpi_atsr_unit * acpi_find_matched_atsr_unit(struct pci_dev *dev)
static int scope_device_count(void *start, void *end)
{
struct acpi_dev_scope *scope;
- u8 bus, sub_bus, sec_bus;
+ u16 bus, sub_bus, sec_bus;
struct acpi_pci_path *path;
int depth, count = 0;
u8 dev, func;
@@ -231,9 +231,9 @@ static int scope_device_count(void *start, void *end)
bus = scope->start_bus;
depth = (scope->length - sizeof(struct acpi_dev_scope))
/ sizeof(struct acpi_pci_path);
- while ( --depth )
+ while ( --depth > 0 )
{
- bus = read_pci_config_byte(
+ bus = pci_conf_read8(
bus, path->dev, path->fn, PCI_SECONDARY_BUS);
path++;
}
@@ -250,9 +250,9 @@ static int scope_device_count(void *start, void *end)
dprintk(XENLOG_INFO VTDPREFIX,
"found bridge: bdf = %x:%x:%x\n",
bus, path->dev, path->fn);
- sec_bus = read_pci_config_byte(
+ sec_bus = pci_conf_read8(
bus, path->dev, path->fn, PCI_SECONDARY_BUS);
- sub_bus = read_pci_config_byte(
+ sub_bus = pci_conf_read8(
bus, path->dev, path->fn, PCI_SUBORDINATE_BUS);
while ( sec_bus <= sub_bus )
@@ -261,7 +261,7 @@ static int scope_device_count(void *start, void *end)
{
for ( func = 0; func < 8; func++ )
{
- l = read_pci_config(
+ l = pci_conf_read32(
sec_bus, dev, func, PCI_VENDOR_ID);
/* some broken boards return 0 or
@@ -301,7 +301,7 @@ static int __init acpi_parse_dev_scope(
void *start, void *end, void *acpi_entry, int type)
{
struct acpi_dev_scope *scope;
- u8 bus, sub_bus, sec_bus;
+ u16 bus, sub_bus, sec_bus;
struct acpi_pci_path *path;
struct acpi_ioapic_unit *acpi_ioapic_unit = NULL;
int depth;
@@ -353,9 +353,9 @@ static int __init acpi_parse_dev_scope(
/ sizeof(struct acpi_pci_path);
bus = scope->start_bus;
- while ( --depth )
+ while ( --depth > 0 )
{
- bus = read_pci_config_byte(
+ bus = pci_conf_read8(
bus, path->dev, path->fn, PCI_SECONDARY_BUS);
path++;
}
@@ -374,9 +374,9 @@ static int __init acpi_parse_dev_scope(
dprintk(XENLOG_INFO VTDPREFIX,
"found bridge: bus = %x dev = %x func = %x\n",
bus, path->dev, path->fn);
- sec_bus = read_pci_config_byte(
+ sec_bus = pci_conf_read8(
bus, path->dev, path->fn, PCI_SECONDARY_BUS);
- sub_bus = read_pci_config_byte(
+ sub_bus = pci_conf_read8(
bus, path->dev, path->fn, PCI_SUBORDINATE_BUS);
while ( sec_bus <= sub_bus )
@@ -385,7 +385,7 @@ static int __init acpi_parse_dev_scope(
{
for ( func = 0; func < 8; func++ )
{
- l = read_pci_config(
+ l = pci_conf_read32(
sec_bus, dev, func, PCI_VENDOR_ID);
/* some broken boards return 0 or
diff --git a/xen/drivers/passthrough/vtd/dmar.h b/xen/drivers/passthrough/vtd/dmar.h
index 040a626e03..5a6ac2e7b6 100644
--- a/xen/drivers/passthrough/vtd/dmar.h
+++ b/xen/drivers/passthrough/vtd/dmar.h
@@ -92,14 +92,10 @@ struct acpi_rmrr_unit * acpi_find_matched_rmrr_unit(struct pci_dev *dev);
#define RMRR_TYPE 2
#define ATSR_TYPE 3
-#define DMAR_OPERATION_TIMEOUT (HZ*60) /* 1m */
-#define time_after(a,b) \
- (typecheck(unsigned long, a) && \
- typecheck(unsigned long, b) && \
- ((long)(b) - (long)(a) < 0))
+#define DMAR_OPERATION_TIMEOUT MILLISECS(1000)
int vtd_hw_check(void);
void disable_pmr(struct iommu *iommu);
int is_usb_device(struct pci_dev *pdev);
-#endif // _DMAR_H_
+#endif /* _DMAR_H_ */
diff --git a/xen/drivers/passthrough/vtd/intremap.c b/xen/drivers/passthrough/vtd/intremap.c
index 301a8f623b..040d7ea5d4 100644
--- a/xen/drivers/passthrough/vtd/intremap.c
+++ b/xen/drivers/passthrough/vtd/intremap.c
@@ -21,10 +21,11 @@
#include <xen/irq.h>
#include <xen/sched.h>
#include <xen/iommu.h>
+#include <xen/time.h>
+#include <xen/pci.h>
#include "iommu.h"
#include "dmar.h"
#include "vtd.h"
-#include "../pci-direct.h"
#include "../pci_regs.h"
#include "msi.h"
#include "extern.h"
@@ -45,7 +46,7 @@ u16 apicid_to_bdf(int apic_id)
static void remap_entry_to_ioapic_rte(
struct iommu *iommu, struct IO_APIC_route_entry *old_rte)
{
- struct iremap_entry *iremap_entry = NULL;
+ struct iremap_entry *iremap_entry = NULL, *iremap_entries;
struct IO_APIC_route_remap_entry *remap_rte;
unsigned int index;
unsigned long flags;
@@ -70,7 +71,9 @@ static void remap_entry_to_ioapic_rte(
spin_lock_irqsave(&ir_ctrl->iremap_lock, flags);
- iremap_entry = &ir_ctrl->iremap[index];
+ iremap_entries =
+ (struct iremap_entry *)map_vtd_domain_page(ir_ctrl->iremap_maddr);
+ iremap_entry = &iremap_entries[index];
old_rte->vector = iremap_entry->lo.vector;
old_rte->delivery_mode = iremap_entry->lo.dlm;
@@ -80,13 +83,14 @@ static void remap_entry_to_ioapic_rte(
old_rte->dest.logical.__reserved_1 = 0;
old_rte->dest.logical.logical_dest = iremap_entry->lo.dst;
+ unmap_vtd_domain_page(iremap_entries);
spin_unlock_irqrestore(&ir_ctrl->iremap_lock, flags);
}
static void ioapic_rte_to_remap_entry(struct iommu *iommu,
int apic_id, struct IO_APIC_route_entry *old_rte)
{
- struct iremap_entry *iremap_entry = NULL;
+ struct iremap_entry *iremap_entry = NULL, *iremap_entries;
struct IO_APIC_route_remap_entry *remap_rte;
unsigned int index;
unsigned long flags;
@@ -103,7 +107,10 @@ static void ioapic_rte_to_remap_entry(struct iommu *iommu,
goto out;
}
- iremap_entry = &(ir_ctrl->iremap[index]);
+ iremap_entries =
+ (struct iremap_entry *)map_vtd_domain_page(ir_ctrl->iremap_maddr);
+ iremap_entry = &iremap_entries[index];
+
if ( *(u64 *)iremap_entry != 0 )
dprintk(XENLOG_WARNING VTDPREFIX,
"Interrupt remapping entry is in use already!\n");
@@ -124,12 +131,13 @@ static void ioapic_rte_to_remap_entry(struct iommu *iommu,
iremap_entry->lo.p = 1; /* finally, set present bit */
ir_ctrl->iremap_index++;
+ unmap_vtd_domain_page(iremap_entries);
iommu_flush_iec_index(iommu, 0, index);
ret = invalidate_sync(iommu);
- /* now construct new ioapic rte entry */
+ /* now construct new ioapic rte entry */
remap_rte->vector = old_rte->vector;
- remap_rte->delivery_mode = 0; /* has to be 0 for remap format */
+ remap_rte->delivery_mode = 0; /* has to be 0 for remap format */
remap_rte->index_15 = index & 0x8000;
remap_rte->index_0_14 = index & 0x7fff;
remap_rte->delivery_status = old_rte->delivery_status;
@@ -154,7 +162,7 @@ io_apic_read_remap_rte(
struct iommu *iommu = ioapic_to_iommu(mp_ioapics[apic].mpc_apicid);
struct ir_ctrl *ir_ctrl = iommu_ir_ctrl(iommu);
- if ( !iommu || !ir_ctrl || !(ir_ctrl->iremap) )
+ if ( !iommu || !ir_ctrl || ir_ctrl->iremap_maddr == 0 )
{
*IO_APIC_BASE(apic) = reg;
return *(IO_APIC_BASE(apic)+4);
@@ -200,7 +208,7 @@ io_apic_write_remap_rte(
struct iommu *iommu = ioapic_to_iommu(mp_ioapics[apic].mpc_apicid);
struct ir_ctrl *ir_ctrl = iommu_ir_ctrl(iommu);
- if ( !iommu || !ir_ctrl || !(ir_ctrl->iremap) )
+ if ( !iommu || !ir_ctrl || ir_ctrl->iremap_maddr == 0 )
{
*IO_APIC_BASE(apic) = reg;
*(IO_APIC_BASE(apic)+4) = value;
@@ -237,43 +245,41 @@ io_apic_write_remap_rte(
int intremap_setup(struct iommu *iommu)
{
struct ir_ctrl *ir_ctrl;
- unsigned long start_time;
- u64 paddr;
+ s_time_t start_time;
if ( !ecap_intr_remap(iommu->ecap) )
return -ENODEV;
ir_ctrl = iommu_ir_ctrl(iommu);
- if ( ir_ctrl->iremap == NULL )
+ if ( ir_ctrl->iremap_maddr == 0 )
{
- ir_ctrl->iremap = alloc_xenheap_page();
- if ( ir_ctrl->iremap == NULL )
+ ir_ctrl->iremap_maddr = alloc_pgtable_maddr();
+ if ( ir_ctrl->iremap_maddr == 0 )
{
dprintk(XENLOG_WARNING VTDPREFIX,
- "Cannot allocate memory for ir_ctrl->iremap\n");
+ "Cannot allocate memory for ir_ctrl->iremap_maddr\n");
return -ENODEV;
}
- memset(ir_ctrl->iremap, 0, PAGE_SIZE);
}
- paddr = virt_to_maddr(ir_ctrl->iremap);
#if defined(ENABLED_EXTENDED_INTERRUPT_SUPPORT)
/* set extended interrupt mode bit */
- paddr |= ecap_ext_intr(iommu->ecap) ? (1 << IRTA_REG_EIMI_SHIFT) : 0;
+ ir_ctrl->iremap_maddr |=
+ ecap_ext_intr(iommu->ecap) ? (1 << IRTA_REG_EIMI_SHIFT) : 0;
#endif
/* size field = 256 entries per 4K page = 8 - 1 */
- paddr |= 7;
- dmar_writeq(iommu->reg, DMAR_IRTA_REG, paddr);
+ ir_ctrl->iremap_maddr |= 7;
+ dmar_writeq(iommu->reg, DMAR_IRTA_REG, ir_ctrl->iremap_maddr);
/* set SIRTP */
iommu->gcmd |= DMA_GCMD_SIRTP;
dmar_writel(iommu->reg, DMAR_GCMD_REG, iommu->gcmd);
/* Make sure hardware complete it */
- start_time = jiffies;
+ start_time = NOW();
while ( !(dmar_readl(iommu->reg, DMAR_GSTS_REG) & DMA_GSTS_SIRTPS) )
{
- if ( time_after(jiffies, start_time + DMAR_OPERATION_TIMEOUT) )
+ if ( NOW() > (start_time + DMAR_OPERATION_TIMEOUT) )
{
dprintk(XENLOG_ERR VTDPREFIX,
"Cannot set SIRTP field for interrupt remapping\n");
@@ -286,10 +292,10 @@ int intremap_setup(struct iommu *iommu)
iommu->gcmd |= DMA_GCMD_CFI;
dmar_writel(iommu->reg, DMAR_GCMD_REG, iommu->gcmd);
- start_time = jiffies;
+ start_time = NOW();
while ( !(dmar_readl(iommu->reg, DMAR_GSTS_REG) & DMA_GSTS_CFIS) )
{
- if ( time_after(jiffies, start_time + DMAR_OPERATION_TIMEOUT) )
+ if ( NOW() > (start_time + DMAR_OPERATION_TIMEOUT) )
{
dprintk(XENLOG_ERR VTDPREFIX,
"Cannot set CFI field for interrupt remapping\n");
@@ -302,10 +308,10 @@ int intremap_setup(struct iommu *iommu)
iommu->gcmd |= DMA_GCMD_IRE;
dmar_writel(iommu->reg, DMAR_GCMD_REG, iommu->gcmd);
- start_time = jiffies;
+ start_time = NOW();
while ( !(dmar_readl(iommu->reg, DMAR_GSTS_REG) & DMA_GSTS_IRES) )
{
- if ( time_after(jiffies, start_time + DMAR_OPERATION_TIMEOUT) )
+ if ( NOW() > (start_time + DMAR_OPERATION_TIMEOUT) )
{
dprintk(XENLOG_ERR VTDPREFIX,
"Cannot set IRE field for interrupt remapping\n");
diff --git a/xen/drivers/passthrough/vtd/iommu.c b/xen/drivers/passthrough/vtd/iommu.c
index 968e25d7f5..59babdfd66 100644
--- a/xen/drivers/passthrough/vtd/iommu.c
+++ b/xen/drivers/passthrough/vtd/iommu.c
@@ -24,12 +24,16 @@
#include <xen/xmalloc.h>
#include <xen/domain_page.h>
#include <xen/iommu.h>
+#include <xen/numa.h>
+#include <xen/time.h>
+#include <xen/pci.h>
+#include <asm/paging.h>
#include "iommu.h"
#include "dmar.h"
-#include "../pci-direct.h"
#include "../pci_regs.h"
#include "msi.h"
#include "extern.h"
+#include "vtd.h"
#define domain_iommu_domid(d) ((d)->arch.hvm_domain.hvm_iommu.iommu_domid)
@@ -156,11 +160,11 @@ struct iommu_flush *iommu_get_flush(struct iommu *iommu)
return &(iommu->intel->flush);
}
-unsigned int x86_clflush_size;
+unsigned int clflush_size;
void clflush_cache_range(void *adr, int size)
{
int i;
- for ( i = 0; i < size; i += x86_clflush_size )
+ for ( i = 0; i < size; i += clflush_size )
clflush(adr + i);
}
@@ -170,78 +174,82 @@ static void __iommu_flush_cache(struct iommu *iommu, void *addr, int size)
clflush_cache_range(addr, size);
}
-#define iommu_flush_cache_entry(iommu, addr) \
- __iommu_flush_cache(iommu, addr, 8)
-#define iommu_flush_cache_page(iommu, addr) \
- __iommu_flush_cache(iommu, addr, PAGE_SIZE_4K)
+void iommu_flush_cache_entry(struct iommu *iommu, void *addr)
+{
+ __iommu_flush_cache(iommu, addr, 8);
+}
+
+void iommu_flush_cache_page(struct iommu *iommu, void *addr)
+{
+ __iommu_flush_cache(iommu, addr, PAGE_SIZE_4K);
+}
int nr_iommus;
/* context entry handling */
-static struct context_entry * device_to_context_entry(struct iommu *iommu,
- u8 bus, u8 devfn)
+static u64 bus_to_context_maddr(struct iommu *iommu, u8 bus)
{
- struct root_entry *root;
- struct context_entry *context;
- unsigned long phy_addr;
+ struct root_entry *root, *root_entries;
unsigned long flags;
+ u64 maddr;
spin_lock_irqsave(&iommu->lock, flags);
- root = &iommu->root_entry[bus];
+ root_entries = (struct root_entry *)map_vtd_domain_page(iommu->root_maddr);
+ root = &root_entries[bus];
if ( !root_present(*root) )
{
- phy_addr = (unsigned long) alloc_xenheap_page();
- if ( !phy_addr )
+ maddr = alloc_pgtable_maddr();
+ if ( maddr == 0 )
{
spin_unlock_irqrestore(&iommu->lock, flags);
- return NULL;
+ return 0;
}
- memset((void *) phy_addr, 0, PAGE_SIZE);
- iommu_flush_cache_page(iommu, (void *)phy_addr);
- phy_addr = virt_to_maddr((void *)phy_addr);
- set_root_value(*root, phy_addr);
+ set_root_value(*root, maddr);
set_root_present(*root);
iommu_flush_cache_entry(iommu, root);
}
- phy_addr = (unsigned long) get_context_addr(*root);
- context = (struct context_entry *)maddr_to_virt(phy_addr);
+ maddr = (u64) get_context_addr(*root);
+ unmap_vtd_domain_page(root_entries);
spin_unlock_irqrestore(&iommu->lock, flags);
- return &context[devfn];
+ return maddr;
}
static int device_context_mapped(struct iommu *iommu, u8 bus, u8 devfn)
{
- struct root_entry *root;
+ struct root_entry *root, *root_entries;
struct context_entry *context;
- unsigned long phy_addr;
+ u64 context_maddr;
int ret;
unsigned long flags;
spin_lock_irqsave(&iommu->lock, flags);
- root = &iommu->root_entry[bus];
+ root_entries = (struct root_entry *)map_vtd_domain_page(iommu->root_maddr);
+ root = &root_entries[bus];
if ( !root_present(*root) )
{
ret = 0;
goto out;
}
- phy_addr = get_context_addr(*root);
- context = (struct context_entry *)maddr_to_virt(phy_addr);
+ context_maddr = get_context_addr(*root);
+ context = (struct context_entry *)map_vtd_domain_page(context_maddr);
ret = context_present(context[devfn]);
+ unmap_vtd_domain_page(context);
out:
+ unmap_vtd_domain_page(root_entries);
spin_unlock_irqrestore(&iommu->lock, flags);
return ret;
}
-static struct page_info *addr_to_dma_page(struct domain *domain, u64 addr)
+static u64 addr_to_dma_page_maddr(struct domain *domain, u64 addr)
{
struct hvm_iommu *hd = domain_hvm_iommu(domain);
struct acpi_drhd_unit *drhd;
struct iommu *iommu;
int addr_width = agaw_to_width(hd->agaw);
- struct dma_pte *parent, *pte = NULL, *pgd;
+ struct dma_pte *parent, *pte = NULL;
int level = agaw_to_level(hd->agaw);
int offset;
unsigned long flags;
- struct page_info *pg = NULL;
+ u64 pte_maddr = 0;
u64 *vaddr = NULL;
drhd = list_entry(acpi_drhd_units.next, typeof(*drhd), list);
@@ -249,19 +257,14 @@ static struct page_info *addr_to_dma_page(struct domain *domain, u64 addr)
addr &= (((u64)1) << addr_width) - 1;
spin_lock_irqsave(&hd->mapping_lock, flags);
- if ( !hd->pgd )
+ if ( hd->pgd_maddr == 0 )
{
- pgd = (struct dma_pte *)alloc_xenheap_page();
- if ( !pgd )
- {
- spin_unlock_irqrestore(&hd->mapping_lock, flags);
- return NULL;
- }
- memset(pgd, 0, PAGE_SIZE);
- hd->pgd = pgd;
+ hd->pgd_maddr = alloc_pgtable_maddr();
+ if ( hd->pgd_maddr == 0 )
+ return 0;
}
- parent = hd->pgd;
+ parent = (struct dma_pte *)map_vtd_domain_page(hd->pgd_maddr);
while ( level > 1 )
{
offset = address_level_offset(addr, level);
@@ -269,17 +272,15 @@ static struct page_info *addr_to_dma_page(struct domain *domain, u64 addr)
if ( dma_pte_addr(*pte) == 0 )
{
- pg = alloc_domheap_page(NULL);
- vaddr = map_domain_page(page_to_mfn(pg));
+ u64 maddr = alloc_pgtable_maddr();
+ dma_set_pte_addr(*pte, maddr);
+ vaddr = map_vtd_domain_page(maddr);
if ( !vaddr )
{
+ unmap_vtd_domain_page(parent);
spin_unlock_irqrestore(&hd->mapping_lock, flags);
- return NULL;
+ return 0;
}
- memset(vaddr, 0, PAGE_SIZE);
- iommu_flush_cache_page(iommu, vaddr);
-
- dma_set_pte_addr(*pte, page_to_maddr(pg));
/*
* high level table always sets r/w, last level
@@ -291,21 +292,20 @@ static struct page_info *addr_to_dma_page(struct domain *domain, u64 addr)
}
else
{
- pg = maddr_to_page(pte->val);
- vaddr = map_domain_page(page_to_mfn(pg));
+ vaddr = map_vtd_domain_page(pte->val);
if ( !vaddr )
{
+ unmap_vtd_domain_page(parent);
spin_unlock_irqrestore(&hd->mapping_lock, flags);
- return NULL;
+ return 0;
}
}
- if ( parent != hd->pgd )
- unmap_domain_page(parent);
-
- if ( level == 2 && vaddr )
+ unmap_vtd_domain_page(parent);
+ if ( level == 2 )
{
- unmap_domain_page(vaddr);
+ pte_maddr = pte->val & PAGE_MASK_4K;
+ unmap_vtd_domain_page(vaddr);
break;
}
@@ -315,50 +315,49 @@ static struct page_info *addr_to_dma_page(struct domain *domain, u64 addr)
}
spin_unlock_irqrestore(&hd->mapping_lock, flags);
- return pg;
+ return pte_maddr;
}
/* return address's page at specific level */
-static struct page_info *dma_addr_level_page(struct domain *domain,
- u64 addr, int level)
+static u64 dma_addr_level_page_maddr(
+ struct domain *domain, u64 addr, int level)
{
struct hvm_iommu *hd = domain_hvm_iommu(domain);
struct dma_pte *parent, *pte = NULL;
int total = agaw_to_level(hd->agaw);
int offset;
- struct page_info *pg = NULL;
+ u64 pg_maddr = hd->pgd_maddr;
- parent = hd->pgd;
+ if ( pg_maddr == 0 )
+ return 0;
+
+ parent = (struct dma_pte *)map_vtd_domain_page(pg_maddr);
while ( level <= total )
{
offset = address_level_offset(addr, total);
pte = &parent[offset];
if ( dma_pte_addr(*pte) == 0 )
- {
- if ( parent != hd->pgd )
- unmap_domain_page(parent);
break;
- }
- pg = maddr_to_page(pte->val);
- if ( parent != hd->pgd )
- unmap_domain_page(parent);
+ pg_maddr = pte->val & PAGE_MASK_4K;
+ unmap_vtd_domain_page(parent);
if ( level == total )
- return pg;
+ return pg_maddr;
- parent = map_domain_page(page_to_mfn(pg));
+ parent = map_vtd_domain_page(pte->val);
total--;
}
- return NULL;
+ unmap_vtd_domain_page(parent);
+ return 0;
}
static void iommu_flush_write_buffer(struct iommu *iommu)
{
u32 val;
unsigned long flag;
- unsigned long start_time;
+ s_time_t start_time;
if ( !cap_rwbf(iommu->cap) )
return;
@@ -368,13 +367,13 @@ static void iommu_flush_write_buffer(struct iommu *iommu)
dmar_writel(iommu->reg, DMAR_GCMD_REG, val);
/* Make sure hardware complete it */
- start_time = jiffies;
+ start_time = NOW();
for ( ; ; )
{
val = dmar_readl(iommu->reg, DMAR_GSTS_REG);
if ( !(val & DMA_GSTS_WBFS) )
break;
- if ( time_after(jiffies, start_time + DMAR_OPERATION_TIMEOUT) )
+ if ( NOW() > start_time + DMAR_OPERATION_TIMEOUT )
panic("DMAR hardware is malfunctional,"
" please disable IOMMU\n");
cpu_relax();
@@ -391,7 +390,7 @@ static int flush_context_reg(
struct iommu *iommu = (struct iommu *) _iommu;
u64 val = 0;
unsigned long flag;
- unsigned long start_time;
+ s_time_t start_time;
/*
* In the non-present entry flush case, if hardware doesn't cache
@@ -429,13 +428,13 @@ static int flush_context_reg(
dmar_writeq(iommu->reg, DMAR_CCMD_REG, val);
/* Make sure hardware complete it */
- start_time = jiffies;
+ start_time = NOW();
for ( ; ; )
{
val = dmar_readq(iommu->reg, DMAR_CCMD_REG);
if ( !(val & DMA_CCMD_ICC) )
break;
- if ( time_after(jiffies, start_time + DMAR_OPERATION_TIMEOUT) )
+ if ( NOW() > start_time + DMAR_OPERATION_TIMEOUT )
panic("DMAR hardware is malfunctional, please disable IOMMU\n");
cpu_relax();
}
@@ -479,7 +478,7 @@ static int flush_iotlb_reg(void *_iommu, u16 did,
int tlb_offset = ecap_iotlb_offset(iommu->ecap);
u64 val = 0, val_iva = 0;
unsigned long flag;
- unsigned long start_time;
+ s_time_t start_time;
/*
* In the non-present entry flush case, if hardware doesn't cache
@@ -526,13 +525,13 @@ static int flush_iotlb_reg(void *_iommu, u16 did,
dmar_writeq(iommu->reg, tlb_offset + 8, val);
/* Make sure hardware complete it */
- start_time = jiffies;
+ start_time = NOW();
for ( ; ; )
{
val = dmar_readq(iommu->reg, tlb_offset + 8);
if ( !(val & DMA_TLB_IVT) )
break;
- if ( time_after(jiffies, start_time + DMAR_OPERATION_TIMEOUT) )
+ if ( NOW() > start_time + DMAR_OPERATION_TIMEOUT )
panic("DMAR hardware is malfunctional, please disable IOMMU\n");
cpu_relax();
}
@@ -630,17 +629,17 @@ static void dma_pte_clear_one(struct domain *domain, u64 addr)
{
struct acpi_drhd_unit *drhd;
struct iommu *iommu;
- struct dma_pte *pte = NULL;
- struct page_info *pg = NULL;
+ struct dma_pte *page = NULL, *pte = NULL;
+ u64 pg_maddr;
drhd = list_entry(acpi_drhd_units.next, typeof(*drhd), list);
/* get last level pte */
- pg = dma_addr_level_page(domain, addr, 1);
- if ( !pg )
+ pg_maddr = dma_addr_level_page_maddr(domain, addr, 1);
+ if ( pg_maddr == 0 )
return;
- pte = (struct dma_pte *)map_domain_page(page_to_mfn(pg));
- pte += address_level_offset(addr, 1);
+ page = (struct dma_pte *)map_vtd_domain_page(pg_maddr);
+ pte = page + address_level_offset(addr, 1);
if ( pte )
{
dma_clear_pte(*pte);
@@ -656,7 +655,7 @@ static void dma_pte_clear_one(struct domain *domain, u64 addr)
iommu_flush_write_buffer(iommu);
}
}
- unmap_domain_page(pte);
+ unmap_vtd_domain_page(page);
}
/* clear last level pte, a tlb flush should be followed */
@@ -686,11 +685,11 @@ void dma_pte_free_pagetable(struct domain *domain, u64 start, u64 end)
struct hvm_iommu *hd = domain_hvm_iommu(domain);
struct iommu *iommu;
int addr_width = agaw_to_width(hd->agaw);
- struct dma_pte *pte;
+ struct dma_pte *page, *pte;
int total = agaw_to_level(hd->agaw);
int level;
u32 tmp;
- struct page_info *pg = NULL;
+ u64 pg_maddr;
drhd = list_entry(acpi_drhd_units.next, typeof(*drhd), list);
iommu = drhd->iommu;
@@ -708,15 +707,15 @@ void dma_pte_free_pagetable(struct domain *domain, u64 start, u64 end)
while ( tmp < end )
{
- pg = dma_addr_level_page(domain, tmp, level);
- if ( !pg )
+ pg_maddr = dma_addr_level_page_maddr(domain, tmp, level);
+ if ( pg_maddr == 0 )
return;
- pte = (struct dma_pte *)map_domain_page(page_to_mfn(pg));
- pte += address_level_offset(tmp, level);
+ page = (struct dma_pte *)map_vtd_domain_page(pg_maddr);
+ pte = page + address_level_offset(tmp, level);
dma_clear_pte(*pte);
iommu_flush_cache_entry(iommu, pte);
- unmap_domain_page(pte);
- free_domheap_page(pg);
+ unmap_vtd_domain_page(page);
+ free_pgtable_maddr(pg_maddr);
tmp += level_size(level);
}
@@ -726,17 +725,15 @@ void dma_pte_free_pagetable(struct domain *domain, u64 start, u64 end)
/* free pgd */
if ( start == 0 && end == ((((u64)1) << addr_width) - 1) )
{
- free_xenheap_page((void *)hd->pgd);
- hd->pgd = NULL;
+ free_pgtable_maddr(hd->pgd_maddr);
+ hd->pgd_maddr = 0;
}
}
/* iommu handling */
static int iommu_set_root_entry(struct iommu *iommu)
{
- void *addr;
u32 cmd, sts;
- struct root_entry *root;
unsigned long flags;
if ( iommu == NULL )
@@ -746,25 +743,19 @@ static int iommu_set_root_entry(struct iommu *iommu)
return -EINVAL;
}
- if ( unlikely(!iommu->root_entry) )
+ if ( iommu->root_maddr != 0 )
{
- root = (struct root_entry *)alloc_xenheap_page();
- if ( root == NULL )
- return -ENOMEM;
-
- memset((u8*)root, 0, PAGE_SIZE);
- iommu_flush_cache_page(iommu, root);
-
- if ( cmpxchg((unsigned long *)&iommu->root_entry,
- 0, (unsigned long)root) != 0 )
- free_xenheap_page((void *)root);
+ free_pgtable_maddr(iommu->root_maddr);
+ iommu->root_maddr = 0;
}
- addr = iommu->root_entry;
-
spin_lock_irqsave(&iommu->register_lock, flags);
- dmar_writeq(iommu->reg, DMAR_RTADDR_REG, virt_to_maddr(addr));
+ iommu->root_maddr = alloc_pgtable_maddr();
+ if ( iommu->root_maddr == 0 )
+ return -ENOMEM;
+
+ dmar_writeq(iommu->reg, DMAR_RTADDR_REG, iommu->root_maddr);
cmd = iommu->gcmd | DMA_GCMD_SRTP;
dmar_writel(iommu->reg, DMAR_GCMD_REG, cmd);
@@ -1101,8 +1092,11 @@ static void free_iommu(struct iommu *iommu)
{
if ( !iommu )
return;
- if ( iommu->root_entry )
- free_xenheap_page((void *)iommu->root_entry);
+ if ( iommu->root_maddr != 0 )
+ {
+ free_pgtable_maddr(iommu->root_maddr);
+ iommu->root_maddr = 0;
+ }
if ( iommu->reg )
iounmap(iommu->reg);
free_intel_iommu(iommu->intel);
@@ -1157,13 +1151,17 @@ static int domain_context_mapping_one(
u8 bus, u8 devfn)
{
struct hvm_iommu *hd = domain_hvm_iommu(domain);
- struct context_entry *context;
+ struct context_entry *context, *context_entries;
unsigned long flags;
int ret = 0;
+ u64 maddr;
- context = device_to_context_entry(iommu, bus, devfn);
+ maddr = bus_to_context_maddr(iommu, bus);
+ context_entries = (struct context_entry *)map_vtd_domain_page(maddr);
+ context = &context_entries[devfn];
if ( !context )
{
+ unmap_vtd_domain_page(context_entries);
gdprintk(XENLOG_ERR VTDPREFIX,
"domain_context_mapping_one:context == NULL:"
"bdf = %x:%x:%x\n",
@@ -1173,6 +1171,7 @@ static int domain_context_mapping_one(
if ( context_present(*context) )
{
+ unmap_vtd_domain_page(context_entries);
gdprintk(XENLOG_WARNING VTDPREFIX,
"domain_context_mapping_one:context present:bdf=%x:%x:%x\n",
bus, PCI_SLOT(devfn), PCI_FUNC(devfn));
@@ -1193,19 +1192,8 @@ static int domain_context_mapping_one(
else
{
#endif
- if ( !hd->pgd )
- {
- struct dma_pte *pgd = (struct dma_pte *)alloc_xenheap_page();
- if ( !pgd )
- {
- spin_unlock_irqrestore(&hd->mapping_lock, flags);
- return -ENOMEM;
- }
- memset(pgd, 0, PAGE_SIZE);
- hd->pgd = pgd;
- }
-
- context_set_address_root(*context, virt_to_maddr(hd->pgd));
+ ASSERT(hd->pgd_maddr != 0);
+ context_set_address_root(*context, hd->pgd_maddr);
context_set_translation_type(*context, CONTEXT_TT_MULTI_LEVEL);
#ifdef CONTEXT_PASSTHRU
}
@@ -1217,9 +1205,11 @@ static int domain_context_mapping_one(
gdprintk(XENLOG_INFO VTDPREFIX,
"domain_context_mapping_one-%x:%x:%x-*context=%"PRIx64":%"PRIx64
- " hd->pgd=%p\n",
+ " hd->pgd_maddr=%"PRIx64"\n",
bus, PCI_SLOT(devfn), PCI_FUNC(devfn),
- context->hi, context->lo, hd->pgd);
+ context->hi, context->lo, hd->pgd_maddr);
+
+ unmap_vtd_domain_page(context_entries);
if ( iommu_flush_context_device(iommu, domain_iommu_domid(domain),
(((u16)bus) << 8) | devfn,
@@ -1238,13 +1228,13 @@ static int __pci_find_next_cap(u8 bus, unsigned int devfn, u8 pos, int cap)
while ( ttl-- )
{
- pos = read_pci_config_byte(bus, PCI_SLOT(devfn), PCI_FUNC(devfn), pos);
+ pos = pci_conf_read8(bus, PCI_SLOT(devfn), PCI_FUNC(devfn), pos);
if ( pos < 0x40 )
break;
pos &= ~3;
- id = read_pci_config_byte(bus, PCI_SLOT(devfn), PCI_FUNC(devfn),
- pos + PCI_CAP_LIST_ID);
+ id = pci_conf_read8(bus, PCI_SLOT(devfn), PCI_FUNC(devfn),
+ pos + PCI_CAP_LIST_ID);
if ( id == 0xff )
break;
@@ -1268,13 +1258,13 @@ int pdev_type(struct pci_dev *dev)
u16 class_device;
u16 status;
- class_device = read_pci_config_16(dev->bus, PCI_SLOT(dev->devfn),
- PCI_FUNC(dev->devfn), PCI_CLASS_DEVICE);
+ class_device = pci_conf_read16(dev->bus, PCI_SLOT(dev->devfn),
+ PCI_FUNC(dev->devfn), PCI_CLASS_DEVICE);
if ( class_device == PCI_CLASS_BRIDGE_PCI )
return DEV_TYPE_PCI_BRIDGE;
- status = read_pci_config_16(dev->bus, PCI_SLOT(dev->devfn),
- PCI_FUNC(dev->devfn), PCI_STATUS);
+ status = pci_conf_read16(dev->bus, PCI_SLOT(dev->devfn),
+ PCI_FUNC(dev->devfn), PCI_STATUS);
if ( !(status & PCI_STATUS_CAP_LIST) )
return DEV_TYPE_PCI;
@@ -1302,7 +1292,7 @@ static int domain_context_mapping(
switch ( type )
{
case DEV_TYPE_PCI_BRIDGE:
- sec_bus = read_pci_config_byte(
+ sec_bus = pci_conf_read8(
pdev->bus, PCI_SLOT(pdev->devfn),
PCI_FUNC(pdev->devfn), PCI_SECONDARY_BUS);
@@ -1312,7 +1302,7 @@ static int domain_context_mapping(
bus2bridge[sec_bus].devfn = pdev->devfn;
}
- sub_bus = read_pci_config_byte(
+ sub_bus = pci_conf_read8(
pdev->bus, PCI_SLOT(pdev->devfn),
PCI_FUNC(pdev->devfn), PCI_SUBORDINATE_BUS);
@@ -1380,12 +1370,16 @@ static int domain_context_unmap_one(
struct iommu *iommu,
u8 bus, u8 devfn)
{
- struct context_entry *context;
+ struct context_entry *context, *context_entries;
unsigned long flags;
+ u64 maddr;
- context = device_to_context_entry(iommu, bus, devfn);
+ maddr = bus_to_context_maddr(iommu, bus);
+ context_entries = (struct context_entry *)map_vtd_domain_page(maddr);
+ context = &context_entries[devfn];
if ( !context )
{
+ unmap_vtd_domain_page(context_entries);
gdprintk(XENLOG_ERR VTDPREFIX,
"domain_context_unmap_one-%x:%x:%x- context == NULL:return\n",
bus, PCI_SLOT(devfn), PCI_FUNC(devfn));
@@ -1394,6 +1388,7 @@ static int domain_context_unmap_one(
if ( !context_present(*context) )
{
+ unmap_vtd_domain_page(context_entries);
gdprintk(XENLOG_WARNING VTDPREFIX,
"domain_context_unmap_one-%x:%x:%x- "
"context NOT present:return\n",
@@ -1411,6 +1406,7 @@ static int domain_context_unmap_one(
iommu_flush_cache_entry(iommu, context);
iommu_flush_context_global(iommu, 0);
iommu_flush_iotlb_global(iommu, 0);
+ unmap_vtd_domain_page(context_entries);
spin_unlock_irqrestore(&iommu->lock, flags);
return 0;
@@ -1429,10 +1425,10 @@ static int domain_context_unmap(
switch ( type )
{
case DEV_TYPE_PCI_BRIDGE:
- sec_bus = read_pci_config_byte(
+ sec_bus = pci_conf_read8(
pdev->bus, PCI_SLOT(pdev->devfn),
PCI_FUNC(pdev->devfn), PCI_SECONDARY_BUS);
- sub_bus = read_pci_config_byte(
+ sub_bus = pci_conf_read8(
pdev->bus, PCI_SLOT(pdev->devfn),
PCI_FUNC(pdev->devfn), PCI_SUBORDINATE_BUS);
@@ -1566,36 +1562,7 @@ void iommu_domain_teardown(struct domain *d)
return;
iommu_domid_release(d);
-
-#if CONFIG_PAGING_LEVELS == 3
- {
- struct hvm_iommu *hd = domain_hvm_iommu(d);
- int level = agaw_to_level(hd->agaw);
- struct dma_pte *pgd = NULL;
-
- switch ( level )
- {
- case VTD_PAGE_TABLE_LEVEL_3:
- if ( hd->pgd )
- free_xenheap_page((void *)hd->pgd);
- break;
- case VTD_PAGE_TABLE_LEVEL_4:
- if ( hd->pgd )
- {
- pgd = hd->pgd;
- if ( pgd[0].val != 0 )
- free_xenheap_page((void*)maddr_to_virt(
- dma_pte_addr(pgd[0])));
- free_xenheap_page((void *)hd->pgd);
- }
- break;
- default:
- gdprintk(XENLOG_ERR VTDPREFIX,
- "Unsupported p2m table sharing level!\n");
- break;
- }
- }
-#endif
+ iommu_free_pgd(d);
return_devices_to_dom0(d);
}
@@ -1621,8 +1588,8 @@ int intel_iommu_map_page(
{
struct acpi_drhd_unit *drhd;
struct iommu *iommu;
- struct dma_pte *pte = NULL;
- struct page_info *pg = NULL;
+ struct dma_pte *page = NULL, *pte = NULL;
+ u64 pg_maddr;
drhd = list_entry(acpi_drhd_units.next, typeof(*drhd), list);
iommu = drhd->iommu;
@@ -1633,15 +1600,15 @@ int intel_iommu_map_page(
return 0;
#endif
- pg = addr_to_dma_page(d, (paddr_t)gfn << PAGE_SHIFT_4K);
- if ( !pg )
+ pg_maddr = addr_to_dma_page_maddr(d, gfn << PAGE_SHIFT_4K);
+ if ( pg_maddr == 0 )
return -ENOMEM;
- pte = (struct dma_pte *)map_domain_page(page_to_mfn(pg));
- pte += gfn & LEVEL_MASK;
+ page = (struct dma_pte *)map_vtd_domain_page(pg_maddr);
+ pte = page + (gfn & LEVEL_MASK);
dma_set_pte_addr(*pte, (paddr_t)mfn << PAGE_SHIFT_4K);
dma_set_pte_prot(*pte, DMA_PTE_READ | DMA_PTE_WRITE);
iommu_flush_cache_entry(iommu, pte);
- unmap_domain_page(pte);
+ unmap_vtd_domain_page(page);
for_each_drhd_unit ( drhd )
{
@@ -1681,9 +1648,9 @@ int iommu_page_mapping(struct domain *domain, paddr_t iova,
struct acpi_drhd_unit *drhd;
struct iommu *iommu;
unsigned long start_pfn, end_pfn;
- struct dma_pte *pte = NULL;
+ struct dma_pte *page = NULL, *pte = NULL;
int index;
- struct page_info *pg = NULL;
+ u64 pg_maddr;
drhd = list_entry(acpi_drhd_units.next, typeof(*drhd), list);
iommu = drhd->iommu;
@@ -1696,15 +1663,15 @@ int iommu_page_mapping(struct domain *domain, paddr_t iova,
index = 0;
while ( start_pfn < end_pfn )
{
- pg = addr_to_dma_page(domain, iova + PAGE_SIZE_4K * index);
- if ( !pg )
+ pg_maddr = addr_to_dma_page_maddr(domain, iova + PAGE_SIZE_4K * index);
+ if ( pg_maddr == 0 )
return -ENOMEM;
- pte = (struct dma_pte *)map_domain_page(page_to_mfn(pg));
- pte += start_pfn & LEVEL_MASK;
+ page = (struct dma_pte *)map_vtd_domain_page(pg_maddr);
+ pte = page + (start_pfn & LEVEL_MASK);
dma_set_pte_addr(*pte, start_pfn << PAGE_SHIFT_4K);
dma_set_pte_prot(*pte, prot);
iommu_flush_cache_entry(iommu, pte);
- unmap_domain_page(pte);
+ unmap_vtd_domain_page(page);
start_pfn++;
index++;
}
@@ -1814,7 +1781,7 @@ void __init setup_dom0_devices(void)
{
for ( func = 0; func < 8; func++ )
{
- l = read_pci_config(bus, dev, func, PCI_VENDOR_ID);
+ l = pci_conf_read32(bus, dev, func, PCI_VENDOR_ID);
/* some broken boards return 0 or ~0 if a slot is empty: */
if ( (l == 0xffffffff) || (l == 0x00000000) ||
(l == 0x0000ffff) || (l == 0xffff0000) )
@@ -1897,7 +1864,11 @@ static int init_vtd2_hw(void)
if ( qinval_setup(iommu) != 0 )
dprintk(XENLOG_ERR VTDPREFIX,
"Queued Invalidation hardware not found\n");
+ }
+ for_each_drhd_unit ( drhd )
+ {
+ iommu = drhd->iommu;
if ( intremap_setup(iommu) != 0 )
dprintk(XENLOG_ERR VTDPREFIX,
"Interrupt Remapping hardware not found\n");
@@ -1947,7 +1918,7 @@ int iommu_setup(void)
INIT_LIST_HEAD(&hd->pdev_list);
/* setup clflush size */
- x86_clflush_size = ((cpuid_ebx(1) >> 8) & 0xff) * 8;
+ clflush_size = get_clflush_size();
/* Allocate IO page directory page for the domain. */
drhd = list_entry(acpi_drhd_units.next, typeof(*drhd), list);
@@ -2038,129 +2009,6 @@ int intel_iommu_assign_device(struct domain *d, u8 bus, u8 devfn)
return ret;
}
-void iommu_set_pgd(struct domain *d)
-{
- struct hvm_iommu *hd = domain_hvm_iommu(d);
- unsigned long p2m_table;
-
- if ( hd->pgd )
- {
- gdprintk(XENLOG_INFO VTDPREFIX,
- "iommu_set_pgd_1: hd->pgd = %p\n", hd->pgd);
- hd->pgd = NULL;
- }
- p2m_table = mfn_x(pagetable_get_mfn(d->arch.phys_table));
-
-#if CONFIG_PAGING_LEVELS == 3
- if ( !hd->pgd )
- {
- int level = agaw_to_level(hd->agaw);
- struct dma_pte *pmd = NULL;
- struct dma_pte *pgd = NULL;
- struct dma_pte *pte = NULL;
- l3_pgentry_t *l3e;
- unsigned long flags;
- int i;
-
- spin_lock_irqsave(&hd->mapping_lock, flags);
- if ( !hd->pgd )
- {
- pgd = (struct dma_pte *)alloc_xenheap_page();
- if ( !pgd )
- {
- spin_unlock_irqrestore(&hd->mapping_lock, flags);
- gdprintk(XENLOG_ERR VTDPREFIX,
- "Allocate pgd memory failed!\n");
- return;
- }
- memset(pgd, 0, PAGE_SIZE);
- hd->pgd = pgd;
- }
-
- l3e = map_domain_page(p2m_table);
- switch ( level )
- {
- case VTD_PAGE_TABLE_LEVEL_3: /* Weybridge */
- /* We only support 8 entries for the PAE L3 p2m table */
- for ( i = 0; i < 8 ; i++ )
- {
- /* Don't create new L2 entry, use ones from p2m table */
- pgd[i].val = l3e[i].l3 | _PAGE_PRESENT | _PAGE_RW;
- }
- break;
-
- case VTD_PAGE_TABLE_LEVEL_4: /* Stoakley */
- /* We allocate one more page for the top vtd page table. */
- pmd = (struct dma_pte *)alloc_xenheap_page();
- if ( !pmd )
- {
- unmap_domain_page(l3e);
- spin_unlock_irqrestore(&hd->mapping_lock, flags);
- gdprintk(XENLOG_ERR VTDPREFIX,
- "Allocate pmd memory failed!\n");
- return;
- }
- memset((u8*)pmd, 0, PAGE_SIZE);
- pte = &pgd[0];
- dma_set_pte_addr(*pte, virt_to_maddr(pmd));
- dma_set_pte_readable(*pte);
- dma_set_pte_writable(*pte);
-
- for ( i = 0; i < 8; i++ )
- {
- /* Don't create new L2 entry, use ones from p2m table */
- pmd[i].val = l3e[i].l3 | _PAGE_PRESENT | _PAGE_RW;
- }
- break;
- default:
- gdprintk(XENLOG_ERR VTDPREFIX,
- "iommu_set_pgd:Unsupported p2m table sharing level!\n");
- break;
- }
- unmap_domain_page(l3e);
- spin_unlock_irqrestore(&hd->mapping_lock, flags);
- }
-#elif CONFIG_PAGING_LEVELS == 4
- if ( !hd->pgd )
- {
- int level = agaw_to_level(hd->agaw);
- l3_pgentry_t *l3e;
- mfn_t pgd_mfn;
-
- switch ( level )
- {
- case VTD_PAGE_TABLE_LEVEL_3:
- l3e = map_domain_page(p2m_table);
- if ( (l3e_get_flags(*l3e) & _PAGE_PRESENT) == 0 )
- {
- gdprintk(XENLOG_ERR VTDPREFIX,
- "iommu_set_pgd: second level wasn't there\n");
- unmap_domain_page(l3e);
- return;
- }
- pgd_mfn = _mfn(l3e_get_pfn(*l3e));
- unmap_domain_page(l3e);
- hd->pgd = maddr_to_virt(pagetable_get_paddr(
- pagetable_from_mfn(pgd_mfn)));
- break;
-
- case VTD_PAGE_TABLE_LEVEL_4:
- pgd_mfn = _mfn(p2m_table);
- hd->pgd = maddr_to_virt(pagetable_get_paddr(
- pagetable_from_mfn(pgd_mfn)));
- break;
- default:
- gdprintk(XENLOG_ERR VTDPREFIX,
- "iommu_set_pgd:Unsupported p2m table sharing level!\n");
- break;
- }
- }
-#endif
- gdprintk(XENLOG_INFO VTDPREFIX,
- "iommu_set_pgd: hd->pgd = %p\n", hd->pgd);
-}
-
-
u8 iommu_state[MAX_IOMMU_REGS * MAX_IOMMUS];
int iommu_suspend(void)
{
diff --git a/xen/drivers/passthrough/vtd/iommu.h b/xen/drivers/passthrough/vtd/iommu.h
index 82593b455a..56bc550a4f 100644
--- a/xen/drivers/passthrough/vtd/iommu.h
+++ b/xen/drivers/passthrough/vtd/iommu.h
@@ -425,7 +425,7 @@ extern struct list_head acpi_rmrr_units;
extern struct list_head acpi_ioapic_units;
struct qi_ctrl {
- struct qinval_entry *qinval; /* queue invalidation page */
+ u64 qinval_maddr; /* queue invalidation page machine address */
int qinval_index; /* queue invalidation index */
spinlock_t qinval_lock; /* lock for queue invalidation page */
spinlock_t qinval_poll_lock; /* lock for queue invalidation poll addr */
@@ -433,7 +433,7 @@ struct qi_ctrl {
};
struct ir_ctrl {
- struct iremap_entry *iremap; /* interrupt remap table */
+ u64 iremap_maddr; /* interrupt remap table machine address */
int iremap_index; /* interrupt remap index */
spinlock_t iremap_lock; /* lock for irq remappping table */
};
diff --git a/xen/drivers/passthrough/vtd/qinval.c b/xen/drivers/passthrough/vtd/qinval.c
index e7aa6cea83..21025986ff 100644
--- a/xen/drivers/passthrough/vtd/qinval.c
+++ b/xen/drivers/passthrough/vtd/qinval.c
@@ -21,10 +21,11 @@
#include <xen/sched.h>
#include <xen/iommu.h>
+#include <xen/time.h>
+#include <xen/pci.h>
#include "iommu.h"
#include "dmar.h"
#include "vtd.h"
-#include "../pci-direct.h"
#include "../pci_regs.h"
#include "msi.h"
#include "extern.h"
@@ -63,13 +64,14 @@ static int qinval_update_qtail(struct iommu *iommu, int index)
static int gen_cc_inv_dsc(struct iommu *iommu, int index,
u16 did, u16 source_id, u8 function_mask, u8 granu)
{
- u64 *ptr64;
unsigned long flags;
- struct qinval_entry * qinval_entry = NULL;
+ struct qinval_entry *qinval_entry = NULL, *qinval_entries;
struct qi_ctrl *qi_ctrl = iommu_qi_ctrl(iommu);
spin_lock_irqsave(&qi_ctrl->qinval_lock, flags);
- qinval_entry = &qi_ctrl->qinval[index];
+ qinval_entries =
+ (struct qinval_entry *)map_vtd_domain_page(qi_ctrl->qinval_maddr);
+ qinval_entry = &qinval_entries[index];
qinval_entry->q.cc_inv_dsc.lo.type = TYPE_INVAL_CONTEXT;
qinval_entry->q.cc_inv_dsc.lo.granu = granu;
qinval_entry->q.cc_inv_dsc.lo.res_1 = 0;
@@ -78,9 +80,10 @@ static int gen_cc_inv_dsc(struct iommu *iommu, int index,
qinval_entry->q.cc_inv_dsc.lo.fm = function_mask;
qinval_entry->q.cc_inv_dsc.lo.res_2 = 0;
qinval_entry->q.cc_inv_dsc.hi.res = 0;
+
+ unmap_vtd_domain_page(qinval_entries);
spin_unlock_irqrestore(&qi_ctrl->qinval_lock, flags);
- ptr64 = (u64 *)qinval_entry;
return 0;
}
@@ -93,7 +96,7 @@ int queue_invalidate_context(struct iommu *iommu,
spin_lock_irqsave(&iommu->register_lock, flags);
index = qinval_next_index(iommu);
- if (index == -1)
+ if ( index == -1 )
return -EBUSY;
ret = gen_cc_inv_dsc(iommu, index, did, source_id,
function_mask, granu);
@@ -106,14 +109,16 @@ static int gen_iotlb_inv_dsc(struct iommu *iommu, int index,
u8 granu, u8 dr, u8 dw, u16 did, u8 am, u8 ih, u64 addr)
{
unsigned long flags;
- struct qinval_entry * qinval_entry = NULL;
+ struct qinval_entry *qinval_entry = NULL, *qinval_entries;
struct qi_ctrl *qi_ctrl = iommu_qi_ctrl(iommu);
if ( index == -1 )
return -1;
spin_lock_irqsave(&qi_ctrl->qinval_lock, flags);
- qinval_entry = &qi_ctrl->qinval[index];
+ qinval_entries =
+ (struct qinval_entry *)map_vtd_domain_page(qi_ctrl->qinval_maddr);
+ qinval_entry = &qinval_entries[index];
qinval_entry->q.iotlb_inv_dsc.lo.type = TYPE_INVAL_IOTLB;
qinval_entry->q.iotlb_inv_dsc.lo.granu = granu;
qinval_entry->q.iotlb_inv_dsc.lo.dr = 0;
@@ -127,6 +132,7 @@ static int gen_iotlb_inv_dsc(struct iommu *iommu, int index,
qinval_entry->q.iotlb_inv_dsc.hi.res_1 = 0;
qinval_entry->q.iotlb_inv_dsc.hi.addr = addr;
+ unmap_vtd_domain_page(qinval_entries);
spin_unlock_irqrestore(&qi_ctrl->qinval_lock, flags);
return 0;
}
@@ -151,15 +157,16 @@ int queue_invalidate_iotlb(struct iommu *iommu,
static int gen_wait_dsc(struct iommu *iommu, int index,
u8 iflag, u8 sw, u8 fn, u32 sdata, volatile u32 *saddr)
{
- u64 *ptr64;
unsigned long flags;
- struct qinval_entry * qinval_entry = NULL;
+ struct qinval_entry *qinval_entry = NULL, *qinval_entries;
struct qi_ctrl *qi_ctrl = iommu_qi_ctrl(iommu);
if ( index == -1 )
return -1;
spin_lock_irqsave(&qi_ctrl->qinval_lock, flags);
- qinval_entry = &qi_ctrl->qinval[index];
+ qinval_entries =
+ (struct qinval_entry *)map_vtd_domain_page(qi_ctrl->qinval_maddr);
+ qinval_entry = &qinval_entries[index];
qinval_entry->q.inv_wait_dsc.lo.type = TYPE_INVAL_WAIT;
qinval_entry->q.inv_wait_dsc.lo.iflag = iflag;
qinval_entry->q.inv_wait_dsc.lo.sw = sw;
@@ -168,8 +175,8 @@ static int gen_wait_dsc(struct iommu *iommu, int index,
qinval_entry->q.inv_wait_dsc.lo.sdata = sdata;
qinval_entry->q.inv_wait_dsc.hi.res_1 = 0;
qinval_entry->q.inv_wait_dsc.hi.saddr = virt_to_maddr(saddr) >> 2;
+ unmap_vtd_domain_page(qinval_entries);
spin_unlock_irqrestore(&qi_ctrl->qinval_lock, flags);
- ptr64 = (u64 *)qinval_entry;
return 0;
}
@@ -177,7 +184,7 @@ static int queue_invalidate_wait(struct iommu *iommu,
u8 iflag, u8 sw, u8 fn, u32 sdata, volatile u32 *saddr)
{
unsigned long flags;
- unsigned long start_time;
+ s_time_t start_time;
int index = -1;
int ret = -1;
struct qi_ctrl *qi_ctrl = iommu_qi_ctrl(iommu);
@@ -185,7 +192,7 @@ static int queue_invalidate_wait(struct iommu *iommu,
spin_lock_irqsave(&qi_ctrl->qinval_poll_lock, flags);
spin_lock_irqsave(&iommu->register_lock, flags);
index = qinval_next_index(iommu);
- if (*saddr == 1)
+ if ( *saddr == 1 )
*saddr = 0;
ret = gen_wait_dsc(iommu, index, iflag, sw, fn, sdata, saddr);
ret |= qinval_update_qtail(iommu, index);
@@ -195,9 +202,11 @@ static int queue_invalidate_wait(struct iommu *iommu,
if ( sw )
{
/* In case all wait descriptor writes to same addr with same data */
- start_time = jiffies;
- while ( *saddr != 1 ) {
- if (time_after(jiffies, start_time + DMAR_OPERATION_TIMEOUT)) {
+ start_time = NOW();
+ while ( *saddr != 1 )
+ {
+ if ( NOW() > (start_time + DMAR_OPERATION_TIMEOUT) )
+ {
print_qi_regs(iommu);
panic("queue invalidate wait descriptor was not executed\n");
}
@@ -213,7 +222,7 @@ int invalidate_sync(struct iommu *iommu)
int ret = -1;
struct qi_ctrl *qi_ctrl = iommu_qi_ctrl(iommu);
- if (qi_ctrl->qinval)
+ if ( qi_ctrl->qinval_maddr == 0 )
{
ret = queue_invalidate_wait(iommu,
0, 1, 1, 1, &qi_ctrl->qinval_poll_status);
@@ -226,14 +235,16 @@ static int gen_dev_iotlb_inv_dsc(struct iommu *iommu, int index,
u32 max_invs_pend, u16 sid, u16 size, u64 addr)
{
unsigned long flags;
- struct qinval_entry * qinval_entry = NULL;
+ struct qinval_entry *qinval_entry = NULL, *qinval_entries;
struct qi_ctrl *qi_ctrl = iommu_qi_ctrl(iommu);
if ( index == -1 )
return -1;
spin_lock_irqsave(&qi_ctrl->qinval_lock, flags);
- qinval_entry = &qi_ctrl->qinval[index];
+ qinval_entries =
+ (struct qinval_entry *)map_vtd_domain_page(qi_ctrl->qinval_maddr);
+ qinval_entry = &qinval_entries[index];
qinval_entry->q.dev_iotlb_inv_dsc.lo.type = TYPE_INVAL_DEVICE_IOTLB;
qinval_entry->q.dev_iotlb_inv_dsc.lo.res_1 = 0;
qinval_entry->q.dev_iotlb_inv_dsc.lo.max_invs_pend = max_invs_pend;
@@ -244,6 +255,7 @@ static int gen_dev_iotlb_inv_dsc(struct iommu *iommu, int index,
qinval_entry->q.dev_iotlb_inv_dsc.hi.size = size;
qinval_entry->q.dev_iotlb_inv_dsc.hi.addr = addr;
+ unmap_vtd_domain_page(qinval_entries);
spin_unlock_irqrestore(&qi_ctrl->qinval_lock, flags);
return 0;
}
@@ -268,14 +280,16 @@ static int gen_iec_inv_dsc(struct iommu *iommu, int index,
u8 granu, u8 im, u16 iidx)
{
unsigned long flags;
- struct qinval_entry * qinval_entry = NULL;
+ struct qinval_entry *qinval_entry = NULL, *qinval_entries;
struct qi_ctrl *qi_ctrl = iommu_qi_ctrl(iommu);
if ( index == -1 )
return -1;
spin_lock_irqsave(&qi_ctrl->qinval_lock, flags);
- qinval_entry = &qi_ctrl->qinval[index];
+ qinval_entries =
+ (struct qinval_entry *)map_vtd_domain_page(qi_ctrl->qinval_maddr);
+ qinval_entry = &qinval_entries[index];
qinval_entry->q.iec_inv_dsc.lo.type = TYPE_INVAL_IEC;
qinval_entry->q.iec_inv_dsc.lo.granu = granu;
qinval_entry->q.iec_inv_dsc.lo.res_1 = 0;
@@ -284,6 +298,7 @@ static int gen_iec_inv_dsc(struct iommu *iommu, int index,
qinval_entry->q.iec_inv_dsc.lo.res_2 = 0;
qinval_entry->q.iec_inv_dsc.hi.res = 0;
+ unmap_vtd_domain_page(qinval_entries);
spin_unlock_irqrestore(&qi_ctrl->qinval_lock, flags);
return 0;
}
@@ -349,7 +364,7 @@ static int flush_context_qi(
did = 0;
}
- if (qi_ctrl->qinval)
+ if ( qi_ctrl->qinval_maddr != 0 )
{
ret = queue_invalidate_context(iommu, did, sid, fm,
type >> DMA_CCMD_INVL_GRANU_OFFSET);
@@ -382,7 +397,8 @@ static int flush_iotlb_qi(
did = 0;
}
- if (qi_ctrl->qinval) {
+ if ( qi_ctrl->qinval_maddr != 0 )
+ {
/* use queued invalidation */
if (cap_write_drain(iommu->cap))
dw = 1;
@@ -399,8 +415,7 @@ static int flush_iotlb_qi(
int qinval_setup(struct iommu *iommu)
{
- unsigned long start_time;
- u64 paddr;
+ s_time_t start_time;
u32 status = 0;
struct qi_ctrl *qi_ctrl;
struct iommu_flush *flush;
@@ -411,15 +426,14 @@ int qinval_setup(struct iommu *iommu)
if ( !ecap_queued_inval(iommu->ecap) )
return -ENODEV;
- if (qi_ctrl->qinval == NULL) {
- qi_ctrl->qinval = alloc_xenheap_page();
- if (qi_ctrl->qinval == NULL)
- panic("Cannot allocate memory for qi_ctrl->qinval\n");
- memset((u8*)qi_ctrl->qinval, 0, PAGE_SIZE_4K);
+ if ( qi_ctrl->qinval_maddr == 0 )
+ {
+ qi_ctrl->qinval_maddr = alloc_pgtable_maddr();
+ if ( qi_ctrl->qinval_maddr == 0 )
+ panic("Cannot allocate memory for qi_ctrl->qinval_maddr\n");
flush->context = flush_context_qi;
flush->iotlb = flush_iotlb_qi;
}
- paddr = virt_to_maddr(qi_ctrl->qinval);
/* Setup Invalidation Queue Address(IQA) register with the
* address of the page we just allocated. QS field at
@@ -428,19 +442,20 @@ int qinval_setup(struct iommu *iommu)
* registers are automatically reset to 0 with write
* to IQA register.
*/
- dmar_writeq(iommu->reg, DMAR_IQA_REG, paddr);
+ dmar_writeq(iommu->reg, DMAR_IQA_REG, qi_ctrl->qinval_maddr);
/* enable queued invalidation hardware */
iommu->gcmd |= DMA_GCMD_QIE;
dmar_writel(iommu->reg, DMAR_GCMD_REG, iommu->gcmd);
/* Make sure hardware complete it */
- start_time = jiffies;
- while (1) {
+ start_time = NOW();
+ for ( ; ; )
+ {
status = dmar_readl(iommu->reg, DMAR_GSTS_REG);
- if (status & DMA_GSTS_QIES)
+ if ( status & DMA_GSTS_QIES )
break;
- if (time_after(jiffies, start_time + DMAR_OPERATION_TIMEOUT))
+ if ( NOW() > (start_time + DMAR_OPERATION_TIMEOUT) )
panic("Cannot set QIE field for queue invalidation\n");
cpu_relax();
}
diff --git a/xen/drivers/passthrough/vtd/utils.c b/xen/drivers/passthrough/vtd/utils.c
index 59de4a02e8..3c33a2c300 100644
--- a/xen/drivers/passthrough/vtd/utils.c
+++ b/xen/drivers/passthrough/vtd/utils.c
@@ -20,11 +20,13 @@
#include <xen/sched.h>
#include <xen/delay.h>
#include <xen/iommu.h>
+#include <xen/time.h>
+#include <xen/pci.h>
#include "iommu.h"
#include "dmar.h"
-#include "../pci-direct.h"
#include "../pci_regs.h"
#include "msi.h"
+#include "vtd.h"
#define INTEL 0x8086
#define SEABURG 0x4000
@@ -35,7 +37,7 @@ int is_usb_device(struct pci_dev *pdev)
u8 bus = pdev->bus;
u8 dev = PCI_SLOT(pdev->devfn);
u8 func = PCI_FUNC(pdev->devfn);
- u16 class = read_pci_config_16(bus, dev, func, PCI_CLASS_DEVICE);
+ u16 class = pci_conf_read16(bus, dev, func, PCI_CLASS_DEVICE);
return (class == 0xc03);
}
@@ -44,9 +46,9 @@ int vtd_hw_check(void)
u16 vendor, device;
u8 revision, stepping;
- vendor = read_pci_config_16(0, 0, 0, PCI_VENDOR_ID);
- device = read_pci_config_16(0, 0, 0, PCI_DEVICE_ID);
- revision = read_pci_config_byte(0, 0, 0, PCI_REVISION_ID);
+ vendor = pci_conf_read16(0, 0, 0, PCI_VENDOR_ID);
+ device = pci_conf_read16(0, 0, 0, PCI_DEVICE_ID);
+ revision = pci_conf_read8(0, 0, 0, PCI_REVISION_ID);
stepping = revision & 0xf;
if ( (vendor == INTEL) && (device == SEABURG) )
@@ -68,7 +70,7 @@ int vtd_hw_check(void)
/* Disable vt-d protected memory registers. */
void disable_pmr(struct iommu *iommu)
{
- unsigned long start_time;
+ s_time_t start_time;
unsigned int val;
val = dmar_readl(iommu->reg, DMAR_PMEN_REG);
@@ -76,7 +78,7 @@ void disable_pmr(struct iommu *iommu)
return;
dmar_writel(iommu->reg, DMAR_PMEN_REG, val & ~DMA_PMEN_EPM);
- start_time = jiffies;
+ start_time = NOW();
for ( ; ; )
{
@@ -84,7 +86,7 @@ void disable_pmr(struct iommu *iommu)
if ( (val & DMA_PMEN_PRS) == 0 )
break;
- if ( time_after(jiffies, start_time + DMAR_OPERATION_TIMEOUT) )
+ if ( NOW() > start_time + DMAR_OPERATION_TIMEOUT )
panic("Disable PMRs timeout\n");
cpu_relax();
@@ -101,18 +103,18 @@ static u8 find_cap_offset(u8 bus, u8 dev, u8 func, u8 cap)
u8 pos = PCI_CAPABILITY_LIST;
u16 status;
- status = read_pci_config_16(bus, dev, func, PCI_STATUS);
+ status = pci_conf_read16(bus, dev, func, PCI_STATUS);
if ( (status & PCI_STATUS_CAP_LIST) == 0 )
return 0;
while ( max_cap-- )
{
- pos = read_pci_config_byte(bus, dev, func, pos);
+ pos = pci_conf_read8(bus, dev, func, pos);
if ( pos < 0x40 )
break;
pos &= ~3;
- id = read_pci_config_byte(bus, dev, func, pos + PCI_CAP_LIST_ID);
+ id = pci_conf_read8(bus, dev, func, pos + PCI_CAP_LIST_ID);
if ( id == 0xff )
break;
@@ -141,13 +143,13 @@ void pdev_flr(u8 bus, u8 devfn)
pos = find_cap_offset(bus, dev, func, PCI_CAP_ID_EXP);
if ( pos != 0 )
{
- dev_cap = read_pci_config(bus, dev, func, pos + PCI_EXP_DEVCAP);
+ dev_cap = pci_conf_read32(bus, dev, func, pos + PCI_EXP_DEVCAP);
if ( dev_cap & PCI_EXP_DEVCAP_FLR )
{
- write_pci_config(bus, dev, func,
+ pci_conf_write32(bus, dev, func,
pos + PCI_EXP_DEVCTL, PCI_EXP_DEVCTL_FLR);
do {
- dev_status = read_pci_config(bus, dev, func,
+ dev_status = pci_conf_read32(bus, dev, func,
pos + PCI_EXP_DEVSTA);
} while ( dev_status & PCI_EXP_DEVSTA_TRPND );
@@ -167,23 +169,23 @@ void pdev_flr(u8 bus, u8 devfn)
int i;
u32 config[PCI_CONFIG_DWORD_SIZE];
for ( i = 0; i < PCI_CONFIG_DWORD_SIZE; i++ )
- config[i] = read_pci_config(bus, dev, func, i*4);
+ config[i] = pci_conf_read32(bus, dev, func, i*4);
/* Enter D3hot without soft reset */
- pm_ctl = read_pci_config(bus, dev, func, pos + PCI_PM_CTRL);
+ pm_ctl = pci_conf_read32(bus, dev, func, pos + PCI_PM_CTRL);
pm_ctl |= PCI_PM_CTRL_NO_SOFT_RESET;
pm_ctl &= ~PCI_PM_CTRL_STATE_MASK;
pm_ctl |= PCI_D3hot;
- write_pci_config(bus, dev, func, pos + PCI_PM_CTRL, pm_ctl);
+ pci_conf_write32(bus, dev, func, pos + PCI_PM_CTRL, pm_ctl);
mdelay(10);
/* From D3hot to D0 */
- write_pci_config(bus, dev, func, pos + PCI_PM_CTRL, 0);
+ pci_conf_write32(bus, dev, func, pos + PCI_PM_CTRL, 0);
mdelay(10);
/* Write saved configurations to device */
for ( i = 0; i < PCI_CONFIG_DWORD_SIZE; i++ )
- write_pci_config(bus, dev, func, i*4, config[i]);
+ pci_conf_write32(bus, dev, func, i*4, config[i]);
flr = 1;
}
@@ -243,7 +245,7 @@ u32 get_level_index(unsigned long gmfn, int level)
}
void print_vtd_entries(
- struct domain *d,
+ struct domain *d,
struct iommu *iommu,
int bus, int devfn,
unsigned long gmfn)
@@ -261,37 +263,40 @@ void print_vtd_entries(
printk("print_vtd_entries: domain_id = %x bdf = %x:%x:%x gmfn = %lx\n",
d->domain_id, bus, PCI_SLOT(devfn), PCI_FUNC(devfn), gmfn);
- if ( hd->pgd == NULL )
+ if ( hd->pgd_maddr == 0 )
{
- printk(" hg->pgd == NULL\n");
+ printk(" hd->pgd_maddr == 0\n");
return;
}
- printk(" d->pgd = %p virt_to_maddr(hd->pgd) = %lx\n",
- hd->pgd, virt_to_maddr(hd->pgd));
+ printk(" hd->pgd_maddr = %"PRIx64"\n", hd->pgd_maddr);
for_each_drhd_unit ( drhd )
{
printk("---- print_vtd_entries %d ----\n", i++);
- root_entry = iommu->root_entry;
- if ( root_entry == NULL )
+ if ( iommu->root_maddr == 0 )
{
- printk(" root_entry == NULL\n");
+ printk(" iommu->root_maddr = 0\n");
continue;
}
+ root_entry =
+ (struct root_entry *)map_vtd_domain_page(iommu->root_maddr);
+
printk(" root_entry = %p\n", root_entry);
printk(" root_entry[%x] = %"PRIx64"\n", bus, root_entry[bus].val);
if ( !root_present(root_entry[bus]) )
{
+ unmap_vtd_domain_page(root_entry);
printk(" root_entry[%x] not present\n", bus);
continue;
}
ctxt_entry =
- maddr_to_virt((root_entry[bus].val >> PAGE_SHIFT) << PAGE_SHIFT);
+ (struct context_entry *)map_vtd_domain_page(root_entry[bus].val);
if ( ctxt_entry == NULL )
{
+ unmap_vtd_domain_page(root_entry);
printk(" ctxt_entry == NULL\n");
continue;
}
@@ -301,6 +306,8 @@ void print_vtd_entries(
devfn, ctxt_entry[devfn].hi, ctxt_entry[devfn].lo);
if ( !context_present(ctxt_entry[devfn]) )
{
+ unmap_vtd_domain_page(ctxt_entry);
+ unmap_vtd_domain_page(root_entry);
printk(" ctxt_entry[%x] not present\n", devfn);
continue;
}
@@ -308,6 +315,8 @@ void print_vtd_entries(
if ( level != VTD_PAGE_TABLE_LEVEL_3 &&
level != VTD_PAGE_TABLE_LEVEL_4)
{
+ unmap_vtd_domain_page(ctxt_entry);
+ unmap_vtd_domain_page(root_entry);
printk("Unsupported VTD page table level (%d)!\n", level);
continue;
}
@@ -319,6 +328,8 @@ void print_vtd_entries(
printk(" l%d = %p\n", level, l);
if ( l == NULL )
{
+ unmap_vtd_domain_page(ctxt_entry);
+ unmap_vtd_domain_page(root_entry);
printk(" l%d == NULL\n", level);
break;
}
@@ -329,6 +340,8 @@ void print_vtd_entries(
pte.val = l[l_index];
if ( !dma_pte_present(pte) )
{
+ unmap_vtd_domain_page(ctxt_entry);
+ unmap_vtd_domain_page(root_entry);
printk(" l%d[%x] not present\n", level, l_index);
break;
}
diff --git a/xen/drivers/passthrough/vtd/vtd.h b/xen/drivers/passthrough/vtd/vtd.h
index 38805c38ea..8e3fbb3bef 100644
--- a/xen/drivers/passthrough/vtd/vtd.h
+++ b/xen/drivers/passthrough/vtd/vtd.h
@@ -42,4 +42,13 @@ struct IO_APIC_route_remap_entry {
};
};
+unsigned int get_clflush_size(void);
+u64 alloc_pgtable_maddr(void);
+void free_pgtable_maddr(u64 maddr);
+void *map_vtd_domain_page(u64 maddr);
+void unmap_vtd_domain_page(void *va);
+
+void iommu_flush_cache_entry(struct iommu *iommu, void *addr);
+void iommu_flush_cache_page(struct iommu *iommu, void *addr);
+
#endif // _VTD_H_
diff --git a/xen/drivers/passthrough/vtd/x86/Makefile b/xen/drivers/passthrough/vtd/x86/Makefile
new file mode 100644
index 0000000000..85243e3aa7
--- /dev/null
+++ b/xen/drivers/passthrough/vtd/x86/Makefile
@@ -0,0 +1 @@
+obj-y += vtd.o
diff --git a/xen/drivers/passthrough/vtd/x86/vtd.c b/xen/drivers/passthrough/vtd/x86/vtd.c
new file mode 100644
index 0000000000..22f2e23f8f
--- /dev/null
+++ b/xen/drivers/passthrough/vtd/x86/vtd.c
@@ -0,0 +1,303 @@
+/*
+ * Copyright (c) 2008, Intel Corporation.
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along with
+ * this program; if not, write to the Free Software Foundation, Inc., 59 Temple
+ * Place - Suite 330, Boston, MA 02111-1307 USA.
+ *
+ * Copyright (C) Allen Kay <allen.m.kay@intel.com>
+ * Copyright (C) Weidong Han <weidong.han@intel.com>
+ */
+
+#include <xen/sched.h>
+#include <xen/domain_page.h>
+#include <asm/paging.h>
+#include <xen/iommu.h>
+#include "../iommu.h"
+#include "../dmar.h"
+#include "../vtd.h"
+
+void *map_vtd_domain_page(u64 maddr)
+{
+ return map_domain_page(maddr >> PAGE_SHIFT_4K);
+}
+
+void unmap_vtd_domain_page(void *va)
+{
+ unmap_domain_page(va);
+}
+
+/* Allocate page table, return its machine address */
+u64 alloc_pgtable_maddr(void)
+{
+ struct page_info *pg;
+ u64 *vaddr;
+ struct acpi_drhd_unit *drhd;
+ struct iommu *iommu;
+
+ pg = alloc_domheap_page(NULL, 0);
+ vaddr = map_domain_page(page_to_mfn(pg));
+ if ( !vaddr )
+ return 0;
+ memset(vaddr, 0, PAGE_SIZE);
+
+ drhd = list_entry(acpi_drhd_units.next, typeof(*drhd), list);
+ iommu = drhd->iommu;
+ iommu_flush_cache_page(iommu, vaddr);
+ unmap_domain_page(vaddr);
+
+ return page_to_maddr(pg);
+}
+
+void free_pgtable_maddr(u64 maddr)
+{
+ if ( maddr != 0 )
+ free_domheap_page(maddr_to_page(maddr));
+}
+
+unsigned int get_clflush_size(void)
+{
+ return ((cpuid_ebx(1) >> 8) & 0xff) * 8;
+}
+
+struct hvm_irq_dpci *domain_get_irq_dpci(struct domain *domain)
+{
+ if ( !domain )
+ return NULL;
+
+ return domain->arch.hvm_domain.irq.dpci;
+}
+
+int domain_set_irq_dpci(struct domain *domain, struct hvm_irq_dpci *dpci)
+{
+ if ( !domain || !dpci )
+ return 0;
+
+ domain->arch.hvm_domain.irq.dpci = dpci;
+ return 1;
+}
+
+void hvm_dpci_isairq_eoi(struct domain *d, unsigned int isairq)
+{
+ struct hvm_irq *hvm_irq = &d->arch.hvm_domain.irq;
+ struct hvm_irq_dpci *dpci = domain_get_irq_dpci(d);
+ struct dev_intx_gsi_link *digl, *tmp;
+ int i;
+
+ ASSERT(isairq < NR_ISAIRQS);
+ if ( !vtd_enabled || !dpci ||
+ !test_bit(isairq, dpci->isairq_map) )
+ return;
+
+ /* Multiple mirq may be mapped to one isa irq */
+ for ( i = 0; i < NR_IRQS; i++ )
+ {
+ if ( !dpci->mirq[i].valid )
+ continue;
+
+ list_for_each_entry_safe ( digl, tmp,
+ &dpci->mirq[i].digl_list, list )
+ {
+ if ( hvm_irq->pci_link.route[digl->link] == isairq )
+ {
+ hvm_pci_intx_deassert(d, digl->device, digl->intx);
+ spin_lock(&dpci->dirq_lock);
+ if ( --dpci->mirq[i].pending == 0 )
+ {
+ spin_unlock(&dpci->dirq_lock);
+ gdprintk(XENLOG_INFO VTDPREFIX,
+ "hvm_dpci_isairq_eoi:: mirq = %x\n", i);
+ stop_timer(&dpci->hvm_timer[irq_to_vector(i)]);
+ pirq_guest_eoi(d, i);
+ }
+ else
+ spin_unlock(&dpci->dirq_lock);
+ }
+ }
+ }
+}
+
+void iommu_set_pgd(struct domain *d)
+{
+ struct hvm_iommu *hd = domain_hvm_iommu(d);
+ unsigned long p2m_table;
+ int level = agaw_to_level(hd->agaw);
+ l3_pgentry_t *l3e;
+
+ p2m_table = mfn_x(pagetable_get_mfn(d->arch.phys_table));
+
+ if ( paging_mode_hap(d) )
+ {
+ int level = agaw_to_level(hd->agaw);
+ struct dma_pte *dpte = NULL;
+ mfn_t pgd_mfn;
+
+ switch ( level )
+ {
+ case VTD_PAGE_TABLE_LEVEL_3:
+ dpte = map_domain_page(p2m_table);
+ if ( !dma_pte_present(*dpte) )
+ {
+ gdprintk(XENLOG_ERR VTDPREFIX,
+ "iommu_set_pgd: second level wasn't there\n");
+ unmap_domain_page(dpte);
+ return;
+ }
+ pgd_mfn = _mfn(dma_pte_addr(*dpte) >> PAGE_SHIFT_4K);
+ hd->pgd_maddr = mfn_x(pgd_mfn) << PAGE_SHIFT_4K;
+ unmap_domain_page(dpte);
+ break;
+ case VTD_PAGE_TABLE_LEVEL_4:
+ pgd_mfn = _mfn(p2m_table);
+ hd->pgd_maddr = mfn_x(pgd_mfn) << PAGE_SHIFT_4K;
+ break;
+ default:
+ gdprintk(XENLOG_ERR VTDPREFIX,
+ "iommu_set_pgd:Unsupported p2m table sharing level!\n");
+ break;
+ }
+ }
+ else
+ {
+#if CONFIG_PAGING_LEVELS == 3
+ struct dma_pte *pte = NULL, *pgd_vaddr = NULL, *pmd_vaddr = NULL;
+ int i;
+ u64 pmd_maddr;
+ unsigned long flags;
+
+ spin_lock_irqsave(&hd->mapping_lock, flags);
+ hd->pgd_maddr = alloc_pgtable_maddr();
+ if ( hd->pgd_maddr == 0 )
+ {
+ spin_unlock_irqrestore(&hd->mapping_lock, flags);
+ gdprintk(XENLOG_ERR VTDPREFIX,
+ "Allocate pgd memory failed!\n");
+ return;
+ }
+
+ pgd_vaddr = map_vtd_domain_page(hd->pgd_maddr);
+ l3e = map_domain_page(p2m_table);
+ switch ( level )
+ {
+ case VTD_PAGE_TABLE_LEVEL_3: /* Weybridge */
+ /* We only support 8 entries for the PAE L3 p2m table */
+ for ( i = 0; i < 8 ; i++ )
+ {
+ /* Don't create new L2 entry, use ones from p2m table */
+ pgd_vaddr[i].val = l3e[i].l3 | _PAGE_PRESENT | _PAGE_RW;
+ }
+ break;
+
+ case VTD_PAGE_TABLE_LEVEL_4: /* Stoakley */
+ /* We allocate one more page for the top vtd page table. */
+ pmd_maddr = alloc_pgtable_maddr();
+ if ( pmd_maddr == 0 )
+ {
+ unmap_vtd_domain_page(pgd_vaddr);
+ unmap_domain_page(l3e);
+ spin_unlock_irqrestore(&hd->mapping_lock, flags);
+ gdprintk(XENLOG_ERR VTDPREFIX,
+ "Allocate pmd memory failed!\n");
+ return;
+ }
+
+ pte = &pgd_vaddr[0];
+ dma_set_pte_addr(*pte, pmd_maddr);
+ dma_set_pte_readable(*pte);
+ dma_set_pte_writable(*pte);
+
+ pmd_vaddr = map_vtd_domain_page(pmd_maddr);
+ for ( i = 0; i < 8; i++ )
+ {
+ /* Don't create new L2 entry, use ones from p2m table */
+ pmd_vaddr[i].val = l3e[i].l3 | _PAGE_PRESENT | _PAGE_RW;
+ }
+
+ unmap_vtd_domain_page(pmd_vaddr);
+ break;
+ default:
+ gdprintk(XENLOG_ERR VTDPREFIX,
+ "iommu_set_pgd:Unsupported p2m table sharing level!\n");
+ break;
+ }
+
+ unmap_vtd_domain_page(pgd_vaddr);
+ unmap_domain_page(l3e);
+ spin_unlock_irqrestore(&hd->mapping_lock, flags);
+
+#elif CONFIG_PAGING_LEVELS == 4
+ mfn_t pgd_mfn;
+
+ switch ( level )
+ {
+ case VTD_PAGE_TABLE_LEVEL_3:
+ l3e = map_domain_page(p2m_table);
+ if ( (l3e_get_flags(*l3e) & _PAGE_PRESENT) == 0 )
+ {
+ gdprintk(XENLOG_ERR VTDPREFIX,
+ "iommu_set_pgd: second level wasn't there\n");
+ unmap_domain_page(l3e);
+ return;
+ }
+
+ pgd_mfn = _mfn(l3e_get_pfn(*l3e));
+ hd->pgd_maddr = mfn_x(pgd_mfn) << PAGE_SHIFT_4K;
+ unmap_domain_page(l3e);
+ break;
+ case VTD_PAGE_TABLE_LEVEL_4:
+ pgd_mfn = _mfn(p2m_table);
+ hd->pgd_maddr = mfn_x(pgd_mfn) << PAGE_SHIFT_4K;
+ break;
+ default:
+ gdprintk(XENLOG_ERR VTDPREFIX,
+ "iommu_set_pgd:Unsupported p2m table sharing level!\n");
+ break;
+ }
+#endif
+ }
+}
+
+void iommu_free_pgd(struct domain *d)
+{
+#if CONFIG_PAGING_LEVELS == 3
+ struct hvm_iommu *hd = domain_hvm_iommu(d);
+ int level = agaw_to_level(hd->agaw);
+ struct dma_pte *pgd_vaddr = NULL;
+
+ switch ( level )
+ {
+ case VTD_PAGE_TABLE_LEVEL_3:
+ if ( hd->pgd_maddr != 0 )
+ {
+ free_pgtable_maddr(hd->pgd_maddr);
+ hd->pgd_maddr = 0;
+ }
+ break;
+ case VTD_PAGE_TABLE_LEVEL_4:
+ if ( hd->pgd_maddr != 0 )
+ {
+ pgd_vaddr = (struct dma_pte*)map_vtd_domain_page(hd->pgd_maddr);
+ if ( pgd_vaddr[0].val != 0 )
+ free_pgtable_maddr(pgd_vaddr[0].val);
+ unmap_vtd_domain_page(pgd_vaddr);
+ free_pgtable_maddr(hd->pgd_maddr);
+ hd->pgd_maddr = 0;
+ }
+ break;
+ default:
+ gdprintk(XENLOG_ERR VTDPREFIX,
+ "Unsupported p2m table sharing level!\n");
+ break;
+ }
+#endif
+}
+
diff --git a/xen/include/asm-ia64/domain.h b/xen/include/asm-ia64/domain.h
index 7bbd56f7c6..db05a1119d 100644
--- a/xen/include/asm-ia64/domain.h
+++ b/xen/include/asm-ia64/domain.h
@@ -18,6 +18,8 @@ struct p2m_entry;
struct tlb_track;
#endif
+extern unsigned long volatile jiffies;
+
struct vcpu;
extern void relinquish_vcpu_resources(struct vcpu *v);
extern int vcpu_late_initialise(struct vcpu *v);
diff --git a/xen/include/asm-ia64/linux-xen/asm/sn/README.origin b/xen/include/asm-ia64/linux-xen/asm/sn/README.origin
index 762d1f5a9c..ba80c66319 100644
--- a/xen/include/asm-ia64/linux-xen/asm/sn/README.origin
+++ b/xen/include/asm-ia64/linux-xen/asm/sn/README.origin
@@ -12,5 +12,6 @@ intr.h -> linux/include/asm-ia64/sn/intr.h
io.h -> linux/include/asm-ia64/sn/io.h
nodepda.h -> linux/include/asm-ia64/sn/nodepda.h
pcibr_provider.h -> linux/include/asm-ia64/sn/pcibr_provider.h
+pcidev.h -> linux/include/asm-ia64/sn/pcidev.h
rw_mmr.h -> linux/include/asm-ia64/sn/rw_mmr.h
types.h -> linux/include/asm-ia64/sn/types.h
diff --git a/xen/include/asm-ia64/linux-xen/asm/sn/pcibr_provider.h b/xen/include/asm-ia64/linux-xen/asm/sn/pcibr_provider.h
index 8f88ecd3a7..dc953eb2f4 100644
--- a/xen/include/asm-ia64/linux-xen/asm/sn/pcibr_provider.h
+++ b/xen/include/asm-ia64/linux-xen/asm/sn/pcibr_provider.h
@@ -10,7 +10,7 @@
#ifdef XEN
#include <linux/spinlock.h>
-#include <linux/pci.h>
+#include <linux/linux-pci.h>
#endif
#include <asm/sn/intr.h>
#include <asm/sn/pcibus_provider_defs.h>
diff --git a/xen/include/asm-ia64/linux/asm/sn/pcidev.h b/xen/include/asm-ia64/linux-xen/asm/sn/pcidev.h
index eac3561574..17ae495e6a 100644
--- a/xen/include/asm-ia64/linux/asm/sn/pcidev.h
+++ b/xen/include/asm-ia64/linux-xen/asm/sn/pcidev.h
@@ -8,7 +8,11 @@
#ifndef _ASM_IA64_SN_PCI_PCIDEV_H
#define _ASM_IA64_SN_PCI_PCIDEV_H
+#ifdef XEN
+#include <linux/linux-pci.h>
+#else
#include <linux/pci.h>
+#endif
/*
* In ia64, pci_dev->sysdata must be a *pci_controller. To provide access to
diff --git a/xen/include/asm-ia64/linux-xen/linux/interrupt.h b/xen/include/asm-ia64/linux-xen/linux/interrupt.h
index d6bbeb7772..6f1aece436 100644
--- a/xen/include/asm-ia64/linux-xen/linux/interrupt.h
+++ b/xen/include/asm-ia64/linux-xen/linux/interrupt.h
@@ -144,6 +144,7 @@ extern void FASTCALL(raise_softirq(unsigned int nr));
#endif
+#ifndef XEN
/* Tasklets --- multithreaded analogue of BHs.
Main feature differing them of generic softirqs: tasklet
@@ -254,6 +255,7 @@ extern void tasklet_kill(struct tasklet_struct *t);
extern void tasklet_kill_immediate(struct tasklet_struct *t, unsigned int cpu);
extern void tasklet_init(struct tasklet_struct *t,
void (*func)(unsigned long), unsigned long data);
+#endif
/*
* Autoprobing for irqs:
diff --git a/xen/include/asm-ia64/linux-xen/linux/pci.h b/xen/include/asm-ia64/linux-xen/linux/linux-pci.h
index 118201a9a7..118201a9a7 100644
--- a/xen/include/asm-ia64/linux-xen/linux/pci.h
+++ b/xen/include/asm-ia64/linux-xen/linux/linux-pci.h
diff --git a/xen/include/asm-ia64/linux/asm/sn/README.origin b/xen/include/asm-ia64/linux/asm/sn/README.origin
index 7a4f1c645d..495171ee81 100644
--- a/xen/include/asm-ia64/linux/asm/sn/README.origin
+++ b/xen/include/asm-ia64/linux/asm/sn/README.origin
@@ -10,7 +10,6 @@ l1.h -> linux/include/asm-ia64/sn/l1.h
leds.h -> linux/include/asm-ia64/sn/leds.h
module.h -> linux/include/asm-ia64/sn/module.h
pcibus_provider_defs.h -> linux/include/asm-ia64/sn/pcibus_provider_defs.h
-pcidev.h -> linux/include/asm-ia64/sn/pcidev.h
pda.h -> linux/include/asm-ia64/sn/pda.h
pic.h -> linux/include/asm-ia64/sn/pic.h
shub_mmr.h -> linux/include/asm-ia64/sn/shub_mmr.h
diff --git a/xen/include/asm-x86/domain.h b/xen/include/asm-x86/domain.h
index 42b8da7b36..99281c68a3 100644
--- a/xen/include/asm-x86/domain.h
+++ b/xen/include/asm-x86/domain.h
@@ -138,27 +138,6 @@ struct hap_domain {
};
/************************************************/
-/* p2m handling */
-/************************************************/
-struct p2m_domain {
- /* Lock that protects updates to the p2m */
- spinlock_t lock;
- int locker; /* processor which holds the lock */
- const char *locker_function; /* Func that took it */
-
- /* Pages used to construct the p2m */
- struct list_head pages;
-
- /* Functions to call to get or free pages for the p2m */
- struct page_info * (*alloc_page )(struct domain *d);
- void (*free_page )(struct domain *d,
- struct page_info *pg);
-
- /* Highest guest frame that's ever been mapped in the p2m */
- unsigned long max_mapped_pfn;
-};
-
-/************************************************/
/* common paging data structure */
/************************************************/
struct log_dirty_domain {
@@ -208,6 +187,8 @@ struct paging_vcpu {
struct shadow_vcpu shadow;
};
+struct p2m_domain;
+
struct arch_domain
{
l1_pgentry_t *mm_perdomain_pt;
@@ -228,11 +209,12 @@ struct arch_domain
/* I/O-port admin-specified access capabilities. */
struct rangeset *ioport_caps;
+ uint32_t pci_cf8;
struct hvm_domain hvm_domain;
struct paging_domain paging;
- struct p2m_domain p2m ;
+ struct p2m_domain *p2m;
/* Shadow translated domain: P2M mapping */
pagetable_t phys_table;
diff --git a/xen/include/asm-x86/hvm/domain.h b/xen/include/asm-x86/hvm/domain.h
index 1361806574..0c23c7d949 100644
--- a/xen/include/asm-x86/hvm/domain.h
+++ b/xen/include/asm-x86/hvm/domain.h
@@ -28,6 +28,8 @@
#include <asm/hvm/vioapic.h>
#include <asm/hvm/io.h>
#include <xen/hvm/iommu.h>
+#include <asm/hvm/vmx/vmcs.h>
+#include <asm/hvm/svm/vmcb.h>
#include <public/hvm/params.h>
#include <public/hvm/save.h>
@@ -60,8 +62,6 @@ struct hvm_domain {
uint64_t params[HVM_NR_PARAMS];
- unsigned long vmx_apic_access_mfn;
-
/* Memory ranges with pinned cache attributes. */
struct list_head pinned_cacheattr_ranges;
@@ -74,11 +74,13 @@ struct hvm_domain {
/* Pass-through */
struct hvm_iommu hvm_iommu;
-#if CONFIG_PAGING_LEVELS == 3
- bool_t amd_npt_4gb_warning;
-#endif
bool_t hap_enabled;
bool_t qemu_mapcache_invalidate;
+
+ union {
+ struct vmx_domain vmx;
+ struct svm_domain svm;
+ };
};
#endif /* __ASM_X86_HVM_DOMAIN_H__ */
diff --git a/xen/include/asm-x86/hvm/hvm.h b/xen/include/asm-x86/hvm/hvm.h
index fe58567263..aee2b150ae 100644
--- a/xen/include/asm-x86/hvm/hvm.h
+++ b/xen/include/asm-x86/hvm/hvm.h
@@ -138,7 +138,7 @@ void hvm_domain_destroy(struct domain *d);
int hvm_vcpu_initialise(struct vcpu *v);
void hvm_vcpu_destroy(struct vcpu *v);
-void hvm_vcpu_reset(struct vcpu *vcpu);
+void hvm_vcpu_down(struct vcpu *v);
void hvm_send_assist_req(struct vcpu *v);
@@ -224,8 +224,6 @@ hvm_inject_exception(unsigned int trapnr, int errcode, unsigned long cr2)
hvm_funcs.inject_exception(trapnr, errcode, cr2);
}
-int hvm_bringup_ap(int vcpuid, int trampoline_vector);
-
static inline int hvm_event_pending(struct vcpu *v)
{
return hvm_funcs.event_pending(v);
diff --git a/xen/include/asm-x86/hvm/io.h b/xen/include/asm-x86/hvm/io.h
index 9ef4f645a1..249fd2bcc3 100644
--- a/xen/include/asm-x86/hvm/io.h
+++ b/xen/include/asm-x86/hvm/io.h
@@ -30,13 +30,14 @@
#define HVM_PORTIO 0
#define HVM_BUFFERED_IO 2
-typedef unsigned long (*hvm_mmio_read_t)(struct vcpu *v,
- unsigned long addr,
- unsigned long length);
-typedef void (*hvm_mmio_write_t)(struct vcpu *v,
+typedef int (*hvm_mmio_read_t)(struct vcpu *v,
unsigned long addr,
unsigned long length,
- unsigned long val);
+ unsigned long *val);
+typedef int (*hvm_mmio_write_t)(struct vcpu *v,
+ unsigned long addr,
+ unsigned long length,
+ unsigned long val);
typedef int (*hvm_mmio_check_t)(struct vcpu *v, unsigned long addr);
typedef int (*portio_action_t)(
@@ -64,7 +65,7 @@ struct hvm_mmio_handler {
};
int hvm_io_intercept(ioreq_t *p, int type);
-int register_io_handler(
+void register_io_handler(
struct domain *d, unsigned long addr, unsigned long size,
void *action, int type);
@@ -81,18 +82,18 @@ static inline int hvm_buffered_io_intercept(ioreq_t *p)
int hvm_mmio_intercept(ioreq_t *p);
int hvm_buffered_io_send(ioreq_t *p);
-static inline int register_portio_handler(
+static inline void register_portio_handler(
struct domain *d, unsigned long addr,
unsigned long size, portio_action_t action)
{
- return register_io_handler(d, addr, size, action, HVM_PORTIO);
+ register_io_handler(d, addr, size, action, HVM_PORTIO);
}
-static inline int register_buffered_io_handler(
+static inline void register_buffered_io_handler(
struct domain *d, unsigned long addr,
unsigned long size, mmio_action_t action)
{
- return register_io_handler(d, addr, size, action, HVM_BUFFERED_IO);
+ register_io_handler(d, addr, size, action, HVM_BUFFERED_IO);
}
void send_timeoffset_req(unsigned long timeoff);
diff --git a/xen/include/asm-x86/hvm/svm/amd-iommu-proto.h b/xen/include/asm-x86/hvm/svm/amd-iommu-proto.h
index 8899f27a73..d64913ce58 100644
--- a/xen/include/asm-x86/hvm/svm/amd-iommu-proto.h
+++ b/xen/include/asm-x86/hvm/svm/amd-iommu-proto.h
@@ -57,6 +57,7 @@ int amd_iommu_unmap_page(struct domain *d, unsigned long gfn);
void *amd_iommu_get_vptr_from_page_table_entry(u32 *entry);
int amd_iommu_reserve_domain_unity_map(struct domain *domain,
unsigned long phys_addr, unsigned long size, int iw, int ir);
+int amd_iommu_sync_p2m(struct domain *d);
/* device table functions */
void amd_iommu_set_dev_table_entry(u32 *dte, u64 root_ptr,
diff --git a/xen/include/asm-x86/hvm/svm/vmcb.h b/xen/include/asm-x86/hvm/svm/vmcb.h
index 04fd5e0f12..55e98afabd 100644
--- a/xen/include/asm-x86/hvm/svm/vmcb.h
+++ b/xen/include/asm-x86/hvm/svm/vmcb.h
@@ -444,6 +444,12 @@ struct vmcb_struct {
u64 res16[301];
} __attribute__ ((packed));
+struct svm_domain {
+#if CONFIG_PAGING_LEVELS == 3
+ bool_t npt_4gb_warning;
+#endif
+};
+
struct arch_svm_struct {
struct vmcb_struct *vmcb;
u64 vmcb_pa;
diff --git a/xen/include/asm-x86/hvm/vcpu.h b/xen/include/asm-x86/hvm/vcpu.h
index d3281d20dc..c4592d9c1e 100644
--- a/xen/include/asm-x86/hvm/vcpu.h
+++ b/xen/include/asm-x86/hvm/vcpu.h
@@ -26,9 +26,6 @@
#include <asm/hvm/svm/vmcb.h>
#include <asm/mtrr.h>
-#define HVM_VCPU_INIT_SIPI_SIPI_STATE_NORM 0
-#define HVM_VCPU_INIT_SIPI_SIPI_STATE_WAIT_SIPI 1
-
enum hvm_io_state {
HVMIO_none = 0,
HVMIO_dispatched,
@@ -58,9 +55,6 @@ struct hvm_vcpu {
spinlock_t tm_lock;
struct list_head tm_list;
- /* For AP startup */
- unsigned long init_sipi_sipi_state;
-
int xen_port;
bool_t flag_dr_dirty;
diff --git a/xen/include/asm-x86/hvm/vlapic.h b/xen/include/asm-x86/hvm/vlapic.h
index 163dcdfcc6..cc8a70608d 100644
--- a/xen/include/asm-x86/hvm/vlapic.h
+++ b/xen/include/asm-x86/hvm/vlapic.h
@@ -21,6 +21,7 @@
#ifndef __ASM_X86_HVM_VLAPIC_H__
#define __ASM_X86_HVM_VLAPIC_H__
+#include <xen/softirq.h>
#include <asm/msr.h>
#include <public/hvm/ioreq.h>
#include <asm/hvm/vpt.h>
@@ -58,6 +59,7 @@ struct vlapic {
struct periodic_time pt;
s_time_t timer_last_update;
struct page_info *regs_page;
+ struct tasklet init_tasklet;
};
static inline uint32_t vlapic_get_reg(struct vlapic *vlapic, uint32_t reg)
diff --git a/xen/include/asm-x86/hvm/vmx/vmcs.h b/xen/include/asm-x86/hvm/vmx/vmcs.h
index 9ce2d2a38b..4ac9b43e4f 100644
--- a/xen/include/asm-x86/hvm/vmx/vmcs.h
+++ b/xen/include/asm-x86/hvm/vmx/vmcs.h
@@ -53,6 +53,23 @@ struct vmx_msr_state {
unsigned long msrs[VMX_MSR_COUNT];
};
+#define EPT_DEFAULT_MT 6
+#define EPT_DEFAULT_GAW 3
+
+struct vmx_domain {
+ unsigned long apic_access_mfn;
+ unsigned long vpid_base;
+ union {
+ struct {
+ u64 etmt :3,
+ gaw :3,
+ rsvd :6,
+ asr :52;
+ };
+ u64 eptp;
+ } ept_control;
+};
+
struct arch_vmx_struct {
/* Virtual address of VMCS. */
struct vmcs_struct *vmcs;
@@ -71,6 +88,9 @@ struct arch_vmx_struct {
/* Cache of cpu execution control. */
u32 exec_control;
+ u32 secondary_exec_control;
+
+ u16 vpid;
/* PMU */
struct vpmu_struct vpmu;
@@ -108,6 +128,8 @@ void vmx_vmcs_exit(struct vcpu *v);
#define CPU_BASED_MWAIT_EXITING 0x00000400
#define CPU_BASED_RDPMC_EXITING 0x00000800
#define CPU_BASED_RDTSC_EXITING 0x00001000
+#define CPU_BASED_CR3_LOAD_EXITING 0x00008000
+#define CPU_BASED_CR3_STORE_EXITING 0x00010000
#define CPU_BASED_CR8_LOAD_EXITING 0x00080000
#define CPU_BASED_CR8_STORE_EXITING 0x00100000
#define CPU_BASED_TPR_SHADOW 0x00200000
@@ -136,6 +158,8 @@ extern u32 vmx_vmexit_control;
extern u32 vmx_vmentry_control;
#define SECONDARY_EXEC_VIRTUALIZE_APIC_ACCESSES 0x00000001
+#define SECONDARY_EXEC_ENABLE_EPT 0x00000002
+#define SECONDARY_EXEC_ENABLE_VPID 0x00000020
#define SECONDARY_EXEC_WBINVD_EXITING 0x00000040
extern u32 vmx_secondary_exec_control;
@@ -151,6 +175,12 @@ extern bool_t cpu_has_vmx_ins_outs_instr_info;
(vmx_pin_based_exec_control & PIN_BASED_VIRTUAL_NMIS)
#define cpu_has_vmx_msr_bitmap \
(vmx_cpu_based_exec_control & CPU_BASED_ACTIVATE_MSR_BITMAP)
+#define cpu_has_vmx_secondary_exec_control \
+ (vmx_cpu_based_exec_control & CPU_BASED_ACTIVATE_SECONDARY_CONTROLS)
+#define cpu_has_vmx_ept \
+ (vmx_secondary_exec_control & SECONDARY_EXEC_ENABLE_EPT)
+#define cpu_has_vmx_vpid \
+ (vmx_secondary_exec_control & SECONDARY_EXEC_ENABLE_VPID)
/* GUEST_INTERRUPTIBILITY_INFO flags. */
#define VMX_INTR_SHADOW_STI 0x00000001
@@ -160,6 +190,7 @@ extern bool_t cpu_has_vmx_ins_outs_instr_info;
/* VMCS field encodings. */
enum vmcs_field {
+ VIRTUAL_PROCESSOR_ID = 0x00000000,
GUEST_ES_SELECTOR = 0x00000800,
GUEST_CS_SELECTOR = 0x00000802,
GUEST_SS_SELECTOR = 0x00000804,
@@ -192,11 +223,23 @@ enum vmcs_field {
VIRTUAL_APIC_PAGE_ADDR = 0x00002012,
VIRTUAL_APIC_PAGE_ADDR_HIGH = 0x00002013,
APIC_ACCESS_ADDR = 0x00002014,
- APIC_ACCESS_ADDR_HIGH = 0x00002015,
+ APIC_ACCESS_ADDR_HIGH = 0x00002015,
+ EPT_POINTER = 0x0000201a,
+ EPT_POINTER_HIGH = 0x0000201b,
+ GUEST_PHYSICAL_ADDRESS = 0x00002400,
+ GUEST_PHYSICAL_ADDRESS_HIGH = 0x00002401,
VMCS_LINK_POINTER = 0x00002800,
VMCS_LINK_POINTER_HIGH = 0x00002801,
GUEST_IA32_DEBUGCTL = 0x00002802,
GUEST_IA32_DEBUGCTL_HIGH = 0x00002803,
+ GUEST_PDPTR0 = 0x0000280a,
+ GUEST_PDPTR0_HIGH = 0x0000280b,
+ GUEST_PDPTR1 = 0x0000280c,
+ GUEST_PDPTR1_HIGH = 0x0000280d,
+ GUEST_PDPTR2 = 0x0000280e,
+ GUEST_PDPTR2_HIGH = 0x0000280f,
+ GUEST_PDPTR3 = 0x00002810,
+ GUEST_PDPTR3_HIGH = 0x00002811,
PIN_BASED_VM_EXEC_CONTROL = 0x00004000,
CPU_BASED_VM_EXEC_CONTROL = 0x00004002,
EXCEPTION_BITMAP = 0x00004004,
@@ -287,6 +330,8 @@ enum vmcs_field {
HOST_RIP = 0x00006c16,
};
+#define VMCS_VPID_WIDTH 16
+
void vmx_disable_intercept_for_msr(struct vcpu *v, u32 msr);
int vmx_read_guest_msr(struct vcpu *v, u32 msr, u64 *val);
int vmx_write_guest_msr(struct vcpu *v, u32 msr, u64 val);
diff --git a/xen/include/asm-x86/hvm/vmx/vmx.h b/xen/include/asm-x86/hvm/vmx/vmx.h
index 1d2f37d4d1..c94549caec 100644
--- a/xen/include/asm-x86/hvm/vmx/vmx.h
+++ b/xen/include/asm-x86/hvm/vmx/vmx.h
@@ -23,9 +23,27 @@
#include <asm/types.h>
#include <asm/regs.h>
#include <asm/processor.h>
-#include <asm/hvm/vmx/vmcs.h>
#include <asm/i387.h>
+#include <asm/hvm/support.h>
#include <asm/hvm/trace.h>
+#include <asm/hvm/vmx/vmcs.h>
+
+typedef union {
+ struct {
+ u64 r : 1,
+ w : 1,
+ x : 1,
+ emt : 4,
+ sp_avail : 1,
+ avail1 : 4,
+ mfn : 45,
+ rsvd : 5,
+ avail2 : 2;
+ };
+ u64 epte;
+} ept_entry_t;
+
+#define EPT_TABLE_ORDER 9
void vmx_asm_vmexit_handler(struct cpu_user_regs);
void vmx_asm_do_vmentry(void);
@@ -80,6 +98,8 @@ void vmx_realmode(struct cpu_user_regs *regs);
#define EXIT_REASON_MACHINE_CHECK 41
#define EXIT_REASON_TPR_BELOW_THRESHOLD 43
#define EXIT_REASON_APIC_ACCESS 44
+#define EXIT_REASON_EPT_VIOLATION 48
+#define EXIT_REASON_EPT_MISCONFIG 49
#define EXIT_REASON_WBINVD 54
/*
@@ -143,12 +163,15 @@ void vmx_realmode(struct cpu_user_regs *regs);
#define VMREAD_OPCODE ".byte 0x0f,0x78\n"
#define VMRESUME_OPCODE ".byte 0x0f,0x01,0xc3\n"
#define VMWRITE_OPCODE ".byte 0x0f,0x79\n"
+#define INVEPT_OPCODE ".byte 0x66,0x0f,0x38,0x80\n" /* m128,r64/32 */
+#define INVVPID_OPCODE ".byte 0x66,0x0f,0x38,0x81\n" /* m128,r64/32 */
#define VMXOFF_OPCODE ".byte 0x0f,0x01,0xc4\n"
#define VMXON_OPCODE ".byte 0xf3,0x0f,0xc7\n"
+#define MODRM_EAX_08 ".byte 0x08\n" /* ECX, [EAX] */
#define MODRM_EAX_06 ".byte 0x30\n" /* [EAX], with reg/opcode: /6 */
#define MODRM_EAX_07 ".byte 0x38\n" /* [EAX], with reg/opcode: /7 */
-#define MODRM_EAX_ECX ".byte 0xc1\n" /* [EAX], [ECX] */
+#define MODRM_EAX_ECX ".byte 0xc1\n" /* EAX, ECX */
static inline void __vmptrld(u64 addr)
{
@@ -232,6 +255,60 @@ static inline void __vm_clear_bit(unsigned long field, unsigned int bit)
__vmwrite(field, __vmread(field) & ~(1UL << bit));
}
+static inline void __invept(int ext, u64 eptp, u64 gpa)
+{
+ struct {
+ u64 eptp, gpa;
+ } operand = {eptp, gpa};
+
+ asm volatile ( INVEPT_OPCODE
+ MODRM_EAX_08
+ /* CF==1 or ZF==1 --> rc = -1 */
+ "ja 1f ; ud2 ; 1:\n"
+ :
+ : "a" (&operand), "c" (ext)
+ : "memory" );
+}
+
+static inline void __invvpid(int ext, u16 vpid, u64 gva)
+{
+ struct {
+ u64 vpid:16;
+ u64 rsvd:48;
+ u64 gva;
+ } __attribute__ ((packed)) operand = {vpid, 0, gva};
+
+ asm volatile ( INVVPID_OPCODE
+ MODRM_EAX_08
+ /* CF==1 or ZF==1 --> rc = -1 */
+ "ja 1f ; ud2 ; 1:\n"
+ :
+ : "a" (&operand), "c" (ext)
+ : "memory" );
+}
+
+static inline void ept_sync_all(void)
+{
+ if ( !current->domain->arch.hvm_domain.hap_enabled )
+ return;
+
+ __invept(2, 0, 0);
+}
+
+void ept_sync_domain(struct domain *d);
+
+static inline void vpid_sync_vcpu_all(struct vcpu *v)
+{
+ if ( cpu_has_vmx_vpid )
+ __invvpid(1, v->arch.hvm_vmx.vpid, 0);
+}
+
+static inline void vpid_sync_all(void)
+{
+ if ( cpu_has_vmx_vpid )
+ __invvpid(2, 0, 0);
+}
+
static inline void __vmxoff(void)
{
asm volatile (
@@ -265,4 +342,49 @@ void vmx_inject_hw_exception(struct vcpu *v, int trap, int error_code);
void vmx_inject_extint(struct vcpu *v, int trap);
void vmx_inject_nmi(struct vcpu *v);
+void ept_p2m_init(struct domain *d);
+
+/* EPT violation qualifications definitions */
+/* bit offset 0 in exit qualification */
+#define _EPT_READ_VIOLATION 0
+#define EPT_READ_VIOLATION (1UL<<_EPT_READ_VIOLATION)
+/* bit offset 1 in exit qualification */
+#define _EPT_WRITE_VIOLATION 1
+#define EPT_WRITE_VIOLATION (1UL<<_EPT_WRITE_VIOLATION)
+/* bit offset 2 in exit qualification */
+#define _EPT_EXEC_VIOLATION 2
+#define EPT_EXEC_VIOLATION (1UL<<_EPT_EXEC_VIOLATION)
+
+/* bit offset 3 in exit qualification */
+#define _EPT_EFFECTIVE_READ 3
+#define EPT_EFFECTIVE_READ (1UL<<_EPT_EFFECTIVE_READ)
+/* bit offset 4 in exit qualification */
+#define _EPT_EFFECTIVE_WRITE 4
+#define EPT_EFFECTIVE_WRITE (1UL<<_EPT_EFFECTIVE_WRITE)
+/* bit offset 5 in exit qualification */
+#define _EPT_EFFECTIVE_EXEC 5
+#define EPT_EFFECTIVE_EXEC (1UL<<_EPT_EFFECTIVE_EXEC)
+
+/* bit offset 6 in exit qualification */
+#define _EPT_GAW_VIOLATION 6
+#define EPT_GAW_VIOLATION (1UL<<_EPT_GAW_VIOLATION)
+
+/* bits offset 7 & 8 in exit qualification */
+#define _EPT_GLA_VALIDITY 7
+#define EPT_GLA_VALIDITY_MASK (3UL<<_EPT_GLA_VALIDITY)
+/* gla != gpa, when load PDPTR */
+#define EPT_GLA_VALIDITY_PDPTR_LOAD (0UL<<_EPT_GLA_VALIDITY)
+/* gla != gpa, during guest page table walking */
+#define EPT_GLA_VALIDITY_GPT_WALK (1UL<<_EPT_GLA_VALIDITY)
+/* reserved */
+#define EPT_GLA_VALIDITY_RSVD (2UL<<_EPT_GLA_VALIDITY)
+/* gla == gpa, normal case */
+#define EPT_GLA_VALIDITY_MATCH (3UL<<_EPT_GLA_VALIDITY)
+
+#define EPT_EFFECTIVE_MASK (EPT_EFFECTIVE_READ | \
+ EPT_EFFECTIVE_WRITE | \
+ EPT_EFFECTIVE_EXEC)
+
+#define EPT_PAGETABLE_ENTRIES 512
+
#endif /* __ASM_X86_HVM_VMX_VMX_H__ */
diff --git a/xen/include/asm-x86/mm.h b/xen/include/asm-x86/mm.h
index 7826db4feb..f4fdad1327 100644
--- a/xen/include/asm-x86/mm.h
+++ b/xen/include/asm-x86/mm.h
@@ -69,8 +69,7 @@ struct page_info
#define PGT_l2_page_table (2U<<29) /* using this page as an L2 page table? */
#define PGT_l3_page_table (3U<<29) /* using this page as an L3 page table? */
#define PGT_l4_page_table (4U<<29) /* using this page as an L4 page table? */
-#define PGT_gdt_page (5U<<29) /* using this page in a GDT? */
-#define PGT_ldt_page (6U<<29) /* using this page in an LDT? */
+#define PGT_seg_desc_page (5U<<29) /* using this page in a GDT/LDT? */
#define PGT_writable_page (7U<<29) /* has writable mappings of this page? */
#define PGT_type_mask (7U<<29) /* Bits 29-31. */
diff --git a/xen/include/asm-x86/numa.h b/xen/include/asm-x86/numa.h
index 90233e07b9..cbf91e8621 100644
--- a/xen/include/asm-x86/numa.h
+++ b/xen/include/asm-x86/numa.h
@@ -73,6 +73,5 @@ static inline __attribute__((pure)) int phys_to_nid(paddr_t addr)
#define clear_node_cpumask(cpu) do {} while (0)
#endif
-#define NUMA_NO_NODE 0xff
#endif
diff --git a/xen/include/asm-x86/p2m.h b/xen/include/asm-x86/p2m.h
index 38a9cec7bd..cb5c882b03 100644
--- a/xen/include/asm-x86/p2m.h
+++ b/xen/include/asm-x86/p2m.h
@@ -26,6 +26,8 @@
#ifndef _XEN_P2M_H
#define _XEN_P2M_H
+#include <xen/config.h>
+#include <xen/paging.h>
/*
* The phys_to_machine_mapping maps guest physical frame numbers
@@ -86,54 +88,52 @@ typedef enum {
#define p2m_is_readonly(_t) (p2m_to_mask(_t) & P2M_RO_TYPES)
#define p2m_is_valid(_t) (p2m_to_mask(_t) & (P2M_RAM_TYPES | P2M_MMIO_TYPES))
+struct p2m_domain {
+ /* Lock that protects updates to the p2m */
+ spinlock_t lock;
+ int locker; /* processor which holds the lock */
+ const char *locker_function; /* Func that took it */
+
+ /* Pages used to construct the p2m */
+ struct list_head pages;
+
+ /* Functions to call to get or free pages for the p2m */
+ struct page_info * (*alloc_page )(struct domain *d);
+ void (*free_page )(struct domain *d,
+ struct page_info *pg);
+ int (*set_entry )(struct domain *d, unsigned long gfn,
+ mfn_t mfn, p2m_type_t p2mt);
+ mfn_t (*get_entry )(struct domain *d, unsigned long gfn,
+ p2m_type_t *p2mt);
+ mfn_t (*get_entry_current)(unsigned long gfn,
+ p2m_type_t *p2mt);
+ void (*change_entry_type_global)(struct domain *d,
+ p2m_type_t ot,
+ p2m_type_t nt);
+
+ /* Highest guest frame that's ever been mapped in the p2m */
+ unsigned long max_mapped_pfn;
+};
+
/* Extract the type from the PTE flags that store it */
static inline p2m_type_t p2m_flags_to_type(unsigned long flags)
{
/* Type is stored in the "available" bits, 9, 10 and 11 */
return (flags >> 9) & 0x7;
}
-
-/* Read the current domain's p2m table (through the linear mapping). */
+
+/* Read the current domain's p2m table. */
static inline mfn_t gfn_to_mfn_current(unsigned long gfn, p2m_type_t *t)
{
- mfn_t mfn = _mfn(INVALID_MFN);
- p2m_type_t p2mt = p2m_mmio_dm;
- /* XXX This is for compatibility with the old model, where anything not
- * XXX marked as RAM was considered to be emulated MMIO space.
- * XXX Once we start explicitly registering MMIO regions in the p2m
- * XXX we will return p2m_invalid for unmapped gfns */
-
- if ( gfn <= current->domain->arch.p2m.max_mapped_pfn )
- {
- l1_pgentry_t l1e = l1e_empty();
- int ret;
-
- ASSERT(gfn < (RO_MPT_VIRT_END - RO_MPT_VIRT_START)
- / sizeof(l1_pgentry_t));
-
- /* Need to __copy_from_user because the p2m is sparse and this
- * part might not exist */
- ret = __copy_from_user(&l1e,
- &phys_to_machine_mapping[gfn],
- sizeof(l1e));
-
- if ( ret == 0 ) {
- p2mt = p2m_flags_to_type(l1e_get_flags(l1e));
- ASSERT(l1e_get_pfn(l1e) != INVALID_MFN || !p2m_is_ram(p2mt));
- if ( p2m_is_valid(p2mt) )
- mfn = _mfn(l1e_get_pfn(l1e));
- else
- /* XXX see above */
- p2mt = p2m_mmio_dm;
- }
- }
-
- *t = p2mt;
- return mfn;
+ return current->domain->arch.p2m->get_entry_current(gfn, t);
}
/* Read another domain's P2M table, mapping pages as we go */
-mfn_t gfn_to_mfn_foreign(struct domain *d, unsigned long gfn, p2m_type_t *t);
+static inline
+mfn_t gfn_to_mfn_foreign(struct domain *d, unsigned long gfn, p2m_type_t *t)
+{
+ return d->arch.p2m->get_entry(d, gfn, t);
+}
/* General conversion function from gfn to mfn */
#define gfn_to_mfn(d, g, t) _gfn_to_mfn((d), (g), (t))
@@ -149,7 +149,7 @@ static inline mfn_t _gfn_to_mfn(struct domain *d,
}
if ( likely(current->domain == d) )
return gfn_to_mfn_current(gfn, t);
- else
+ else
return gfn_to_mfn_foreign(d, gfn, t);
}
@@ -185,7 +185,7 @@ gl1e_to_ml1e(struct domain *d, l1_pgentry_t l1e)
/* Init the datastructures for later use by the p2m code */
-void p2m_init(struct domain *d);
+int p2m_init(struct domain *d);
/* Allocate a new p2m table for a domain.
*
@@ -199,6 +199,7 @@ int p2m_alloc_table(struct domain *d,
/* Return all the p2m resources to Xen. */
void p2m_teardown(struct domain *d);
+void p2m_final_teardown(struct domain *d);
/* Add a page to a domain's p2m table */
int guest_physmap_add_entry(struct domain *d, unsigned long gfn,
@@ -220,6 +221,7 @@ void guest_physmap_remove_page(struct domain *d, unsigned long gfn,
/* Change types across all p2m entries in a domain */
void p2m_change_type_global(struct domain *d, p2m_type_t ot, p2m_type_t nt);
+void p2m_change_entry_type_global(struct domain *d, p2m_type_t ot, p2m_type_t nt);
/* Compare-exchange the type of a single p2m entry */
p2m_type_t p2m_change_type(struct domain *d, unsigned long gfn,
diff --git a/xen/include/asm-x86/paging.h b/xen/include/asm-x86/paging.h
index 4c7e6f1327..f7512a7b26 100644
--- a/xen/include/asm-x86/paging.h
+++ b/xen/include/asm-x86/paging.h
@@ -183,7 +183,7 @@ void paging_vcpu_init(struct vcpu *v);
/* Set up the paging-assistance-specific parts of a domain struct at
* start of day. Called for every domain from arch_domain_create() */
-void paging_domain_init(struct domain *d);
+int paging_domain_init(struct domain *d);
/* Handler for paging-control ops: operations from user-space to enable
* and disable ephemeral shadow modes (test mode and log-dirty mode) and
diff --git a/xen/include/public/hvm/params.h b/xen/include/public/hvm/params.h
index aad2196db3..f222cbac17 100644
--- a/xen/include/public/hvm/params.h
+++ b/xen/include/public/hvm/params.h
@@ -84,6 +84,12 @@
/* Boolean: Enable virtual HPET (high-precision event timer)? (x86-only) */
#define HVM_PARAM_HPET_ENABLED 11
-#define HVM_NR_PARAMS 12
+/* Identity-map page directory used by Intel EPT when CR0.PG=0. */
+#define HVM_PARAM_IDENT_PT 12
+
+/* Device Model domain, defaults to 0. */
+#define HVM_PARAM_DM_DOMAIN 13
+
+#define HVM_NR_PARAMS 14
#endif /* __XEN_PUBLIC_HVM_PARAMS_H__ */
diff --git a/xen/include/xen/hvm/iommu.h b/xen/include/xen/hvm/iommu.h
index 8b11d44c16..1577ad4255 100644
--- a/xen/include/xen/hvm/iommu.h
+++ b/xen/include/xen/hvm/iommu.h
@@ -38,7 +38,7 @@ struct g2m_ioport {
struct hvm_iommu {
spinlock_t iommu_list_lock; /* protect iommu specific lists */
struct list_head pdev_list; /* direct accessed pci devices */
- struct dma_pte *pgd; /* io page directory root */
+ u64 pgd_maddr; /* io page directory machine address */
spinlock_t mapping_lock; /* io page table lock */
int agaw; /* adjusted guest address width, 0 is level 2 30-bit */
struct list_head g2m_ioport_list; /* guest to machine ioport mapping */
@@ -48,9 +48,10 @@ struct hvm_iommu {
int domain_id;
int paging_mode;
void *root_table;
+ bool_t p2m_synchronized;
/* iommu_ops */
struct iommu_ops *platform_ops;
};
-#endif // __ASM_X86_HVM_IOMMU_H__
+#endif /* __ASM_X86_HVM_IOMMU_H__ */
diff --git a/xen/include/xen/hypercall.h b/xen/include/xen/hypercall.h
index 5313b9a1d8..7d58109ec2 100644
--- a/xen/include/xen/hypercall.h
+++ b/xen/include/xen/hypercall.h
@@ -30,6 +30,7 @@ do_sched_op(
int cmd,
XEN_GUEST_HANDLE(void) arg);
+extern spinlock_t domctl_lock;
extern long
do_domctl(
XEN_GUEST_HANDLE(xen_domctl_t) u_domctl);
diff --git a/xen/include/xen/iommu.h b/xen/include/xen/iommu.h
index 362bffd155..bde167694e 100644
--- a/xen/include/xen/iommu.h
+++ b/xen/include/xen/iommu.h
@@ -67,7 +67,7 @@ struct iommu {
u64 ecap;
spinlock_t lock; /* protect context, domain ids */
spinlock_t register_lock; /* protect iommu register handling */
- struct root_entry *root_entry; /* virtual address */
+ u64 root_maddr; /* root entry machine address */
unsigned int vector;
struct intel_iommu *intel;
};
@@ -85,6 +85,7 @@ int iommu_map_page(struct domain *d, unsigned long gfn, unsigned long mfn);
int iommu_unmap_page(struct domain *d, unsigned long gfn);
void iommu_flush(struct domain *d, unsigned long gfn, u64 *p2m_entry);
void iommu_set_pgd(struct domain *d);
+void iommu_free_pgd(struct domain *d);
void iommu_domain_teardown(struct domain *d);
int hvm_do_IRQ_dpci(struct domain *d, unsigned int irq);
int dpci_ioport_intercept(ioreq_t *p);
@@ -98,6 +99,9 @@ void io_apic_write_remap_rte(unsigned int apic,
struct qi_ctrl *iommu_qi_ctrl(struct iommu *iommu);
struct ir_ctrl *iommu_ir_ctrl(struct iommu *iommu);
struct iommu_flush *iommu_get_flush(struct iommu *iommu);
+void hvm_dpci_isairq_eoi(struct domain *d, unsigned int isairq);
+struct hvm_irq_dpci *domain_get_irq_dpci(struct domain *domain);
+int domain_set_irq_dpci(struct domain *domain, struct hvm_irq_dpci *dpci);
#define PT_IRQ_TIME_OUT MILLISECS(8)
#define VTDPREFIX "[VT-D]"
diff --git a/xen/include/xen/mm.h b/xen/include/xen/mm.h
index 2742563fd8..1341bb0fa0 100644
--- a/xen/include/xen/mm.h
+++ b/xen/include/xen/mm.h
@@ -54,14 +54,11 @@ void free_xenheap_pages(void *v, unsigned int order);
void init_domheap_pages(paddr_t ps, paddr_t pe);
struct page_info *alloc_domheap_pages(
struct domain *d, unsigned int order, unsigned int memflags);
-struct page_info *__alloc_domheap_pages(
- struct domain *d, unsigned int cpu, unsigned int order,
- unsigned int memflags);
void free_domheap_pages(struct page_info *pg, unsigned int order);
unsigned long avail_domheap_pages_region(
unsigned int node, unsigned int min_width, unsigned int max_width);
unsigned long avail_domheap_pages(void);
-#define alloc_domheap_page(d) (alloc_domheap_pages(d,0,0))
+#define alloc_domheap_page(d,f) (alloc_domheap_pages(d,0,f))
#define free_domheap_page(p) (free_domheap_pages(p,0))
void scrub_heap_pages(void);
@@ -75,6 +72,8 @@ int assign_pages(
/* memflags: */
#define _MEMF_no_refcount 0
#define MEMF_no_refcount (1U<<_MEMF_no_refcount)
+#define _MEMF_node 8
+#define MEMF_node(n) ((((n)+1)&0xff)<<_MEMF_node)
#define _MEMF_bits 24
#define MEMF_bits(n) ((n)<<_MEMF_bits)
diff --git a/xen/include/xen/numa.h b/xen/include/xen/numa.h
index 9585fc9c48..80aa3586be 100644
--- a/xen/include/xen/numa.h
+++ b/xen/include/xen/numa.h
@@ -8,6 +8,13 @@
#define NODES_SHIFT 0
#endif
+#define NUMA_NO_NODE 0xFF
+
#define MAX_NUMNODES (1 << NODES_SHIFT)
+#define vcpu_to_node(v) (cpu_to_node((v)->processor))
+
+#define domain_to_node(d) \
+ (((d)->vcpu[0] != NULL) ? vcpu_to_node((d)->vcpu[0]) : NUMA_NO_NODE)
+
#endif /* _XEN_NUMA_H */
diff --git a/xen/include/xen/pci.h b/xen/include/xen/pci.h
new file mode 100644
index 0000000000..2e4d78357c
--- /dev/null
+++ b/xen/include/xen/pci.h
@@ -0,0 +1,29 @@
+/******************************************************************************
+ * pci.h
+ *
+ * PCI access functions.
+ */
+
+#ifndef __XEN_PCI_H__
+#define __XEN_PCI_H__
+
+#include <xen/config.h>
+#include <xen/types.h>
+
+uint8_t pci_conf_read8(
+ unsigned int bus, unsigned int dev, unsigned int func, unsigned int reg);
+uint16_t pci_conf_read16(
+ unsigned int bus, unsigned int dev, unsigned int func, unsigned int reg);
+uint32_t pci_conf_read32(
+ unsigned int bus, unsigned int dev, unsigned int func, unsigned int reg);
+void pci_conf_write8(
+ unsigned int bus, unsigned int dev, unsigned int func, unsigned int reg,
+ uint8_t data);
+void pci_conf_write16(
+ unsigned int bus, unsigned int dev, unsigned int func, unsigned int reg,
+ uint16_t data);
+void pci_conf_write32(
+ unsigned int bus, unsigned int dev, unsigned int func, unsigned int reg,
+ uint32_t data);
+
+#endif /* __XEN_PCI_H__ */
diff --git a/xen/include/xen/sched.h b/xen/include/xen/sched.h
index 777195e448..ff5241a532 100644
--- a/xen/include/xen/sched.h
+++ b/xen/include/xen/sched.h
@@ -25,8 +25,6 @@
DEFINE_XEN_GUEST_HANDLE(vcpu_runstate_info_compat_t);
#endif
-extern unsigned long volatile jiffies;
-
/* A global pointer to the initial domain (DOM0). */
extern struct domain *dom0;
@@ -140,8 +138,9 @@ struct vcpu
};
/* Per-domain lock can be recursively acquired in fault handlers. */
-#define LOCK_BIGLOCK(_d) spin_lock_recursive(&(_d)->big_lock)
-#define UNLOCK_BIGLOCK(_d) spin_unlock_recursive(&(_d)->big_lock)
+#define domain_lock(d) spin_lock_recursive(&(d)->domain_lock)
+#define domain_unlock(d) spin_unlock_recursive(&(d)->domain_lock)
+#define domain_is_locked(d) spin_is_locked(&(d)->domain_lock)
struct domain
{
@@ -149,7 +148,7 @@ struct domain
shared_info_t *shared_info; /* shared data area */
- spinlock_t big_lock;
+ spinlock_t domain_lock;
spinlock_t page_alloc_lock; /* protects all the following fields */
struct list_head page_list; /* linked list, of size tot_pages */
diff --git a/xen/include/xen/softirq.h b/xen/include/xen/softirq.h
index 7734b3374d..0b59f63b22 100644
--- a/xen/include/xen/softirq.h
+++ b/xen/include/xen/softirq.h
@@ -1,24 +1,17 @@
-#ifndef __XEN_SOFTIRQ_H__
+#if !defined(__XEN_SOFTIRQ_H__) && !defined(__ASSEMBLY__)
#define __XEN_SOFTIRQ_H__
-/* Common softirqs come first in the following list. */
-#define TIMER_SOFTIRQ 0
-#define SCHEDULE_SOFTIRQ 1
-#define NEW_TLBFLUSH_CLOCK_PERIOD_SOFTIRQ 2
-#define KEYPRESS_SOFTIRQ 3
-#define NMI_SOFTIRQ 4
-#define PAGE_SCRUB_SOFTIRQ 5
-#define TRACE_SOFTIRQ 6
-#define RCU_SOFTIRQ 7
-#define STOPMACHINE_SOFTIRQ 8
-
-#define NR_COMMON_SOFTIRQS 9
-
-#include <asm/softirq.h>
-
-#define NR_SOFTIRQS (NR_COMMON_SOFTIRQS + NR_ARCH_SOFTIRQS)
-
-#ifndef __ASSEMBLY__
+/* Low-latency softirqs come first in the following list. */
+enum {
+ TIMER_SOFTIRQ = 0,
+ SCHEDULE_SOFTIRQ,
+ NEW_TLBFLUSH_CLOCK_PERIOD_SOFTIRQ,
+ PAGE_SCRUB_SOFTIRQ,
+ RCU_SOFTIRQ,
+ STOPMACHINE_SOFTIRQ,
+ TASKLET_SOFTIRQ,
+ NR_COMMON_SOFTIRQS
+};
#include <xen/config.h>
#include <xen/lib.h>
@@ -26,11 +19,15 @@
#include <asm/bitops.h>
#include <asm/current.h>
#include <asm/hardirq.h>
+#include <asm/softirq.h>
+
+#define NR_SOFTIRQS (NR_COMMON_SOFTIRQS + NR_ARCH_SOFTIRQS)
typedef void (*softirq_handler)(void);
asmlinkage void do_softirq(void);
-extern void open_softirq(int nr, softirq_handler handler);
+void open_softirq(int nr, softirq_handler handler);
+void softirq_init(void);
static inline void cpumask_raise_softirq(cpumask_t mask, unsigned int nr)
{
@@ -56,6 +53,26 @@ static inline void raise_softirq(unsigned int nr)
set_bit(nr, &softirq_pending(smp_processor_id()));
}
-#endif /* __ASSEMBLY__ */
+/*
+ * TASKLETS -- dynamically-allocatable tasks run in softirq context
+ * on at most one CPU at a time.
+ */
+struct tasklet
+{
+ struct list_head list;
+ bool_t is_scheduled;
+ bool_t is_running;
+ bool_t is_dead;
+ void (*func)(unsigned long);
+ unsigned long data;
+};
+
+#define DECLARE_TASKLET(name, func, data) \
+ struct tasklet name = { LIST_HEAD_INIT(name.list), 0, 0, 0, func, data }
+
+void tasklet_schedule(struct tasklet *t);
+void tasklet_kill(struct tasklet *t);
+void tasklet_init(
+ struct tasklet *t, void (*func)(unsigned long), unsigned long data);
#endif /* __XEN_SOFTIRQ_H__ */
diff --git a/xen/include/xen/xencomm.h b/xen/include/xen/xencomm.h
index 9b46c89dbf..f044c74f99 100644
--- a/xen/include/xen/xencomm.h
+++ b/xen/include/xen/xencomm.h
@@ -114,4 +114,12 @@ static inline unsigned long xencomm_inline_addr(const void *handle)
xencomm_copy_from_guest(_d, _s, sizeof(*_d), _off); \
})
+#ifdef CONFIG_XENCOMM_MARK_DIRTY
+extern void xencomm_mark_dirty(unsigned long addr, unsigned int len);
+#else
+static inline void xencomm_mark_dirty(unsigned long addr, unsigned int len)
+{
+}
+#endif
+
#endif /* __XENCOMM_H__ */
diff --git a/xen/xsm/acm/acm_chinesewall_hooks.c b/xen/xsm/acm/acm_chinesewall_hooks.c
index 65e60e7cb4..977c45ff2a 100644
--- a/xen/xsm/acm/acm_chinesewall_hooks.c
+++ b/xen/xsm/acm/acm_chinesewall_hooks.c
@@ -637,8 +637,12 @@ static void chwall_domain_destroy(void *object_ssid, struct domain *d)
static int chwall_is_default_policy(void)
{
- return ( (chwall_bin_pol.max_types == 1 ) &&
- (chwall_bin_pol.max_ssidrefs == 2 ) );
+ static const domaintype_t def_policy[2] = { 0x0, 0x0 };
+ return ( ( chwall_bin_pol.max_types == 1 ) &&
+ ( chwall_bin_pol.max_ssidrefs == 2 ) &&
+ ( memcmp(chwall_bin_pol.ssidrefs,
+ def_policy,
+ sizeof(def_policy)) == 0 ) );
}
diff --git a/xen/xsm/acm/acm_simple_type_enforcement_hooks.c b/xen/xsm/acm/acm_simple_type_enforcement_hooks.c
index 01eae51bb2..2810597c39 100644
--- a/xen/xsm/acm/acm_simple_type_enforcement_hooks.c
+++ b/xen/xsm/acm/acm_simple_type_enforcement_hooks.c
@@ -108,7 +108,7 @@ static int share_common_type(struct domain *subj, struct domain *obj)
int acm_init_ste_policy(void)
{
/* minimal startup policy; policy write-locked already */
- ste_bin_pol.max_types = 1;
+ ste_bin_pol.max_types = 2;
ste_bin_pol.max_ssidrefs = 1 + dom0_ste_ssidref;
ste_bin_pol.ssidrefs =
(domaintype_t *)xmalloc_array(domaintype_t,
@@ -123,7 +123,9 @@ int acm_init_ste_policy(void)
ste_bin_pol.max_ssidrefs);
/* initialize state so that dom0 can start up and communicate with itself */
+ ste_bin_pol.ssidrefs[ste_bin_pol.max_types - 1 ] = 1;
ste_bin_pol.ssidrefs[ste_bin_pol.max_types * dom0_ste_ssidref] = 1;
+ ste_bin_pol.ssidrefs[ste_bin_pol.max_types * dom0_ste_ssidref + 1] = 1;
/* init stats */
atomic_set(&(ste_bin_pol.ec_eval_count), 0);
@@ -868,8 +870,12 @@ ste_authorization(ssidref_t ssidref1, ssidref_t ssidref2)
static int
ste_is_default_policy(void)
{
- return ((ste_bin_pol.max_types == 1) &&
- (ste_bin_pol.max_ssidrefs == 2));
+ const static domaintype_t def_policy[4] = { 0x0, 0x1, 0x1, 0x1};
+ return ((ste_bin_pol.max_types == 2) &&
+ (ste_bin_pol.max_ssidrefs == 2) &&
+ (memcmp(ste_bin_pol.ssidrefs,
+ def_policy,
+ sizeof(def_policy)) == 0));
}
/* now define the hook structure similarly to LSM */